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