review request for 8010225 test in typeAnnotations/failures do not test TYPE_USE
Alex Buckley
alex.buckley at oracle.com
Tue Sep 17 14:00:20 PDT 2013
I know what you mean about the way I worded my first sentence. Fair
enough. Still, it's true in SE 7 there was no error about applicability
when an annotation name was unresolvable, and that's the principle we
should follow in 8.
Alex
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.
>
> cu, WMD.
>
> On Sep 17, 2013 1:11 PM, "Alex Buckley" <alex.buckley at oracle.com
> <mailto: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 <mailto: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
> <http://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
>
>
>
>
>
>
>
>
>
More information about the type-annotations-dev
mailing list