Skip to content

Commit 26f2a97

Browse files
committed
8290561: Coalesce incubator-module warnings for single-file source-code programs
Reviewed-by: mcimadamore
1 parent 8e22f2b commit 26f2a97

File tree

3 files changed

+102
-2
lines changed

3 files changed

+102
-2
lines changed

src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Modules.java

+13-2
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,7 @@ public class Modules extends JCTree.Visitor {
165165
private final String limitModsOpt;
166166
private final Set<String> extraLimitMods = new HashSet<>();
167167
private final String moduleVersionOpt;
168+
private final boolean sourceLauncher;
168169

169170
private final boolean lintOptions;
170171

@@ -214,6 +215,7 @@ protected Modules(Context context) {
214215
addModsOpt = options.get(Option.ADD_MODULES);
215216
limitModsOpt = options.get(Option.LIMIT_MODULES);
216217
moduleVersionOpt = options.get(Option.MODULE_VERSION);
218+
sourceLauncher = options.isSet("sourceLauncher");
217219
}
218220

219221
int depth = -1;
@@ -1341,9 +1343,9 @@ private void setupAllModules() {
13411343
.forEach(result::add);
13421344
}
13431345

1344-
String incubatingModules = result.stream()
1346+
String incubatingModules = filterAlreadyWarnedIncubatorModules(result.stream()
13451347
.filter(msym -> msym.resolutionFlags.contains(ModuleResolutionFlags.WARN_INCUBATING))
1346-
.map(msym -> msym.name.toString())
1348+
.map(msym -> msym.name.toString()))
13471349
.collect(Collectors.joining(","));
13481350

13491351
if (!incubatingModules.isEmpty()) {
@@ -1359,6 +1361,15 @@ private void setupAllModules() {
13591361
}
13601362
}
13611363
//where:
1364+
private Stream<String> filterAlreadyWarnedIncubatorModules(Stream<String> incubatingModules) {
1365+
if (!sourceLauncher) return incubatingModules;
1366+
Set<String> bootModules = ModuleLayer.boot()
1367+
.modules()
1368+
.stream()
1369+
.map(Module::getName)
1370+
.collect(Collectors.toSet());
1371+
return incubatingModules.filter(module -> !bootModules.contains(module));
1372+
}
13621373
private static final Predicate<ModuleSymbol> IS_AUTOMATIC =
13631374
m -> (m.flags_field & Flags.AUTOMATIC_MODULE) != 0;
13641375

src/jdk.compiler/share/classes/com/sun/tools/javac/launcher/Main.java

+1
Original file line numberDiff line numberDiff line change
@@ -368,6 +368,7 @@ private List<String> getJavacOpts(String... runtimeArgs) throws Fault {
368368
javacOpts.add("-Xlint:deprecation");
369369
javacOpts.add("-Xlint:unchecked");
370370
javacOpts.add("-Xlint:-options");
371+
javacOpts.add("-XDsourceLauncher");
371372
return javacOpts;
372373
}
373374

test/langtools/tools/javac/launcher/SourceLauncherTest.java

+88
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,22 @@
2929
* @modules jdk.compiler/com.sun.tools.javac.api
3030
* jdk.compiler/com.sun.tools.javac.launcher
3131
* jdk.compiler/com.sun.tools.javac.main
32+
* jdk.jdeps/com.sun.tools.classfile
3233
* @build toolbox.JavaTask toolbox.JavacTask toolbox.TestRunner toolbox.ToolBox
3334
* @run main SourceLauncherTest
3435
*/
3536

37+
import com.sun.tools.classfile.Attribute;
38+
import com.sun.tools.classfile.Attributes;
39+
import com.sun.tools.classfile.ClassFile;
40+
import com.sun.tools.classfile.ClassWriter;
41+
import com.sun.tools.classfile.ConstantPool;
42+
import com.sun.tools.classfile.ConstantPool.CPInfo;
43+
import com.sun.tools.classfile.ModuleResolution_attribute;
3644
import java.io.ByteArrayOutputStream;
3745
import java.io.File;
3846
import java.io.IOException;
47+
import java.io.OutputStream;
3948
import java.io.PrintStream;
4049
import java.io.PrintWriter;
4150
import java.io.StringWriter;
@@ -45,6 +54,8 @@
4554
import java.nio.file.Paths;
4655
import java.util.ArrayList;
4756
import java.util.Collections;
57+
import java.util.HashMap;
58+
import java.util.Map;
4859
import java.util.List;
4960
import java.util.Properties;
5061
import java.util.regex.Pattern;
@@ -655,6 +666,83 @@ public void testTargetException1(Path base) throws IOException {
655666
"at Thrower.main(Thrower.java:4)");
656667
}
657668

