# HG changeset patch # User jjg # Date 1300321312 25200 # Node ID e630c590eb1095c5433f9263a8b8b9951a9b124e # Parent 3c7365401a9700f9261803f07a0f0b268afa05a4 6930508: Passing nested class names on javac command line interfere with subsequent name -> class lookup Reviewed-by: darcy diff -r 3c7365401a97 -r e630c590eb10 langtools/src/share/classes/com/sun/tools/javac/main/JavaCompiler.java --- a/langtools/src/share/classes/com/sun/tools/javac/main/JavaCompiler.java Wed Mar 16 09:41:30 2011 -0700 +++ b/langtools/src/share/classes/com/sun/tools/javac/main/JavaCompiler.java Wed Mar 16 17:21:52 2011 -0700 @@ -638,6 +638,19 @@ } } + /** Resolve an identifier which may be the binary name of a class or + * the Java name of a class or package. + * @param name The name to resolve + */ + public Symbol resolveBinaryNameOrIdent(String name) { + try { + Name flatname = names.fromString(name.replace("/", ".")); + return reader.loadClass(flatname); + } catch (CompletionFailure ignore) { + return resolveIdent(name); + } + } + /** Resolve an identifier. * @param name The identifier to resolve */ @@ -1058,7 +1071,7 @@ } else { boolean errors = false; for (String nameStr : classnames) { - Symbol sym = resolveIdent(nameStr); + Symbol sym = resolveBinaryNameOrIdent(nameStr); if (sym == null || (sym.kind == Kinds.PCK && !processPcks)) { log.error("proc.cant.find.class", nameStr); errors = true; diff -r 3c7365401a97 -r e630c590eb10 langtools/test/tools/javac/processing/model/element/TestAnonClassNames.java --- a/langtools/test/tools/javac/processing/model/element/TestAnonClassNames.java Wed Mar 16 09:41:30 2011 -0700 +++ b/langtools/test/tools/javac/processing/model/element/TestAnonClassNames.java Wed Mar 16 17:21:52 2011 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2011, 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,7 +23,7 @@ /* * @test - * @bug 6449781 + * @bug 6449781 6930508 * @summary Test that reported names of anonymous classes are non-null. * @author Joseph D. Darcy * @library ../../../lib @@ -93,6 +93,7 @@ TestAnonClassNames.class, }; + List names = new ArrayList(); for(Class clazz : classes) { String name = clazz.getName(); Nesting anno = clazz.getAnnotation(Nesting.class); @@ -100,7 +101,14 @@ clazz.getName(), anno == null ? "(unset/ANONYMOUS)" : anno.value()); testClassName(name); + names.add(name); } + + // test all names together + testClassNames(names); + + if (errors > 0) + throw new RuntimeException(errors + " errors occurred"); } /** @@ -109,15 +117,23 @@ * input classes are modeled as elements. */ static void testClassName(String className) { - JavaCompiler javaCompiler = ToolProvider.getSystemJavaCompiler(); - List classNames = new ArrayList(); - classNames.add(className); + testClassNames(Arrays.asList(className)); + } + + /** + * Perform annotation processing on a list of class file names and verify + * the existence of different flavors of class names when the + * input classes are modeled as elements. + */ + static void testClassNames(List classNames) { + System.out.println("test: " + classNames); List options = new ArrayList(); options.add("-proc:only"); options.add("-classpath"); options.add(System.getProperty("test.classes")); + JavaCompiler javaCompiler = ToolProvider.getSystemJavaCompiler(); JavaCompiler.CompilationTask compileTask = javaCompiler.getTask(null, // Output null, // File manager @@ -130,9 +146,16 @@ compileTask.setProcessors(processors); Boolean goodResult = compileTask.call(); if (!goodResult) { - throw new RuntimeException("Errors found during compile."); + error("Errors found during compile."); } } + + static int errors = 0; + + static void error(String msg) { + System.out.println("Error: " + msg); + errors++; + } } @Retention(RUNTIME) diff -r 3c7365401a97 -r e630c590eb10 langtools/test/tools/javac/processing/options/testCommandLineClasses/Test.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/processing/options/testCommandLineClasses/Test.java Wed Mar 16 17:21:52 2011 -0700 @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2011, 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. + */ + +/* + * @test + * @bug 6930508 + * @summary Passing nested class names on javac command line interfere with subsequent name -> class lookup + * @library ../../../lib + * @build JavacTestingAbstractProcessor p.NestedExamples Test + * @run main Test + */ + +import java.io.*; +import java.util.*; +import javax.annotation.processing.RoundEnvironment; +import javax.lang.model.element.TypeElement; +import javax.lang.model.util.ElementFilter; +import javax.tools.*; + +import p.NestedExamples; + +public class Test extends JavacTestingAbstractProcessor { + public static void main(String... args) throws Exception { + new Test().run(); + } + + void run() throws Exception { + NestedExamples e = new NestedExamples(); + List names = getNames(e.getClasses()); + test(names); + test(reverse(names)); + names = Arrays.asList(e.getClassNames()); + test(names); + test(reverse(names)); + + if (errors > 0) + throw new RuntimeException(errors + " errors occurred"); + } + + List getNames(Class[] classes) { + List names = new ArrayList(); + for (Class c: classes) + names.add(c.getName()); + return names; + } + + void test(List names) throws Exception { + System.err.println("test: " + names); + JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); + StandardJavaFileManager fm = compiler.getStandardFileManager(null, null, null); + File testClasses = new File(System.getProperty("test.classes")); + fm.setLocation(StandardLocation.CLASS_PATH, Arrays.asList(testClasses)); + JavaCompiler.CompilationTask task = compiler.getTask( + null, null, null, Arrays.asList("-proc:only"), names, null); + task.setProcessors(Arrays.asList(new Test())); + boolean ok = task.call(); + if (!ok) + error("compilation failed"); + System.err.println(); + } + + List reverse(List list) { + List newList = new ArrayList(list); + Collections.reverse(newList); + return newList; + } + + int errors = 0; + + void error(String msg) { + System.out.println("Error: " + msg); + errors++; + } + + //---------- + + public boolean process(Set annotations, + RoundEnvironment roundEnv) { + if (!roundEnv.processingOver()) { + for (TypeElement typeElt : ElementFilter.typesIn(roundEnv.getRootElements())) { + messager.printMessage(Diagnostic.Kind.NOTE, "processing " + typeElt); + } + } + return true; + } +} diff -r 3c7365401a97 -r e630c590eb10 langtools/test/tools/javac/processing/options/testCommandLineClasses/p/NestedExamples.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/processing/options/testCommandLineClasses/p/NestedExamples.java Wed Mar 16 17:21:52 2011 -0700 @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2011, 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. + */ + +package p; + +public class NestedExamples { + static class MemberClass1 { } + + class MemberClass2 { } + + class Win$$AtVegas { } // Class with funny name. + + public Class[] getClasses() { + class LocalClass { } + + Object o = new Object() { // An anonymous class + @Override + public String toString() { + return "I have no name!"; + } + }; + + return new Class[] { + NestedExamples.class, + MemberClass1.class, + MemberClass2.class, + Win$$AtVegas.class, + LocalClass.class, + o.getClass() + }; + } + + public String[] getClassNames() { + return new String[] { + "p.NestedExamples", + "p.NestedExamples.MemberClass1", + "p.NestedExamples.MemberClass2", + "p.NestedExamples.Win$$AtVegas" + }; + } +} + +