JDK13 annotation processors not run when a supported annotation type specifies a module

Jonathan Gibbons jonathan.gibbons at oracle.com
Thu Jan 16 23:57:08 UTC 2020

Suggestion inline:

-- Jon

On 01/16/2020 03:48 PM, Jeremy Kuhn wrote:
> Hi,
> I've just ran into this issue while testing annotation processors with 
> JDK13. It happens when you specify a @SupportedAnnotationTypes 
> annotation with annotation names prefixed with composite module names 
> like the following:
> @SupportedAnnotationTypes({"com.example.moda/com.example.moda.annotation.SomeAnnotation"})
> public class ModuleAnnotationProcessor extends AbstractProcessor {
>    ...
> }
> This is perfectly valid according to the documentation and was working 
> just fine until JDK13
> "the name of the annotation type can be optionally preceded by a 
> module name followed by a |"/"| character. For example, if a processor 
> supports |"a.B"|, this can include multiple annotation types named 
> |a.B| which reside in different modules. To only support |a.B| in the 
> |Foo| module, instead use |"Foo/a.B"|. If a module name is included, 
> only an annotation in that module is matched. In particular, if a 
> module name is given in an environment where modules are not 
> supported, such as an annotation processing environment configured for 
> a source version 
> <https://docs.oracle.com/en/java/javase/11/docs/api/java.compiler/javax/annotation/processing/ProcessingEnvironment.html#getSourceVersion%28%29> 
> without modules, then the annotation types with a module name do /not/ 
> match." -- 
> https://docs.oracle.com/en/java/javase/11/docs/api/java.compiler/javax/annotation/processing/Processor.html#getSupportedAnnotationTypes() 
> <https://docs.oracle.com/en/java/javase/11/docs/api/java.compiler/javax/annotation/processing/Processor.html#getSupportedAnnotationTypes%28%29>
> I've track down the issue in JavacProcessingEnvironment.java to the 
> following commit: 
> https://hg.openjdk.java.net/jdk/jdk/diff/d84176dd57b0/src/jdk.compiler/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java
> Some checks have been added to make sure supported annotation strings 
> are valid and proper warning reported, unfortunately there's an error 
> in the module's name check:
> private static Pattern importStringToPattern(boolean allowModules, 
> String s, Processor p, Log log, boolean lint) {
>     ....
>     else {
>             String moduleName = s.substring(0, slash);
>             if (!SourceVersion.isIdentifier(moduleName)) {

It looks like this should use isName instead of isIdentifier.

>                 return warnAndNoMatches(s, p, log, lint);
>             }
>     ....
> }
> A module name is not a simple identifier like "moda", 
> "com.example.moda" is also a valid module name as stated in the Java 
> Language Specification (7.7). This results in always returning a no 
> match pattern when such module name is used and the processor 
> basically ignored.
> If we do not prefix the annotation with a module name, so there is a 
> workaround but that doesn't match the API doc.
> Please let me know if I can help!
> Rgs

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.java.net/pipermail/compiler-dev/attachments/20200116/83ce2ed1/attachment-0001.htm>

More information about the compiler-dev mailing list