JDK 9 request for specification changes of JDK-8032230: Enhance javax.a.p.RoundEnvironment after repeating annotations
joe darcy
joe.darcy at oracle.com
Tue May 24 16:18:51 UTC 2016
Updated webrev:
http://cr.openjdk.java.net/~darcy/8032230.1/
Now with specialized implementation in javac's implementation of
RoundEnvironment and separate tests of the default methods in the
interface and the javac implementation.
Thanks,
-Joe
On 5/23/2016 11:21 AM, joe darcy wrote:
> Hello,
>
> Please now review a webrev including the specification and some tests:
>
> http://cr.openjdk.java.net/~darcy/8032230.0/
>
> Thanks,
>
> -Joe
>
>
> On 5/18/2016 2:02 PM, joe darcy wrote:
>> Combining suggestions, two methods
>>
>> default Set<? extends Element>
>> getElementsAnnotatedWithAny(TypeElement... annotations)
>>
>> default Set<? extends Element>
>> getElementsAnnotatedWithAny(Set<Class<? extends Annotation>>
>> annotations)
>>
>> No varargs in the second case because of heap pollution with the
>> wildcarded Class type and the inability to use @SafeVarargs on this
>> method since it can be overridden.
>>
>> I'd prefer a set of methods like the above that weren't only tied to
>> repeating annotations since I think there are other use cases where
>> it is helpful to find more than one annotation at a time.
>>
>> Fuller diff below.
>>
>> Thanks,
>>
>> -Joe
>>
>>
>> /**
>> + * Returns the elements annotated with one or more 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 types being requested
>> + * @return the elements annotated with one or more of 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>
>> getElementsAnnotatedWithAny(TypeElement... annotations){
>> + HashSet<Element> result = new HashSet<>();
>> + for (TypeElement annotation : annotations) {
>> + result.addAll(getElementsAnnotatedWith(annotation));
>> + }
>> + return Collections.unmodifiableSet(result);
>> + }
>>
>> + /**
>> + * Returns the elements annotated with one or more 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(Class)} 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 types being requested
>> + * @return the elements annotated with one or more of 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>
>> getElementsAnnotatedWithAny(Set<Class<? extends Annotation>>
>> annotations){
>> + HashSet<Element> result = new HashSet<>();
>> + for (Class<? extends Annotation> annotation : annotations) {
>> + result.addAll(getElementsAnnotatedWith(annotation));
>> + }
>> + return Collections.unmodifiableSet(result);
>> + }
>>
>>
>> On 5/18/2016 1:55 PM, Jonathan Gibbons wrote:
>>> 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