JDK 9 request for specification changes of JDK-8032230: Enhance javax.a.p.RoundEnvironment after repeating annotations
Jonathan Gibbons
jonathan.gibbons at oracle.com
Wed May 18 20:55:22 UTC 2016
Jan,
You're getting very close to suggesting a method that takes a predicate,
and we could provide a variety of predicates for (anyOf, allOf) x
(Annotation, AnnotationMirror) x (varags, collection)
-- Jon
On 05/18/2016 01:48 PM, Jan Lahoda wrote:
> On 18.5.2016 22:26, joe darcy wrote:
>> Hi Jon,
>>
>> On 5/18/2016 1:05 PM, Jonathan Gibbons wrote:
>>> It's sad to see the preference given to the more intellectually
>>> suspect of the two possibilities.
>>
>> Agreed, sad but pragmatic.
>
> Would it make sense to use varargs instead of a Set? If we assume the
> typical use will be something like:
> round.getElementsAnnotatedWithAny(annotation, containerAnnotation)
>
> it might be more convenient to have the method take a vararg than a
> Set (and would avoid the problem with the erasure clash as another
> benefit).
>
> Jan
>
>>
>>>
>>> It would be nice to see the nice name given to the intellectually
>>> superior of the possibilities (i.e AnnotationMirror) and then figure
>>> out how to deal with the other case.
>>
>> How about the name "getElementsAnnotatedWithAny" for both variations?
>> That potentially avoids confusion over whether or not the elements have
>> to be modified with any of the annotations or all of them.
>>
>>>
>>> As well as the possibility of another method name, have you ever
>>> considered the possibility of conversion functions of
>>> Elements/Types/<something-new> that can convert between (collection
>>> of) Annotation and (collection of) AnnotationMirror?
>>
>> Internally, for the existing methods javac does convert the Class-based
>> version to the TypeElement based version, but I don't think we want the
>> specification to require that.
>>
>> Thanks,
>>
>> -Joe
>>
>>>
>>> -- Jon
>>>
>>> On 05/18/2016 12:55 PM, joe darcy wrote:
>>>> Hello,
>>>>
>>>> Please review the patch below which proposes a new method to address
>>>>
>>>> JDK-8032230: Enhance javax.a.p.RoundEnvironment after repeating
>>>> annotations
>>>>
>>>> At present, this is just a review of the specification of the default
>>>> method in the interface and *not* a more optimized implementation in
>>>> the javac RoundEnvironemnt implementation (and not any tests that
>>>> would be needed for the new functionality).
>>>>
>>>> Note that the bug proposes adding two methods
>>>>
>>>> RoundEnvironment.getElementsAnnotatedWith(Set<Class<? extends
>>>> Annotation>> s)
>>>> RoundEnvironment.getElementsAnnotatedWith(Set<AnnotationMirror> s)
>>>>
>>>> but these methods would clash since their erasure is the same. *sad
>>>> tromphone*
>>>>
>>>> Therefore, I'm only proposing to add the Class-based variant since
>>>> that one is the more commonly used of the two.
>>>>
>>>> Thanks,
>>>>
>>>> -Joe
>>>>
>>>>
>>>> + /**
>>>> + * Returns the elements annotated with any of the given
>>>> annotation
>>>> + * types.
>>>> + *
>>>> + * @apiNote This method may be useful when processing repeating
>>>> + * annotations by looking for an annotation type and its
>>>> + * containing annotation type at the same time.
>>>> + *
>>>> + * @implSpec The default implementation of this method creates an
>>>> + * empty result set, iterates over the annotations in the
>>>> argument
>>>> + * set calling {@link #getElementsAnnotatedWith(TypeElement)} on
>>>> + * each annotation and adding those results to the result
>>>> + * set. Finally, the contents of the result set are returned
>>>> as an
>>>> + * unmodifiable set.
>>>> + *
>>>> + * @param annotations annotation type being requested
>>>> + * @return the elements annotated with the given annotation
>>>> types,
>>>> + * or an empty set if there are none
>>>> + * @throws IllegalArgumentException if the any elements of the
>>>> + * argument set do not represent an annotation type
>>>> + * @since 9
>>>> + */
>>>> + default Set<? extends Element>
>>>> getElementsAnnotatedWith(Set<Class<? extends Annotation>>
>>>> annotations){
>>>> + HashSet<Element> result = new HashSet<>();
>>>> + for (Class<? extends Annotation> annotation : annotations) {
>>>> + result.addAll(getElementsAnnotatedWith(annotation));
>>>> + }
>>>> + return Collections.unmodifiableSet(result);
>>>> + }
>>>>
>>>
>>
More information about the compiler-dev
mailing list