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.
|
/** Resolve an identifier.
|
||||||
* @param name The identifier to resolve
|
* @param name The identifier to resolve
|
||||||
*/
|
*/
|
||||||
|
@ -1058,7 +1071,7 @@ public class JavaCompiler implements ClassReader.SourceCompleter {
|
||||||
} else {
|
} else {
|
||||||
boolean errors = false;
|
boolean errors = false;
|
||||||
for (String nameStr : classnames) {
|
for (String nameStr : classnames) {
|
||||||
Symbol sym = resolveIdent(nameStr);
|
Symbol sym = resolveBinaryNameOrIdent(nameStr);
|
||||||
if (sym == null || (sym.kind == Kinds.PCK && !processPcks)) {
|
if (sym == null || (sym.kind == Kinds.PCK && !processPcks)) {
|
||||||
log.error("proc.cant.find.class", nameStr);
|
log.error("proc.cant.find.class", nameStr);
|
||||||
errors = true;
|
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.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -23,7 +23,7 @@
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @test
|
* @test
|
||||||
* @bug 6449781
|
* @bug 6449781 6930508
|
||||||
* @summary Test that reported names of anonymous classes are non-null.
|
* @summary Test that reported names of anonymous classes are non-null.
|
||||||
* @author Joseph D. Darcy
|
* @author Joseph D. Darcy
|
||||||
* @library ../../../lib
|
* @library ../../../lib
|
||||||
|
@ -93,6 +93,7 @@ public class TestAnonClassNames {
|
||||||
TestAnonClassNames.class,
|
TestAnonClassNames.class,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
List<String> names = new ArrayList<String>();
|
||||||
for(Class<?> clazz : classes) {
|
for(Class<?> clazz : classes) {
|
||||||
String name = clazz.getName();
|
String name = clazz.getName();
|
||||||
Nesting anno = clazz.getAnnotation(Nesting.class);
|
Nesting anno = clazz.getAnnotation(Nesting.class);
|
||||||
|
@ -100,7 +101,14 @@ public class TestAnonClassNames {
|
||||||
clazz.getName(),
|
clazz.getName(),
|
||||||
anno == null ? "(unset/ANONYMOUS)" : anno.value());
|
anno == null ? "(unset/ANONYMOUS)" : anno.value());
|
||||||
testClassName(name);
|
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.
|
* input classes are modeled as elements.
|
||||||
*/
|
*/
|
||||||
static void testClassName(String className) {
|
static void testClassName(String className) {
|
||||||
JavaCompiler javaCompiler = ToolProvider.getSystemJavaCompiler();
|
testClassNames(Arrays.asList(className));
|
||||||
List<String> classNames = new ArrayList<String>();
|
}
|
||||||
classNames.add(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>();
|
List<String> options = new ArrayList<String>();
|
||||||
options.add("-proc:only");
|
options.add("-proc:only");
|
||||||
options.add("-classpath");
|
options.add("-classpath");
|
||||||
options.add(System.getProperty("test.classes"));
|
options.add(System.getProperty("test.classes"));
|
||||||
|
|
||||||
|
JavaCompiler javaCompiler = ToolProvider.getSystemJavaCompiler();
|
||||||
JavaCompiler.CompilationTask compileTask =
|
JavaCompiler.CompilationTask compileTask =
|
||||||
javaCompiler.getTask(null, // Output
|
javaCompiler.getTask(null, // Output
|
||||||
null, // File manager
|
null, // File manager
|
||||||
|
@ -130,9 +146,16 @@ public class TestAnonClassNames {
|
||||||
compileTask.setProcessors(processors);
|
compileTask.setProcessors(processors);
|
||||||
Boolean goodResult = compileTask.call();
|
Boolean goodResult = compileTask.call();
|
||||||
if (!goodResult) {
|
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)
|
@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