Use of an annotation without @Target meta-annotation on a module declaration
Alex Buckley
alex.buckley at oracle.com
Fri Aug 30 01:44:59 UTC 2019
On 8/29/2019 5:35 PM, Werner Dietl wrote:
> Since Java 8, the JavaDoc for java.lang.annotation.Target contains:
>
> "If an @Target meta-annotation is not present on an annotation type T,
> then an annotation of type T may be written as a modifier for any
> declaration except a type parameter declaration."
>
> In Java 9, the additional constant MODULE was added to
> java.lang.annotation.ElementType for module declarations.
>
> Should an annotation without @Target meta-annotation be usable on a
> module declaration or not?
The API spec of j.l.a.Target agrees with JLS 9.6.4.1 which defines the
meaning of @Target when it appears (and when it doesn't) on annotation
type declarations. Without @Target on its declaration, an annotation
type is applicable on module declarations. Below, ecj is right and javac
is wrong.
JSR 308 introduced the "all declaration contexts except type parameter
declarations" rule in an attempt to constrain no- at Target to SE 7
contexts only. As the Java language gets more kinds of declarations --
modules, records, values -- the open-ended wording of the rule ("all")
is at odds with its closed-ended intent. The ongoing maintenance burden
for javac and the API spec and the JLS is unwelcome. Frankly, I think
the SE 7-only intent was misguided; no- at Target should have meant "all
declaration contexts", end of story, no more threads like this ever
again. Any objections to changing the rule in a future SE release?
Alex
> Take a file module-info.java:
>
> @pkg.Anno
> module moduletest {}
>
> and a file pgk/Anno.java:
>
> package pkg;
> public @interface Anno {}
>
> The above specification would seem to allow the use of @Anno on
> moduletest and ecj (tested with version 3.16.0) compiles the test case
> above.
> However, javac version 11.0.1 gives the following error:
>
> module-info.java:1: error: annotation type not applicable to this kind
> of declaration
> @pkg.Anno
> ^
> 1 error
>
> The javac error goes away when adding a @Target(ElementType.MODULE)
> meta-annotation.
>
> Is this a bug in javac or is this a problem with the JavaDoc?
>
> Best,
> cu, WMD.
>
More information about the compiler-dev
mailing list