diff --git a/src/java.base/share/classes/jdk/internal/module/ModuleInfo.java b/src/java.base/share/classes/jdk/internal/module/ModuleInfo.java index 7ccf9ff074613..50ec014786116 100644 --- a/src/java.base/share/classes/jdk/internal/module/ModuleInfo.java +++ b/src/java.base/share/classes/jdk/internal/module/ModuleInfo.java @@ -409,7 +409,7 @@ private Builder readModuleAttribute(DataInput in, ConstantPool cpool, int major, + " has ACC_SYNTHETIC set"); } if (major >= 54 - && ((mods.contains(Requires.Modifier.TRANSITIVE) && !previewClassfile) + && ((mods.contains(Requires.Modifier.TRANSITIVE) && !previewClassfile && !mn.startsWith("java.")) || mods.contains(Requires.Modifier.STATIC))) { String flagName; if (mods.contains(Requires.Modifier.TRANSITIVE) && !previewClassfile) { diff --git a/src/java.base/share/classes/module-info.java b/src/java.base/share/classes/module-info.java index 4e43245e520e2..366de9c49f580 100644 --- a/src/java.base/share/classes/module-info.java +++ b/src/java.base/share/classes/module-info.java @@ -154,6 +154,7 @@ exports jdk.internal.javac to java.compiler, java.desktop, // for ScopedValue + java.se, // for ParticipatesInPreview jdk.compiler, jdk.incubator.vector, // participates in preview features jdk.jartool, // participates in preview features diff --git a/src/java.se/share/classes/module-info.java b/src/java.se/share/classes/module-info.java index 81b1bd3cb8aa9..9a2704660b7b9 100644 --- a/src/java.se/share/classes/module-info.java +++ b/src/java.se/share/classes/module-info.java @@ -23,6 +23,8 @@ * questions. */ +import jdk.internal.javac.ParticipatesInPreview; + /** * Defines the API of the Java SE Platform. * @@ -38,7 +40,9 @@ * @moduleGraph * @since 9 */ +@ParticipatesInPreview module java.se { + requires transitive java.base; requires transitive java.compiler; requires transitive java.datatransfer; requires transitive java.desktop; diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Preview.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Preview.java index 1faced5c8bc78..c66e17586161e 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Preview.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Preview.java @@ -27,6 +27,7 @@ import com.sun.tools.javac.code.Lint.LintCategory; import com.sun.tools.javac.code.Source.Feature; +import com.sun.tools.javac.code.Symbol.ModuleSymbol; import com.sun.tools.javac.jvm.Target; import com.sun.tools.javac.resources.CompilerProperties.Errors; import com.sun.tools.javac.resources.CompilerProperties.Warnings; @@ -133,11 +134,23 @@ public boolean participatesInPreview(Symtab syms, Symbol s, Symbol previewSymbol return true; } + return participatesInPreview(syms, s.packge().modle); + } + + /** + * Returns true if module {@code m} is deemed to participate in the preview, and + * therefore no warnings or errors will be produced. + * + * @param syms the symbol table + * @param m the module to check + * @return true if {@code m} is participating in the preview of {@code previewSymbol} + */ + public boolean participatesInPreview(Symtab syms, ModuleSymbol m) { // If java.base's jdk.internal.javac package is exported to s's module then // s participates in the preview API return syms.java_base.exports.stream() .filter(ed -> ed.packge.fullname == names.jdk_internal_javac) - .anyMatch(ed -> ed.modules.contains(s.packge().modle)); + .anyMatch(ed -> ed.modules.contains(m)); } /** diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassReader.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassReader.java index bf6cca3375427..cfb3771a44715 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassReader.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassReader.java @@ -1204,7 +1204,8 @@ protected void read(Symbol sym, int attrLen) { Set flags = readRequiresFlags(nextChar()); if (rsym == syms.java_base && majorVersion >= V54.major) { if (flags.contains(RequiresFlag.TRANSITIVE) && - (majorVersion != Version.MAX().major || !previewClassFile)) { + (majorVersion != Version.MAX().major || !previewClassFile) && + !preview.participatesInPreview(syms, msym)) { throw badClassFile("bad.requires.flag", RequiresFlag.TRANSITIVE); } if (flags.contains(RequiresFlag.STATIC_PHASE)) { diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/util/Names.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/util/Names.java index d9aec7c459229..6c48490cf16ac 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/util/Names.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/util/Names.java @@ -127,7 +127,6 @@ public static Names instance(Context context) { // module names public final Name java_base; - public final Name java_se; public final Name jdk_unsupported; // attribute names @@ -316,7 +315,6 @@ public Names(Context context) { // module names java_base = fromString("java.base"); - java_se = fromString("java.se"); jdk_unsupported = fromString("jdk.unsupported"); // attribute names diff --git a/test/langtools/tools/javac/modules/EdgeCases.java b/test/langtools/tools/javac/modules/EdgeCases.java index 4c26271924f4d..dd68a5142b222 100644 --- a/test/langtools/tools/javac/modules/EdgeCases.java +++ b/test/langtools/tools/javac/modules/EdgeCases.java @@ -1179,7 +1179,7 @@ public class Test { log = new JavacTask(tb) .outdir(classes) .options("-XDrawDiagnostics", "-XDshould-stop.at=FLOW") - .callback(verifyJavaSEDependency(false, seenJavaSEDependency)) + .callback(verifyJavaSEDependency(true, seenJavaSEDependency)) .files(findJavaFiles(src)) .run(Task.Expect.FAIL) .writeAll() @@ -1187,8 +1187,7 @@ public class Test { List expected = List.of( "Test.java:2:8: compiler.err.preview.feature.disabled.plural: (compiler.misc.feature.module.imports)", - "Test.java:4:5: compiler.err.cant.resolve.location: kindname.class, ArrayList, , , (compiler.misc.location: kindname.class, test.Test, null)", - "2 errors"); + "1 error"); if (!expected.equals(log)) throw new Exception("expected output not found: " + log); @@ -1225,7 +1224,7 @@ public void finished(TaskEvent e) { t.getElements().getModuleElement("java.base"); ModuleElement javaSE = t.getElements().getModuleElement("java.se"); - RequiresDirective requiresJavaSE = + RequiresDirective requiresJavaBase = javaSE.getDirectives() .stream() .filter(d -> d.getKind() == DirectiveKind.REQUIRES) @@ -1233,9 +1232,9 @@ public void finished(TaskEvent e) { .filter(d -> d.getDependency() == javaBase) .findAny() .orElseThrow(); - if (requiresJavaSE.isTransitive() != expectedTransitive) { + if (requiresJavaBase.isTransitive() != expectedTransitive) { throw new AssertionError("Expected: " + expectedTransitive + ", " + - "but got: " + requiresJavaSE.isTransitive()); + "but got: " + requiresJavaBase.isTransitive()); } seenJavaSEDependency.set(true); }