8370334: javadoc NPE with "import module" statement

Reviewed-by: vromero
This commit is contained in:
Jan Lahoda 2025-11-18 08:13:58 +00:00
parent 26460b6f12
commit 8af5943719
3 changed files with 77 additions and 6 deletions

View File

@ -37,7 +37,7 @@ import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@ -236,6 +236,7 @@ public class Modules extends JCTree.Visitor {
setupAllModules(); //initialize the module graph
Assert.checkNonNull(allModules);
inInitModules = false;
return allModules;
}, null);
} finally {
inInitModules = false;
@ -249,10 +250,11 @@ public class Modules extends JCTree.Visitor {
//the next steps may query if the current module participates in preview,
//and that requires a completed java.base:
syms.java_base.complete();
return modules;
}, c);
}
private boolean enter(List<JCCompilationUnit> trees, Consumer<Set<ModuleSymbol>> init, ClassSymbol c) {
private boolean enter(List<JCCompilationUnit> trees, Function<Set<ModuleSymbol>, Set<ModuleSymbol>> init, ClassSymbol c) {
if (!allowModules) {
for (JCCompilationUnit tree: trees) {
tree.modle = syms.noModule;
@ -270,10 +272,13 @@ public class Modules extends JCTree.Visitor {
setCompilationUnitModules(trees, roots, c);
init.accept(roots);
Set<ModuleSymbol> initialized = init.apply(roots);
for (ModuleSymbol msym: roots) {
msym.complete();
for (ModuleSymbol msym : initialized) {
if (msym != syms.unnamedModule ||
roots.contains(syms.unnamedModule)) {
msym.complete();
}
}
} catch (CompletionFailure ex) {
chk.completionError(null, ex);

View File

@ -672,4 +672,35 @@ public class Modules extends ModuleTestBase {
checkTypesIncluded("p.P");
}
@Test
public void testImportModules(Path base) throws Exception {
Path src = base.resolve("src");
Path mod = Paths.get(src.toString(), "m1");
tb.writeJavaFiles(mod,
"""
import module m1;
module m1 {
exports p;
uses Service;
provides Service with ServiceImpl;
}
""",
"""
package p;
public interface Service {
}
""",
"""
package p;
public class ServiceImpl implements Service {
}
""");
execTask("--module-source-path", src.toString(),
"--module", "m1");
checkModulesSpecified("m1");
checkPackagesIncluded("p");
checkTypesIncluded("p.Service");
checkTypesIncluded("p.ServiceImpl");
}
}

View File

@ -23,7 +23,7 @@
/*
* @test
* @bug 8167975 8173596
* @bug 8167975 8173596 8370334
* @summary Test the --add-modules option
* @library /tools/lib
* @modules jdk.compiler/com.sun.tools.javac.api
@ -35,6 +35,7 @@
import java.nio.file.Path;
import java.util.Arrays;
import java.util.List;
import javax.tools.JavaCompiler;
import javax.tools.JavaCompiler.CompilationTask;
@ -278,5 +279,39 @@ public class AddModulesTest extends ModuleTestBase {
Assert.check(t.call());
}
}
@Test //JDK-8370334
public void testModuleImportAndAddModules(Path base) throws Exception {
Path src = base.resolve("src");
//module that will be inserted using addModules:
Path src_m = src.resolve("m");
tb.writeJavaFiles(src_m,
"import module m; module m { exports p1; }",
"package p1; public class C1 { }");
//test module:
Path src_test = src.resolve("test");
tb.writeJavaFiles(src_test,
"import module test; module test { exports p2; }",
"package p2; public class C2 { }");
Path classes = base.resolve("classes");
tb.createDirectories(classes);
JavaCompiler c = ToolProvider.getSystemJavaCompiler();
try (StandardJavaFileManager fm = c.getStandardFileManager(null, null, null)) {
List<String> options = List.of(
"--module-source-path", src.toString(),
"-d", classes.toString()
);
Iterable<? extends JavaFileObject> files =
fm.getJavaFileObjects(findJavaFiles(src_test));
CompilationTask t = c.getTask(null, fm, null, options, null, files);
t.addModules(Arrays.asList("m"));
//expecting no errors/crashes:
Assert.check(t.call());
}
}
}