review request for 8010225 test in typeAnnotations/failures do not test TYPE_USE

Werner Dietl wdietl at gmail.com
Wed Sep 18 15:59:36 PDT 2013


I pushed a fix:

http://hg.openjdk.java.net/type-annotations/type-annotations/langtools/rev/eb9901286b87

Steve, do you have extended test cases for this?
I adapted two existing test cases to the new behavior.

cu, WMD.


On Tue, Sep 17, 2013 at 5:21 PM, Steve Sides <steve.sides at oracle.com> wrote:
> On 9/17/2013 1:57 PM, Werner Dietl wrote:
>
> Alex,
>
> I think you can't make your conclusion from the SE 7 behavior.
> SE 7 by default allows an annotation in any location. So the applicability
> check would have succeeded for an unknown annotation. The compiler doesn't
> see the FIELD target, because it didn't find the annotation.
>
> I'll look into removing the applicability error for SE 8.
>
> a bug for that: https://bugs.openjdk.java.net/browse/JDK-8024961
>
> -steve
>
> cu, WMD.
>
> On Sep 17, 2013 1:11 PM, "Alex Buckley" <alex.buckley at oracle.com> wrote:
>>
>> There should be no applicability check if the annotation's name can't be
>> resolved. That's how it worked in SE 7 for the old targets:
>>
>> @UniqueInner
>> class Scopes {
>>   @Target(ElementType.FIELD) // Anything but TYPE
>>   @interface UniqueInner {}
>> }
>>
>> gives one error, about not finding the symbol UniqueInner in the
>> annotation.
>>
>> I notice that an annotation on a type parameter declaration is treated
>> like an annotation on a type use; the following code gives two errors (can't
>> resolve + not applicable) but should only give one.
>>
>> class Scopes<@UniqueInner T> {
>>   @interface UniqueInner {}  // Not applicable to type parameter decls
>> }
>>
>> Alex
>>
>> On 9/17/2013 12:24 PM, Werner Dietl wrote:
>>>
>>> Hi Steve,
>>>
>>> thanks for testing these cases!
>>> In your last case:
>>>
>>> @UniqueInner
>>> class Scopes<T extends @UniqueInner Object> {
>>>      @Target(ElementType.TYPE_USE)
>>>      @interface UniqueInner { };
>>> }
>>>
>>> The compiler cannot resolve the annotation on the class declaration
>>> and on Object and we therefore get the first two errors.
>>> Because the compiler cannot resolve the annotation, it doesn't know
>>> that it has meta-annotation TYPE_USE. We therefore get the third
>>> error, because it sees an annotation in a type-use location without
>>> knowing that it has the right meta-annotation.
>>>
>>> Maybe the check for the TYPE_USE target should be ignored if the
>>> annotation can't be resolved?
>>> A declaration annotation is by default valid in all locations, so the
>>> issue doesn't arise for declaration annotations.
>>>
>>> Thoughts?
>>>
>>> cu, WMD.
>>>
>>>
>>> On Tue, Sep 17, 2013 at 12:06 PM, Steve Sides <steve.sides at oracle.com>
>>> wrote:
>>>>
>>>> On 9/16/2013 5:20 PM, Alex Buckley wrote:
>>>>>
>>>>>
>>>>> On 9/16/2013 2:42 PM, Steve Sides wrote:
>>>>>>
>>>>>>
>>>>>> On 9/13/2013 10:42 AM, Alex Buckley wrote:
>>>>>>>
>>>>>>>
>>>>>>> - AnnotationVersion: The @summary is imprecise - the test is about
>>>>>>> the
>>>>>>> receiver parameter 'this', not type annotations in general. In SE 6
>>>>>>> and 7 and 8, the annotation type 'A' with no
>>>>>>
>>>>>>
>>>>>> I'm not so sure I agree with that. Due to the 3 @compile lines, the
>>>>>> test
>>>>>> is about allowing type-annotations only with jdk8. The fact that he
>>>>>> put
>>>>>> the annotation on 'this' appears to me to be incidental.  It may be
>>>>>> odd
>>>>>> that he chose 'this' as opposed to maybe 'String' or some other more
>>>>>> common usage, but it does seem to be just a usage to make the general
>>>>>> point and elicit the diagnostic
>>>>>> "compiler.err.type.annotations.not.supported.in.source: 1.7", and not
>>>>>> to
>>>>>> test that specific usage.
>>>>>
>>>>>
>>>>>
>>>>> This test aims to show that "type annotations" didn't exist and now do
>>>>> exist. In other words, that an annotation was not permitted in some
>>>>> type-oriented location in 6/7 but is permitted in that location in 8.
>>>>> It is
>>>>> poor form to choose a location in 8 which didn't exist in 6/7 -
>>>>> especially
>>>>> when that location is frankly very obscure. I would suggest putting the
>>>>> @A
>>>>> on something simple like an 'extends' clause.
>>>>>
>>>>> In addition, ElementType.TYPE_USE didn't exist in 6/7 so a reader might
>>>>> ask why javac doesn't complain about that rather than the syntax error
>>>>> of
>>>>> the 'this' parameter. This is why I also suggested having a companion
>>>>> test
>>>>> where a ElementType from 6/7 was used.
>>>>>
>>>>> Alex
>>>>
>>>>
>>>> Got it. While whittling on this, I have another question about the
>>>> compiler's behavior.
>>>> 1. If I qualify the (not type) annotation,
>>>>
>>>>    @Scopes.UniqueInner
>>>>    class Scopes<T extends @Scopes.UniqueInner Object> {
>>>>       @interface UniqueInner { };
>>>>    }
>>>> I get 1 error, "Scopes.java:11:24:
>>>> compiler.err.annotation.type.not.applicable". This seems correct as I'm
>>>> using an annotation on a type usage, and the one on the class is okay.
>>>>
>>>> 2. If I use the annotation unqualified, I get 3 errors, two for
>>>> "cant.resolve..." and the one above again. I can see that this can also
>>>> be
>>>> correct.
>>>>
>>>> Scopes.java:10:2: compiler.err.cant.resolve: kindname.class,
>>>> UniqueInner, ,
>>>> // on the class
>>>> Scopes.java:11:25: compiler.err.cant.resolve: kindname.class,
>>>> UniqueInner, ,
>>>> // on the bound
>>>> Scopes.java:11:24: compiler.err.annotation.type.not.applicable
>>>> // not a type annotation(I assumed)?
>>>> 3 errors
>>>>
>>>> 3. If I use a qualified type annotation,
>>>> @Scopes.UniqueInner
>>>> class Scopes<T extends @Scopes.UniqueInner Object> {
>>>>      @Target(ElementType.TYPE_USE)
>>>>      @interface UniqueInner { };
>>>> }
>>>> it compiles without error.
>>>>
>>>> 4. However, if I use an unqualified type annotation,
>>>> @UniqueInner
>>>> class Scopes<T extends @UniqueInner Object> {
>>>>      @Target(ElementType.TYPE_USE)
>>>>      @interface UniqueInner { };
>>>> }
>>>>   I get the same 3 errors as the unqualified annotation:
>>>>
>>>> Scopes.java:10:2: compiler.err.cant.resolve: kindname.class,
>>>> UniqueInner, ,
>>>> Scopes.java:11:25: compiler.err.cant.resolve: kindname.class,
>>>> UniqueInner, ,
>>>> Scopes.java:11:24: compiler.err.annotation.type.not.applicable
>>>> 3 errors
>>>>
>>>> Why should I get "compiler.err.annotation.type.not.applicable" in this
>>>> last
>>>> scenario?  For 1. I kind of assumed the third error meant it was not
>>>> applicable because it was not a type annotation.  Is it not applicable
>>>> for
>>>> reasons other than not being TYPE_USE?
>>>>
>>>> I'm thinking of using it as below (and adding a postivie version with
>>>> qualified name),
>>>>
>>>> @UniqueInner
>>>> class Scopes<T extends @UniqueInner Object>  {
>>>>      // Unqualified @UniqueInner is not accessible to the class .
>>>>      // One has to use @Scopes.UniqueInner.
>>>>      @Target(ElementType.TYPE_USE)
>>>>      @interface UniqueInner { };
>>>> }
>>>>
>>>> but I'm unsure about that third error and would like to verify it is as
>>>> expected.
>>>>
>>>> -steve
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>
>>>
>>>
>



-- 
http://www.google.com/profiles/wdietl


More information about the type-annotations-dev mailing list