optionsMap) {
@@ -2127,6 +2134,14 @@ && getSeverity(ExplicitlyClosedAutoCloseable) == ProblemSeverities.Ignore) {
this.enableJdtDebugCompileMode = false;
}
}
+
+ if ((optionValue = optionsMap.get(OPTION_IgnoreUnnamedModuleForSplitPackage)) != null) {
+ if (ENABLED.equals(optionValue)) {
+ this.ignoreUnnamedModuleForSplitPackage = true;
+ } else if (DISABLED.equals(optionValue)) {
+ this.ignoreUnnamedModuleForSplitPackage = false;
+ }
+ }
}
private String[] stringToNameList(String optionValue) {
@@ -2263,6 +2278,7 @@ public String toString() {
buf.append("\n\t- API leak: ").append(getSeverityString(APILeak)); //$NON-NLS-1$
buf.append("\n\t- unstable auto module name: ").append(getSeverityString(UnstableAutoModuleName)); //$NON-NLS-1$
buf.append("\n\t- SuppressWarnings not fully analysed: ").append(getSeverityString(SuppressWarningsNotAnalysed)); //$NON-NLS-1$
+ buf.append("\n\t- ignore package from unnamed module: ").append(this.ignoreUnnamedModuleForSplitPackage ? ENABLED : DISABLED); //$NON-NLS-1$
return buf.toString();
}
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment.java
index 3ca49466f59..2236c390ae9 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment.java
@@ -110,6 +110,7 @@ public class LookupEnvironment implements ProblemReasons, TypeConstants {
private SimpleLookupTable uniqueGetClassMethodBinding; // https://bugs.eclipse.org/bugs/show_bug.cgi?id=300734
boolean useModuleSystem; // true when compliance >= 9 and nameEnvironment is module aware
+ boolean ignoreUnnamedModule;
// key is a string with the module name value is a module binding
public HashtableOfModule knownModules; // SHARED
@@ -180,6 +181,7 @@ public LookupEnvironment(ITypeRequestor typeRequestor, CompilerOptions globalOpt
this.knownModules = new HashtableOfModule();
this.useModuleSystem = nameEnvironment instanceof IModuleAwareNameEnvironment && globalOptions.complianceLevel >= ClassFileConstants.JDK9;
this.resolutionListeners = new IQualifiedTypeResolutionListener[0];
+ this.ignoreUnnamedModule = this.globalOptions.ignoreUnnamedModuleForSplitPackage;
}
/** Construct a specific LookupEnvironment, corresponding to the given module. */
@@ -204,6 +206,7 @@ public LookupEnvironment(ITypeRequestor typeRequestor, CompilerOptions globalOpt
this.typeSystem = rootEnv.typeSystem;
// knownModules is unused in specific LookupEnvironments
this.useModuleSystem = rootEnv.useModuleSystem;
+ this.ignoreUnnamedModule = this.globalOptions.ignoreUnnamedModuleForSplitPackage;
}
// NOTE: only for resolving!
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/SplitPackageBinding.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/SplitPackageBinding.java
index b807fda8808..740751fcdc0 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/SplitPackageBinding.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/SplitPackageBinding.java
@@ -258,23 +258,33 @@ public boolean isDeclaredIn(ModuleBinding moduleBinding) {
@Override
public PackageBinding getVisibleFor(ModuleBinding clientModule, boolean preferLocal) {
- int visibleCount = 0;
- PlainPackageBinding unique = null;
+ int visibleCountInNamedModules = 0;
+ PlainPackageBinding uniqueInNamedModules = null;
+ PlainPackageBinding bindingInUnnamedModule = null;
for (PlainPackageBinding incarnation : this.incarnations) {
if (incarnation.hasCompilationUnit(false)) {
if (preferLocal && incarnation.enclosingModule == clientModule) {
return incarnation;
} else {
if (clientModule.canAccess(incarnation)) {
- visibleCount++;
- unique = incarnation;
+ if (incarnation.enclosingModule.isUnnamed()) { // TODO: check preference
+ bindingInUnnamedModule = incarnation;
+ } else {
+ visibleCountInNamedModules++;
+ uniqueInNamedModules = incarnation;
+ }
}
}
}
}
- if (visibleCount > 1)
+ if (visibleCountInNamedModules > 1)
return this; // conflict, return split
- return unique;
+ else if (visibleCountInNamedModules == 1)
+ if (this.environment.ignoreUnnamedModule || bindingInUnnamedModule == null)
+ return uniqueInNamedModules;
+ else
+ return this;
+ return bindingInUnnamedModule;
}
@Override
diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/core/JavaCore.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/core/JavaCore.java
index 4fcdbc92a1e..745afbabd8e 100644
--- a/org.eclipse.jdt.core/model/org/eclipse/jdt/core/JavaCore.java
+++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/core/JavaCore.java
@@ -2645,6 +2645,20 @@ public final class JavaCore extends Plugin {
* @since 3.18
*/
public static final String COMPILER_PB_REPORT_PREVIEW_FEATURES = PLUGIN_ID + ".compiler.problem.reportPreviewFeatures"; //$NON-NLS-1$
+
+ /**
+ * Compiler option ID: Ignore unnamed module for split package.
+ * When enabled, the compiler will ignore the unnamed module when a package is defined in both a named module and the unnamed module.
+ *
+ *
+ * - Option id:
"org.eclipse.jdt.core.compiler.ignoreUnnamedModuleForSplitPackage"
+ * - Possible values:
{ "enabled", "disabled" }
+ * - Default:
"disabled"
+ *
+ * @category CompilerOptionID
+ * @since 3.32
+ */
+ public static final String COMPILER_IGNORE_UNNAMED_MODULE_FOR_SPLIT_PACKAGE = PLUGIN_ID + ".compiler.ignoreUnnamedModuleForSplitPackage"; //$NON-NLS-1$"
/**
* Core option ID: Set the timeout value for retrieving the method's parameter names from javadoc.
* Timeout in milliseconds to retrieve the method's parameter names from javadoc.
diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JavaCorePreferenceInitializer.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JavaCorePreferenceInitializer.java
index c9991e0ef2f..0bfbcc32599 100644
--- a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JavaCorePreferenceInitializer.java
+++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JavaCorePreferenceInitializer.java
@@ -63,6 +63,7 @@ public void initializeDefaultPreferences() {
defaultOptionsMap.put(JavaCore.COMPILER_TASK_CASE_SENSITIVE, JavaCore.ENABLED);
defaultOptionsMap.put(JavaCore.COMPILER_DOC_COMMENT_SUPPORT, JavaCore.ENABLED);
defaultOptionsMap.put(JavaCore.COMPILER_PB_FORBIDDEN_REFERENCE, JavaCore.ERROR);
+ defaultOptionsMap.put(JavaCore.COMPILER_IGNORE_UNNAMED_MODULE_FOR_SPLIT_PACKAGE, JavaCore.DISABLED);
// Builder settings
defaultOptionsMap.put(JavaCore.CORE_JAVA_BUILD_RESOURCE_COPY_FILTER, ""); //$NON-NLS-1$