# HG changeset patch # User cushon # Date 1536877784 25200 # Node ID e6b524cdcc34925eb6acaf6a148101afc70933e3 # Parent a929ad0569eee8517bf23a9014608866953d2f7c 8193037: package-info annotations are not reported when annotation processing is enabled Reviewed-by: jjg diff -r a929ad0569ee -r e6b524cdcc34 src/jdk.compiler/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java Thu Sep 13 17:11:04 2018 -0700 +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java Thu Sep 13 15:29:44 2018 -0700 @@ -1536,13 +1536,12 @@ JCCompilationUnit topLevel; public void visitTopLevel(JCCompilationUnit node) { if (node.packge != null) { - if (node.packge.package_info != null) { + if (isPkgInfo(node.sourcefile, Kind.SOURCE)) { node.packge.package_info.reset(); } node.packge.reset(); } - boolean isModuleInfo = node.sourcefile.isNameCompatible("module-info", Kind.SOURCE); - if (isModuleInfo) { + if (isModuleInfo(node.sourcefile, Kind.SOURCE)) { node.modle.reset(); node.modle.completer = sym -> modules.enter(List.of(node), node.modle.module_info); node.modle.module_info.reset(); diff -r a929ad0569ee -r e6b524cdcc34 test/langtools/tools/javac/processing/PackageInfo/ClassAnnotations/ClassAnnotations.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/langtools/tools/javac/processing/PackageInfo/ClassAnnotations/ClassAnnotations.java Thu Sep 13 15:29:44 2018 -0700 @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2018, Google Inc. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +/** + * @test + * @bug 8193037 + * @summary ensure annotations on package-infos loaded from the classpath are reported on all + * processing rounds + * @library /tools/javac/lib + * @modules java.compiler jdk.compiler + * @build Processor + * @compile package-info.java + * @compile -processor Processor ClassAnnotations.java + */ +package p; + +public class ClassAnnotations {} diff -r a929ad0569ee -r e6b524cdcc34 test/langtools/tools/javac/processing/PackageInfo/ClassAnnotations/Processor.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/langtools/tools/javac/processing/PackageInfo/ClassAnnotations/Processor.java Thu Sep 13 15:29:44 2018 -0700 @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2018, Google Inc. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +import java.util.Set; +import javax.annotation.processing.RoundEnvironment; +import javax.annotation.processing.SupportedAnnotationTypes; +import javax.lang.model.element.PackageElement; +import javax.lang.model.element.TypeElement; + +@SupportedAnnotationTypes("*") +public class Processor extends JavacTestingAbstractProcessor { + + @Override + public boolean process(Set annotations, RoundEnvironment roundEnv) { + PackageElement p = processingEnv.getElementUtils().getPackageElement("p"); + // Ensure that the annotations on the package-info for p are present during all annotation + // processing rounds. + if (p.getAnnotationMirrors().isEmpty()) { + throw new AssertionError("expected package annotations"); + } + return false; + } +} diff -r a929ad0569ee -r e6b524cdcc34 test/langtools/tools/javac/processing/PackageInfo/ClassAnnotations/package-info.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/langtools/tools/javac/processing/PackageInfo/ClassAnnotations/package-info.java Thu Sep 13 15:29:44 2018 -0700 @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2018, Google Inc. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +@Deprecated +package p; diff -r a929ad0569ee -r e6b524cdcc34 test/langtools/tools/javac/processing/PackageInfo/Overwrite/Overwrite.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/langtools/tools/javac/processing/PackageInfo/Overwrite/Overwrite.java Thu Sep 13 15:29:44 2018 -0700 @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2018, Google Inc. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +/** + * @test + * @bug 8193037 + * @summary ensure package-infos are reset between annotation processing rounds + * @library /tools/javac/lib + * @modules java.compiler jdk.compiler + * @build Processor + * @compile package-info.java + * @compile -processor Processor Overwrite.java + */ +package p; + +public class Overwrite {} diff -r a929ad0569ee -r e6b524cdcc34 test/langtools/tools/javac/processing/PackageInfo/Overwrite/Processor.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/langtools/tools/javac/processing/PackageInfo/Overwrite/Processor.java Thu Sep 13 15:29:44 2018 -0700 @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2018, Google Inc. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +import static java.nio.charset.StandardCharsets.UTF_8; + +import java.io.IOError; +import java.io.IOException; +import java.io.OutputStream; +import java.util.Set; +import javax.annotation.processing.RoundEnvironment; +import javax.annotation.processing.SupportedAnnotationTypes; +import javax.lang.model.element.PackageElement; +import javax.lang.model.element.TypeElement; + +@SupportedAnnotationTypes("*") +public class Processor extends JavacTestingAbstractProcessor { + + boolean first = true; + + @Override + public boolean process(Set annotations, RoundEnvironment roundEnv) { + if (first) { + // Annotations are present on the initial package-info loaded from the classpath. + PackageElement p = processingEnv.getElementUtils().getPackageElement("p"); + if (p.getAnnotationMirrors().isEmpty()) { + throw new AssertionError( + "expected package annotations: " + p.getAnnotationMirrors()); + } + // Overwrite the package-info with a new unannotated package-info. + try (OutputStream os = + processingEnv + .getFiler() + .createSourceFile("p.package-info") + .openOutputStream()) { + os.write("package p;".getBytes(UTF_8)); + } catch (IOException e) { + throw new IOError(e); + } + first = false; + } + // The package-info's symbol should be reset between rounds, and when annotation + // processing is over the package-info should be unannotated. + PackageElement p = processingEnv.getElementUtils().getPackageElement("p"); + if (roundEnv.processingOver()) { + if (!p.getAnnotationMirrors().isEmpty()) { + throw new AssertionError( + "expected no package annotations: " + p.getAnnotationMirrors()); + } + } + return false; + } +} diff -r a929ad0569ee -r e6b524cdcc34 test/langtools/tools/javac/processing/PackageInfo/Overwrite/package-info.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/langtools/tools/javac/processing/PackageInfo/Overwrite/package-info.java Thu Sep 13 15:29:44 2018 -0700 @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2018, Google Inc. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +@Deprecated +package p;