669+
@Test
670+
public void testNoDuplicateIncubatorWarning(Path base) throws Exception {
671+
Path module = base.resolve("lib");
672+
Path moduleSrc = module.resolve("src");
673+
Path moduleClasses = module.resolve("classes");
674+
Files.createDirectories(moduleClasses);
675+
tb.cleanDirectory(moduleClasses);
676+
tb.writeJavaFiles(moduleSrc, "module test {}");
677+
new JavacTask(tb)
678+
.outdir(moduleClasses)
679+
.files(tb.findJavaFiles(moduleSrc))
680+
.run()
681+
.writeAll();
682+
markModuleAsIncubator(moduleClasses.resolve("module-info.class"));
683+
tb.writeJavaFiles(base, "public class Main { public static void main(String... args) {}}");
684+
String log = new JavaTask(tb)
685+
.vmOptions("--module-path", moduleClasses.toString(),
686+
"--add-modules", "test")
687+
.className(base.resolve("Main.java").toString())
688+
.run(Task.Expect.SUCCESS)
689+
.writeAll()
690+
.getOutput(Task.OutputKind.STDERR);
691+
692+
int numberOfWarnings = log.split("WARNING").length - 1;
693+
694+
if (log.contains("warning:") || numberOfWarnings != 1) {
695+
error("Unexpected warning in error output: " + log);
696+
}
697+
698+
List<String> compileLog = new JavacTask(tb)
699+
.options("--module-path", moduleClasses.toString(),
700+
"--add-modules", "test",
701+
"-XDrawDiagnostics",
702+
"-XDsourceLauncher",
703+
"-XDshould-stop.at=FLOW")
704+
.files(base.resolve("Main.java").toString())
705+
.run(Task.Expect.SUCCESS)
706+
.writeAll()
707+
.getOutputLines(Task.OutputKind.DIRECT);
708+
709+
List<String> expectedOutput = List.of(
710+
"- compiler.warn.incubating.modules: test",
711+
"1 warning"
712+
);
713+
714+
if (!expectedOutput.equals(compileLog)) {
715+
error("Unexpected options : " + compileLog);
716+
}
717+
}
718+
//where:
719+
private static void markModuleAsIncubator(Path moduleInfoFile) throws Exception {
720+
ClassFile cf = ClassFile.read(moduleInfoFile);
721+
List<CPInfo> newPool = new ArrayList<>();
722+
newPool.add(null);
723+
cf.constant_pool.entries().forEach(newPool::add);
724+
int moduleResolutionIndex = newPool.size();
725+
newPool.add(new ConstantPool.CONSTANT_Utf8_info(Attribute.ModuleResolution));
726+
Map<String, Attribute> newAttributes = new HashMap<>(cf.attributes.map);
727+
newAttributes.put(Attribute.ModuleResolution,
728+
new ModuleResolution_attribute(moduleResolutionIndex,
729+
ModuleResolution_attribute.WARN_INCUBATING));
730+
ClassFile newClassFile = new ClassFile(cf.magic,
731+
cf.minor_version,
732+
cf.major_version,
733+
new ConstantPool(newPool.toArray(new CPInfo[0])),
734+
cf.access_flags,
735+
cf.this_class,
736+
cf.super_class,
737+
cf.interfaces,
738+
cf.fields,
739+
cf.methods,
740+
new Attributes(newAttributes));
741+
try (OutputStream out = Files.newOutputStream(moduleInfoFile)) {
742+
new ClassWriter().write(newClassFile, out);
743+
}
744+
}
745+
658746
Result run(Path file, List<String> runtimeArgs, List<String> appArgs) {
659747
List<String> args = new ArrayList<>();
660748
args.add(file.toString());

0 commit comments

Comments
 (0)