8335989: Implement JEP 494: Module Import Declarations (Second Preview)

Reviewed-by: vromero, abimpoudis, mcimadamore, alanb
This commit is contained in:
Jan Lahoda 2024-11-14 06:14:33 +00:00
parent e7d90b941f
commit 1e97c1c913
28 changed files with 716 additions and 182 deletions

View file

@ -23,7 +23,7 @@
/**
* @test
* @bug 8193125 8196623
* @bug 8193125 8196623 8335989
* @summary test modifiers with java.base
* @library /tools/lib
* @enablePreview
@ -49,6 +49,7 @@ import java.lang.classfile.attribute.*;
import com.sun.tools.javac.jvm.Target;
import com.sun.tools.javac.platform.JDKPlatformProvider;
import java.util.function.Supplier;
import toolbox.JavacTask;
import toolbox.Task;
@ -56,6 +57,8 @@ import toolbox.ToolBox;
public class JavaBaseTest {
private static final String CURRENT_VERSION = System.getProperty("java.specification.version");
public static void main(String... args) throws Exception {
JavaBaseTest t = new JavaBaseTest();
t.run();
@ -75,13 +78,11 @@ public class JavaBaseTest {
void run() throws Exception {
Set<String> targets = new LinkedHashSet<>();
StreamSupport.stream(new JDKPlatformProvider().getSupportedPlatformNames()
.spliterator(),
false)
.filter(p -> Integer.parseInt(p) >= 9)
.forEach(targets::add);
//run without --release:
targets.add("9");
targets.add("10");
targets.add("21");
targets.add("current");
targets.add("current-preview");
for (List<String> mods : modifiers) {
for (String target : targets) {
for (Mode mode : Mode.values()) {
@ -119,15 +120,43 @@ public class JavaBaseTest {
tb.writeJavaFiles(src,
"module m { requires " + String.join(" ", mods) + " java.base; }");
Path modules = Files.createDirectories(base.resolve("modules"));
boolean expectOK = target.equals("9");
boolean expectOK;
JavacTask jct = new JavacTask(tb)
.outdir(modules);
if (target.equals("current"))
jct.options("-XDrawDiagnostics");
else
jct.options("-XDrawDiagnostics", "--release", target);
List<String> options = new ArrayList<>();
switch (target) {
case "current":
options.add("--release");
options.add(CURRENT_VERSION);
expectOK = false;
break;
case "current-preview":
options.add("--enable-preview");
options.add("--release");
options.add(CURRENT_VERSION);
expectOK = true;
break;
case "9":
options.add("--release");
options.add(target);
expectOK = true;
break;
default:
options.add("--release");
options.add(target);
expectOK = false;
break;
}
if (mods.contains("static") && !"9".equals(target)) {
expectOK = false;
}
options.add("-XDrawDiagnostics");
jct.options(options);
String log = jct.files(tb.findJavaFiles(src))
.run(expectOK ? Task.Expect.SUCCESS : Task.Expect.FAIL)
@ -138,9 +167,9 @@ public class JavaBaseTest {
boolean foundErrorMessage = false;
for (String mod : mods) {
String key = mod.equals("static")
? "compiler.err.mod.not.allowed.here"
: "compiler.err.modifier.not.allowed.here";
String message = "module-info.java:1:12: " + key + ": " + mod;
? "compiler.err.mod.not.allowed.here: " + mod
: "compiler.err.feature.not.supported.in.source.plural: (compiler.misc.feature.java.base.transitive)";
String message = "module-info.java:1:12: " + key;
if (log.contains(message)) {
foundErrorMessage = true;
}
@ -152,18 +181,57 @@ public class JavaBaseTest {
}
void testClass(Path base, List<String> mods, String target) throws Exception {
createClass(base, mods, target);
boolean expectOK;
List<String> options = new ArrayList<>();
switch (target) {
case "current":
options.add("--release");
options.add(CURRENT_VERSION);
expectOK = false;
break;
case "current-preview":
options.add("--enable-preview");
options.add("--release");
options.add(CURRENT_VERSION);
expectOK = true;
break;
case "9":
options.add("--release");
options.add(target);
expectOK = true;
break;
default:
options.add("--release");
options.add(target);
expectOK = false;
break;
}
if (mods.contains("static") && !"9".equals(target)) {
expectOK = false;
}
createClass(base, mods, options);
List<String> testOptions = new ArrayList<>();
testOptions.add("-XDrawDiagnostics");
testOptions.add("--module-path"); testOptions.add(base.resolve("test-modules").toString());
if (options.contains("--enable-preview")) {
testOptions.add("--enable-preview");
testOptions.add("--source"); testOptions.add(CURRENT_VERSION);
}
Path src = base.resolve("src");
tb.writeJavaFiles(src,
"module mx { requires m; }");
Path modules = Files.createDirectories(base.resolve("modules"));
boolean expectOK = target.equals("9");
String log = new JavacTask(tb)
.outdir(modules)
.options("-XDrawDiagnostics",
"--module-path", base.resolve("test-modules").toString())
.options(testOptions)
.files(tb.findJavaFiles(src))
.run(expectOK ? Task.Expect.SUCCESS : Task.Expect.FAIL)
.writeAll()
@ -188,7 +256,7 @@ public class JavaBaseTest {
}
}
void createClass(Path base, List<String> mods, String target) throws Exception {
void createClass(Path base, List<String> mods, List<String> options) throws Exception {
Path src1 = base.resolve("interim-src");
tb.writeJavaFiles(src1,
"module m { requires java.base; }");
@ -197,9 +265,7 @@ public class JavaBaseTest {
JavacTask jct = new JavacTask(tb)
.outdir(modules1);
if (!target.equals("current")) {
jct.options("--release", target);
}
jct.options(options);
jct.files(tb.findJavaFiles(src1))
.run(Task.Expect.SUCCESS);
@ -226,6 +292,8 @@ public class JavaBaseTest {
requires.set(i, e2);
}
boolean preview = options.contains("--enable-preview");
ModuleAttribute modAttr2 = ModuleAttribute.of(
modAttr1.moduleName(),
modAttr1.moduleFlagsMask(),
@ -237,8 +305,14 @@ public class JavaBaseTest {
modAttr1.provides());
Path modInfo = base.resolve("test-modules").resolve("module-info.class");
Files.createDirectories(modInfo.getParent());
byte[] newBytes = ClassFile.of().transformClass(cm1, ClassTransform.dropping(ce -> ce instanceof ModuleAttribute).
andThen(ClassTransform.endHandler(classBuilder -> classBuilder.with(modAttr2))));
ClassTransform replace = (builder, element) -> {
switch (element) {
case ClassFileVersion cfv when preview -> builder.withVersion(cfv.majorVersion(), 0xFFFF);
case ModuleAttribute _ -> builder.with(modAttr2);
default -> builder.with(element);
}
};
byte[] newBytes = ClassFile.of().transformClass(cm1, replace);
try (OutputStream out = Files.newOutputStream(modInfo)) {
out.write(newBytes);
}