mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-27 06:45:07 +02:00
8335989: Implement JEP 494: Module Import Declarations (Second Preview)
Reviewed-by: vromero, abimpoudis, mcimadamore, alanb
This commit is contained in:
parent
e7d90b941f
commit
1e97c1c913
28 changed files with 716 additions and 182 deletions
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue