8173068: ElementUtils getPackageElement does not allow for an unnamed package

Removing special handling of unnamed packages in Elements.getPackageElement.

Reviewed-by: darcy, jjg, ksrini
This commit is contained in:
Jan Lahoda 2017-01-26 14:14:01 +01:00
parent a57e6e77d2
commit 210dd83834
3 changed files with 162 additions and 6 deletions

View File

@ -52,7 +52,7 @@ public interface Elements {
* If running with modules, all modules in the modules graph are searched for matching packages.
*
* @param name fully qualified package name, or an empty string for an unnamed package
* @return the named package, or {@code null} if it cannot be uniquely found
* @return the specified package, or {@code null} if it cannot be uniquely found
*/
PackageElement getPackageElement(CharSequence name);
@ -61,7 +61,7 @@ public interface Elements {
*
* @param name fully qualified package name, or an empty string for an unnamed package
* @param module module relative to which the lookup should happen
* @return the named package, or {@code null} if it cannot be found
* @return the specified package, or {@code null} if it cannot be found
* @since 9
*/
PackageElement getPackageElement(ModuleElement module, CharSequence name);

View File

@ -140,8 +140,6 @@ public class JavacElements implements Elements {
private PackageSymbol doGetPackageElement(ModuleElement module, CharSequence name) {
ensureEntered("getPackageElement");
if (name.length() == 0)
return syms.unnamedModule.unnamedPackage;
return doGetElement(module, "getPackageElement", name, PackageSymbol.class);
}
@ -165,7 +163,7 @@ public class JavacElements implements Elements {
private <S extends Symbol> S doGetElement(ModuleElement module, String methodName,
CharSequence name, Class<S> clazz) {
String strName = name.toString();
if (!SourceVersion.isName(strName)) {
if (!SourceVersion.isName(strName) && (!strName.isEmpty() || clazz == ClassSymbol.class)) {
return null;
}
if (module == null) {

View File

@ -23,13 +23,14 @@
/*
* @test
* @bug 8154283 8167320 8171098 8172809 8173117
* @bug 8154283 8167320 8171098 8172809 8173068 8173117
* @summary tests for multi-module mode compilation
* @library /tools/lib
* @modules
* jdk.compiler/com.sun.tools.javac.api
* jdk.compiler/com.sun.tools.javac.code
* jdk.compiler/com.sun.tools.javac.main
* jdk.compiler/com.sun.tools.javac.processing
* jdk.compiler/com.sun.tools.javac.util
* @build toolbox.ToolBox toolbox.JarTask toolbox.JavacTask ModuleTestBase
* @run main EdgeCases
@ -53,8 +54,10 @@ import javax.lang.model.SourceVersion;
import javax.lang.model.element.Element;
import javax.lang.model.element.ModuleElement;
import javax.lang.model.element.ModuleElement.RequiresDirective;
import javax.lang.model.element.PackageElement;
import javax.lang.model.element.TypeElement;
import javax.lang.model.util.ElementFilter;
import javax.lang.model.util.Elements;
import javax.tools.JavaCompiler;
import javax.tools.JavaFileObject;
import javax.tools.StandardJavaFileManager;
@ -64,7 +67,10 @@ import com.sun.source.tree.CompilationUnitTree;
//import com.sun.source.util.JavacTask; // conflicts with toolbox.JavacTask
import com.sun.tools.javac.api.JavacTaskImpl;
import com.sun.tools.javac.code.Symbol.ModuleSymbol;
import com.sun.tools.javac.code.Symbol.PackageSymbol;
import com.sun.tools.javac.code.Symtab;
import com.sun.tools.javac.processing.JavacProcessingEnvironment;
import com.sun.tools.javac.util.Context;
import toolbox.JarTask;
import toolbox.JavacTask;
@ -654,4 +660,156 @@ public class EdgeCases extends ModuleTestBase {
}
}
@Test
public void testUnnamedPackage(Path base) throws Exception {
List<String> out;
List<String> expected;
//-source 8:
Path src8 = base.resolve("src8");
Files.createDirectories(src8);
tb.writeJavaFiles(src8,
"package test; public class Test {}");
Path classes = base.resolve("classes");
tb.createDirectories(classes);
out = new JavacTask(tb)
.options("--source-path", src8.toString(),
"-processor", UnnamedPackageProcessor.class.getName(),
"-source", "8")
.outdir(classes)
.files(findJavaFiles(src8))
.run()
.writeAll()
.getOutputLines(OutputKind.STDOUT);
expected = Arrays.asList("noModule");
if (!expected.equals(out)) {
throw new AssertionError("Unexpected output: " + out);
}
//-source 9, unnamed:
Path srcUnnamed = base.resolve("srcUnnamed");
Files.createDirectories(srcUnnamed);
tb.writeJavaFiles(srcUnnamed,
"public class Test {}");
Path classesUnnamed = base.resolve("classesUnnamed");
tb.createDirectories(classesUnnamed);
out = new JavacTask(tb)
.options("--source-path", srcUnnamed.toString(),
"-processor", UnnamedPackageProcessor.class.getName())
.outdir(classesUnnamed)
.files(findJavaFiles(srcUnnamed))
.run()
.writeAll()
.getOutputLines(OutputKind.STDOUT);
expected = Arrays.asList("unnamedModule");
if (!expected.equals(out)) {
throw new AssertionError("Unexpected output: " + out);
}
//-source 9, named:
Path srcNamed = base.resolve("srcNamed");
Files.createDirectories(srcNamed);
tb.writeJavaFiles(srcNamed,
"module m {}",
"public class Test {}");
Path classesNamed = base.resolve("classesNamed");
tb.createDirectories(classesNamed);
out = new JavacTask(tb)
.options("--source-path", srcNamed.toString(),
"-classpath", "",
"-processorpath", System.getProperty("test.class.path"),
"-processor", UnnamedPackageProcessor.class.getName())
.outdir(classesNamed)
.files(findJavaFiles(srcNamed))
.run()
.writeAll()
.getOutputLines(OutputKind.STDOUT);
expected = Arrays.asList("m");
if (!expected.equals(out)) {
throw new AssertionError("Unexpected output: " + out);
}
//-source 9, conflict:
Path srcNamed2 = base.resolve("srcNamed2");
Path srcNamed2m1 = srcNamed2.resolve("m1x");
Files.createDirectories(srcNamed2m1);
tb.writeJavaFiles(srcNamed2m1,
"module m1x {}",
"public class Test {}");
Path srcNamed2m2 = srcNamed2.resolve("m2x");
Files.createDirectories(srcNamed2m2);
tb.writeJavaFiles(srcNamed2m2,
"module m2x {}",
"public class Test {}");
Path classesNamed2 = base.resolve("classesNamed2");
tb.createDirectories(classesNamed2);
out = new JavacTask(tb)
.options("--module-source-path", srcNamed2.toString(),
"-classpath", "",
"-processorpath", System.getProperty("test.class.path"),
"-processor", UnnamedPackageProcessor.class.getName(),
"-XDshould-stop.ifError=FLOW")
.outdir(classesNamed2)
.files(findJavaFiles(srcNamed2))
.run(Expect.FAIL)
.writeAll()
.getOutputLines(OutputKind.STDOUT);
expected = Arrays.asList("null",
"m1x: true",
"m2x: true");
if (!expected.equals(out)) {
throw new AssertionError("Unexpected output: " + out);
}
}
@SupportedAnnotationTypes("*")
public static final class UnnamedPackageProcessor extends AbstractProcessor {
int round = 0;
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
if (round++ != 0)
return false;
Elements elements = processingEnv.getElementUtils();
PackageElement pe = elements.getPackageElement("");
if (pe == null) {
System.out.println("null");
} else {
ModuleElement mod = (ModuleElement) pe.getEnclosingElement();
if (mod == null) {
System.out.println("noModule");
} else if (mod.isUnnamed()) {
System.out.println("unnamedModule");
} else {
System.out.println(mod);
}
}
ModuleElement m1x = elements.getModuleElement("m1x");
ModuleElement m2x = elements.getModuleElement("m2x");
if (m1x != null && m2x != null) {
System.out.println("m1x: " + (elements.getPackageElement(m1x, "") != null));
System.out.println("m2x: " + (elements.getPackageElement(m2x, "") != null));
}
return false;
}
}
}