JDK 9 request for specification changes of JDK-8032230: Enhance javax.a.p.RoundEnvironment after repeating annotations

joe darcy joe.darcy at oracle.com
Mon May 23 18:21:28 UTC 2016


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