diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Modules.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Modules.java index 0cef9cc6602..5a1fe70dd9b 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Modules.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Modules.java @@ -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 trees, Consumer> init, ClassSymbol c) { + private boolean enter(List trees, Function, Set> 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 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); diff --git a/test/langtools/jdk/javadoc/tool/modules/Modules.java b/test/langtools/jdk/javadoc/tool/modules/Modules.java index d830470bb01..c8028ba5c7e 100644 --- a/test/langtools/jdk/javadoc/tool/modules/Modules.java +++ b/test/langtools/jdk/javadoc/tool/modules/Modules.java @@ -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"); + } + } diff --git a/test/langtools/tools/javac/modules/AddModulesTest.java b/test/langtools/tools/javac/modules/AddModulesTest.java index f7a87c592c9..080a5edda27 100644 --- a/test/langtools/tools/javac/modules/AddModulesTest.java +++ b/test/langtools/tools/javac/modules/AddModulesTest.java @@ -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 options = List.of( + "--module-source-path", src.toString(), + "-d", classes.toString() + ); + Iterable 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()); + } + } }