mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-18 18:14:38 +02:00
6930508: Passing nested class names on javac command line interfere with subsequent name -> class lookup
Reviewed-by: darcy
This commit is contained in:
parent
733707ac37
commit
cc992b27bf
4 changed files with 212 additions and 7 deletions
|
@ -638,6 +638,19 @@ public class JavaCompiler implements ClassReader.SourceCompleter {
|
|||
}
|
||||
}
|
||||
|
||||
/** 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 @@ public class JavaCompiler implements ClassReader.SourceCompleter {
|
|||
} 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;
|
||||
|
|
|
@ -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 @@ public class TestAnonClassNames {
|
|||
TestAnonClassNames.class,
|
||||
};
|
||||
|
||||
List<String> names = new ArrayList<String>();
|
||||
for(Class<?> clazz : classes) {
|
||||
String name = clazz.getName();
|
||||
Nesting anno = clazz.getAnnotation(Nesting.class);
|
||||
|
@ -100,7 +101,14 @@ public class TestAnonClassNames {
|
|||
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 @@ public class TestAnonClassNames {
|
|||
* input classes are modeled as elements.
|
||||
*/
|
||||
static void testClassName(String className) {
|
||||
JavaCompiler javaCompiler = ToolProvider.getSystemJavaCompiler();
|
||||
List<String> classNames = new ArrayList<String>();
|
||||
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<String> classNames) {
|
||||
System.out.println("test: " + classNames);
|
||||
|
||||
List<String> options = new ArrayList<String>();
|
||||
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 @@ public class TestAnonClassNames {
|
|||
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)
|
||||
|
|
|
@ -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<String> 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<String> getNames(Class<?>[] classes) {
|
||||
List<String> names = new ArrayList<String>();
|
||||
for (Class<?> c: classes)
|
||||
names.add(c.getName());
|
||||
return names;
|
||||
}
|
||||
|
||||
void test(List<String> 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();
|
||||
}
|
||||
|
||||
<T> List<T> reverse(List<T> list) {
|
||||
List<T> newList = new ArrayList<T>(list);
|
||||
Collections.reverse(newList);
|
||||
return newList;
|
||||
}
|
||||
|
||||
int errors = 0;
|
||||
|
||||
void error(String msg) {
|
||||
System.out.println("Error: " + msg);
|
||||
errors++;
|
||||
}
|
||||
|
||||
//----------
|
||||
|
||||
public boolean process(Set<? extends TypeElement> annotations,
|
||||
RoundEnvironment roundEnv) {
|
||||
if (!roundEnv.processingOver()) {
|
||||
for (TypeElement typeElt : ElementFilter.typesIn(roundEnv.getRootElements())) {
|
||||
messager.printMessage(Diagnostic.Kind.NOTE, "processing " + typeElt);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
|
@ -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"
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Add table
Add a link
Reference in a new issue