--- old/src/jdk.compiler/share/classes/com/sun/tools/javac/processing/JavacRoundEnvironment.java 2018-07-24 22:14:12.949000996 -0700 +++ new/src/jdk.compiler/share/classes/com/sun/tools/javac/processing/JavacRoundEnvironment.java 2018-07-24 22:14:12.805000996 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2018, Oracle and/or its affiliates. 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 @@ -170,6 +170,18 @@ e.accept(this, annotation); return annotatedElements; } + + @Override @DefinedBy(Api.LANGUAGE_MODEL) + public Set visitModule(ModuleElement e, TypeElement annotation) { + // Do not scan a module + return annotatedElements; + } + + @Override @DefinedBy(Api.LANGUAGE_MODEL) + public Set visitPackage(PackageElement e, TypeElement annotation) { + // Do not scan a package + return annotatedElements; + } } // Could be written as a local class inside getElementsAnnotatedWithAny @@ -193,6 +205,18 @@ e.accept(this, annotations); return annotatedElements; } + + @Override @DefinedBy(Api.LANGUAGE_MODEL) + public Set visitModule(ModuleElement e, Set annotations) { + // Do not scan a module + return annotatedElements; + } + + @Override @DefinedBy(Api.LANGUAGE_MODEL) + public Set visitPackage(PackageElement e, Set annotations) { + // Do not scan a package + return annotatedElements; + } } private static abstract class ElementScanningIncludingTypeParameters @@ -224,10 +248,12 @@ public Set getElementsAnnotatedWith(Class a) { throwIfNotAnnotation(a); String name = a.getCanonicalName(); + if (name == null) return Collections.emptySet(); else { - TypeElement annotationType = eltUtils.getTypeElement(name); + TypeElement annotationType = annotationToElement(a); + if (annotationType == null) return Collections.emptySet(); else @@ -244,12 +270,29 @@ String name = annotation.getCanonicalName(); if (name == null) continue; - annotationsAsElements.add(eltUtils.getTypeElement(name)); + annotationsAsElements.add(annotationToElement(annotation)); } return getElementsAnnotatedWithAny(annotationsAsElements.toArray(new TypeElement[0])); } + private TypeElement annotationToElement(Class annotation) { + // First, try an element lookup based on the annotation's + // canonical name. If that fails or is ambiguous, try a lookup + // using a particular module, perhaps an unnamed one. This + // offers more compatibility for compiling in single-module + // mode where the runtime module of an annotation type may + // differ from the single module being compiled. + String name = annotation.getCanonicalName(); + TypeElement annotationElement = eltUtils.getTypeElement(name); + if (annotationElement != null) + return annotationElement; + else { + String moduleName = Objects.requireNonNullElse(annotation.getModule().getName(), ""); + return eltUtils.getTypeElement(eltUtils.getModuleElement(moduleName), name); + } + } + private Element mirrorAsElement(AnnotationMirror annotationMirror) { return annotationMirror.getAnnotationType().asElement(); } --- old/test/langtools/tools/javac/processing/environment/round/BuriedAnnotations.java 2018-07-24 22:14:13.337000996 -0700 +++ new/test/langtools/tools/javac/processing/environment/round/BuriedAnnotations.java 2018-07-24 22:14:13.189000996 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2018, Oracle and/or its affiliates. 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 @@ -21,12 +21,14 @@ * questions. */ +import annot.AnnotatedElementInfo; + /** * Class to hold annotations for TestElementsAnnotatedWith. */ @AnnotatedElementInfo(annotationName="java.lang.SuppressWarnings", - expectedSize=4, + expectedSize=4, names={"foo", "bar", ""}) --- old/test/langtools/tools/javac/processing/environment/round/C2.java 2018-07-24 22:14:13.725000996 -0700 +++ new/test/langtools/tools/javac/processing/environment/round/C2.java 2018-07-24 22:14:13.561000996 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2018, Oracle and/or its affiliates. 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 @@ -21,6 +21,8 @@ * questions. */ +import annot.AnnotatedElementInfo; + @AnnotatedElementInfo(annotationName="InheritedAnnotation", expectedSize=1, names="C2") --- old/test/langtools/tools/javac/processing/environment/round/ErroneousAnnotations.java 2018-07-24 22:14:14.121000996 -0700 +++ new/test/langtools/tools/javac/processing/environment/round/ErroneousAnnotations.java 2018-07-24 22:14:13.965000996 -0700 @@ -2,6 +2,8 @@ * Class to hold annotations for TestElementsAnnotatedWith. */ +import annot.AnnotatedElementInfo; + @AnnotatedElementInfo(annotationName="java.lang.SuppressWarnings", expectedSize=0, names={}) --- old/test/langtools/tools/javac/processing/environment/round/ErroneousAnnotations.out 2018-07-24 22:14:14.489000996 -0700 +++ new/test/langtools/tools/javac/processing/environment/round/ErroneousAnnotations.out 2018-07-24 22:14:14.337000996 -0700 @@ -1,3 +1,3 @@ -ErroneousAnnotations.java:8:2: compiler.err.cant.resolve: kindname.class, Undefined, , -ErroneousAnnotations.java:10:6: compiler.err.cant.resolve.location: kindname.class, Undefined, , , (compiler.misc.location: kindname.class, ErroneousAnnotations, null) +ErroneousAnnotations.java:10:2: compiler.err.cant.resolve: kindname.class, Undefined, , +ErroneousAnnotations.java:12:6: compiler.err.cant.resolve.location: kindname.class, Undefined, , , (compiler.misc.location: kindname.class, ErroneousAnnotations, null) 2 errors --- old/test/langtools/tools/javac/processing/environment/round/Foo.java 2018-07-24 22:14:14.853000996 -0700 +++ new/test/langtools/tools/javac/processing/environment/round/Foo.java 2018-07-24 22:14:14.709000996 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2018, Oracle and/or its affiliates. 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 @@ -21,7 +21,9 @@ * questions. */ -@AnnotatedElementInfo(annotationName="AnnotatedElementInfo", +import annot.AnnotatedElementInfo; + +@AnnotatedElementInfo(annotationName="annot.AnnotatedElementInfo", expectedSize=1, names="Foo") public class Foo {} --- old/test/langtools/tools/javac/processing/environment/round/ParameterAnnotations.java 2018-07-24 22:14:15.253000996 -0700 +++ new/test/langtools/tools/javac/processing/environment/round/ParameterAnnotations.java 2018-07-24 22:14:15.101000996 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. 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 @@ -21,6 +21,8 @@ * questions. */ +import annot.AnnotatedElementInfo; + /** * Class to hold annotations for ElementsAnnotatedWithTest. */ --- old/test/langtools/tools/javac/processing/environment/round/Part1.java 2018-07-24 22:14:15.625000996 -0700 +++ new/test/langtools/tools/javac/processing/environment/round/Part1.java 2018-07-24 22:14:15.485000996 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2018, Oracle and/or its affiliates. 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 @@ -21,6 +21,8 @@ * questions. */ +import annot.AnnotatedElementInfo; + /** * Class to hold annotations for TestElementsAnnotatedWith. */ --- old/test/langtools/tools/javac/processing/environment/round/SurfaceAnnotations.java 2018-07-24 22:14:16.025000996 -0700 +++ new/test/langtools/tools/javac/processing/environment/round/SurfaceAnnotations.java 2018-07-24 22:14:15.865000996 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2018, Oracle and/or its affiliates. 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 @@ -21,6 +21,8 @@ * questions. */ +import annot.AnnotatedElementInfo; + /** * Class to hold annotations for TestElementsAnnotatedWith. */ --- old/test/langtools/tools/javac/processing/environment/round/TestElementsAnnotatedWith.java 2018-07-24 22:14:16.429000996 -0700 +++ new/test/langtools/tools/javac/processing/environment/round/TestElementsAnnotatedWith.java 2018-07-24 22:14:16.281000996 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2018, Oracle and/or its affiliates. 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 @@ -23,13 +23,14 @@ /* * @test - * @bug 6397298 6400986 6425592 6449798 6453386 6508401 6498938 6911854 8030049 8038080 8032230 + * @bug 6397298 6400986 6425592 6449798 6453386 6508401 6498938 6911854 8030049 8038080 8032230 8190886 * @summary Tests that getElementsAnnotatedWith works properly. * @author Joseph D. Darcy * @library /tools/javac/lib * @modules java.compiler * jdk.compiler * @build JavacTestingAbstractProcessor + * @compile annot/AnnotatedElementInfo.java annot/MarkerAnnot.java * @compile TestElementsAnnotatedWith.java * @compile InheritedAnnotation.java * @compile TpAnno.java @@ -41,11 +42,21 @@ * @compile -processor TestElementsAnnotatedWith -proc:only Foo.java * @compile -processor TestElementsAnnotatedWith -proc:only TypeParameterAnnotations.java * @compile -processor TestElementsAnnotatedWith -proc:only ParameterAnnotations.java + * @compile -processor TestElementsAnnotatedWith -proc:only pkg/package-info.java + * @compile -processor TestElementsAnnotatedWith -proc:only mod/quux/package-info.java + * @compile -processor TestElementsAnnotatedWith -proc:only mod/quux/Quux.java + * @compile mod/quux/Quux.java mod/quux/package-info.java + * @compile -processor TestElementsAnnotatedWith -proc:only -AsingleModuleMode=true mod/module-info.java * @compile/fail/ref=ErroneousAnnotations.out -processor TestElementsAnnotatedWith -proc:only -XDrawDiagnostics ErroneousAnnotations.java * @compile Foo.java * @compile/process -processor TestElementsAnnotatedWith -proc:only Foo */ +// * @compile mod/quux/package-info.java mod/quux/Quux.java +// * @compile -processor TestElementsAnnotatedWith -proc:only mod/module-info.java + + +import annot.AnnotatedElementInfo; import java.lang.annotation.Annotation; import java.util.Collections; import java.util.Set; @@ -148,8 +159,6 @@ * getElementsAnnotatedWith(X) UNION getElementsAnnotatedWith(Y). */ void checkSetOfAnnotatedElements(RoundEnvironment re) { - TypeElement annotatedElemInfoElem = elements.getTypeElement("AnnotatedElementInfo"); - // For the "Any" methods, search for both the expected // annotation and AnnotatedElementInfo and verify the return // set is the union of searching for AnnotatedElementInfo and @@ -162,28 +171,53 @@ Set resultsBaseAny = Collections.emptySet(); Set resultsBaseAnyMulti = Collections.emptySet(); + + boolean singleModuleMode = processingEnv.getOptions().get("singleModuleMode") != null; + + TypeElement annotatedElemInfoElem = null; + if (!re.processingOver()) { testNonAnnotations(re); // Verify AnnotatedElementInfo is present on the first // specified type. - TypeElement firstType = typesIn(re.getRootElements()).iterator().next(); + Element firstElement = re.getRootElements().iterator().next(); AnnotatedElementInfo annotatedElemInfo = - firstType.getAnnotation(AnnotatedElementInfo.class); + firstElement.getAnnotation(AnnotatedElementInfo.class); + + ModuleElement moduleContext; + // DEBUGGING + if (firstElement.getKind() == ElementKind.MODULE) { + elements.printElements(new java.io.OutputStreamWriter(System.out) , firstElement); + System.out.println("AnnotatedElementInfo module: " + AnnotatedElementInfo.class.getModule()); + + for (AnnotationMirror am : firstElement.getAnnotationMirrors()){ + System.out.print("\t" + am.toString()); + System.out.println("\t in module " + elements.getModuleOf(am.getAnnotationType().asElement()).toString()); + } + moduleContext = (ModuleElement)firstElement; + } else { + moduleContext = elements.getModuleElement(""); // unnamed module + } + + + annotatedElemInfoElem = + elements.getTypeElement(moduleContext, "annot.AnnotatedElementInfo"); boolean failed = false; Objects.requireNonNull(annotatedElemInfo, - "Missing AnnotatedElementInfo annotation on " + firstType); + "Missing AnnotatedElementInfo annotation on " + firstElement); // Verify that the annotation information is as expected. Set expectedNames = new HashSet<>(Arrays.asList(annotatedElemInfo.names())); String annotationName = annotatedElemInfo.annotationName(); - TypeElement annotationTypeElem = elements.getTypeElement(annotationName); + TypeElement annotationTypeElem = elements.getTypeElement(moduleContext, + annotationName); resultsMeta = re.getElementsAnnotatedWith(annotationTypeElem); resultsMetaAny = re.getElementsAnnotatedWithAny(annotationTypeElem); @@ -229,7 +263,7 @@ System.err.printf("Inconsistent Base with vs withAny results"); } - if (!resultsMeta.equals(resultsBase)) { + if (!singleModuleMode && !resultsMeta.equals(resultsBase)) { failed = true; System.err.println("Base and Meta sets unequal;\n meta: " + resultsMeta + "\nbase: " + resultsBase); @@ -241,7 +275,7 @@ "\nbase: " + resultsBase); } - if (!resultsBaseAnyMulti.equals(resultsMetaAnyMulti)) { + if (!singleModuleMode && !resultsBaseAnyMulti.equals(resultsMetaAnyMulti)) { failed = true; System.err.println("BaseMulti and MetaMulti sets unequal;\n meta: " + resultsMeta + "\nbase: " + resultsBase); @@ -255,10 +289,13 @@ // If processing is over without an error, the specified // elements should be empty so an empty set should be // returned. - throwOnNonEmpty(re.getElementsAnnotatedWith(annotatedElemInfoElem), "resultsMeta"); - throwOnNonEmpty(re.getElementsAnnotatedWithAny(annotatedElemInfoElem), "resultsMetaAny"); - throwOnNonEmpty(re.getElementsAnnotatedWith(AnnotatedElementInfo.class), "resultsBase"); - throwOnNonEmpty(re.getElementsAnnotatedWithAny(Set.of(AnnotatedElementInfo.class)), "resultsBaseAny"); + if (!singleModuleMode) { + annotatedElemInfoElem = elements.getTypeElement("AnnotatedElementInfo"); + throwOnNonEmpty(re.getElementsAnnotatedWith(annotatedElemInfoElem), "resultsMeta"); + throwOnNonEmpty(re.getElementsAnnotatedWithAny(annotatedElemInfoElem), "resultsMetaAny"); + throwOnNonEmpty(re.getElementsAnnotatedWith(AnnotatedElementInfo.class), "resultsBase"); + throwOnNonEmpty(re.getElementsAnnotatedWithAny(Set.of(AnnotatedElementInfo.class)), "resultsBaseAny"); + } } } --- old/test/langtools/tools/javac/processing/environment/round/TypeParameterAnnotations.java 2018-07-24 22:14:16.853000996 -0700 +++ new/test/langtools/tools/javac/processing/environment/round/TypeParameterAnnotations.java 2018-07-24 22:14:16.701000996 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. 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 @@ -21,6 +21,8 @@ * questions. */ +import annot.AnnotatedElementInfo; + /** * Class to hold annotations for TestElementsAnnotatedWith. */ --- old/test/langtools/tools/javac/processing/environment/round/AnnotatedElementInfo.java 2018-07-24 22:14:17.225000996 -0700 +++ /dev/null 2018-07-23 19:23:52.252000000 -0700 @@ -1,36 +0,0 @@ -/* - * Copyright (c) 2006, Oracle and/or its affiliates. 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. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -import java.lang.annotation.*; -import static java.lang.annotation.RetentionPolicy.*; - -/** - * Hold information about the set of elements expected to be annotated - * with a given annotation. - */ -@Retention(RUNTIME) -public @interface AnnotatedElementInfo { - String annotationName(); - int expectedSize(); - String[] names(); -}