Bug 544432 - [9] Eclipse compiler error "The type com.a.A is not
accessible" while javac works
Change-Id: I9b0985187b14356aef6300312265793343a1e812
Signed-off-by: Stephan Herrmann <stephan.herrmann@berlin.de>
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/ModuleBuilderTests.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/ModuleBuilderTests.java
index 725f615..b80de70 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/ModuleBuilderTests.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/ModuleBuilderTests.java
@@ -7992,6 +7992,53 @@
Util.flushDirectoryContent(outputDir);
}
}
+
+ public void testBug544432() throws CoreException {
+ IJavaProject prjA = createJava9Project("A");
+ IJavaProject prjB = createJava9Project("B");
+ try {
+ createFolder("A/src/com/a");
+ createFile("A/src/com/a/A.java",
+ "package com.a;\n" +
+ "\n" +
+ "public class A {}\n");
+ createFile("A/src/module-info.java",
+ "open module com.a {\n" +
+ " exports com.a;\n" +
+ "}\n");
+
+ addModularProjectEntry(prjB, prjA);
+ createFolder("B/src/com/a/b");
+ String bPath = "B/src/com/a/b/B.java";
+ String bSource =
+ "package com.a.b;\n" +
+ "import com.a.A;\n" +
+ "public class B {\n" +
+ " \n" +
+ " public static void main(String[] args) {\n" +
+ " A a = new A();\n" +
+ " System.out.println(a);\n" +
+ " }\n" +
+ "}\n";
+ createFile(bPath, bSource);
+ createFile("B/src/module-info.java",
+ "open module com.a.b {\n" +
+ " requires com.a;\n" +
+ "}\n");
+ getWorkspace().build(IncrementalProjectBuilder.FULL_BUILD, null);
+ assertNoErrors();
+
+ this.problemRequestor.initialize(bSource.toCharArray());
+ getCompilationUnit(bPath).getWorkingCopy(this.wcOwner, null);
+ assertProblems("unexpected problems",
+ "----------\n" +
+ "----------\n",
+ this.problemRequestor);
+ } finally {
+ deleteProject(prjA);
+ deleteProject(prjB);
+ }
+ }
protected void assertNoErrors() throws CoreException {
for (IProject p : getWorkspace().getRoot().getProjects()) {
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ModuleBinding.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ModuleBinding.java
index 32df973..3b31a80 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ModuleBinding.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ModuleBinding.java
@@ -564,8 +564,16 @@
declaringModuleNames = moduleEnv.getUniqueModulesDeclaringPackage(parentName, name, nameForLookup());
if (declaringModuleNames != null) {
if (CharOperation.containsEqual(declaringModuleNames, this.moduleName)) {
- // declared here, not yet known, so create it now:
- binding = new PackageBinding(subPkgCompoundName, parent, this.environment, this);
+ if (parent instanceof SplitPackageBinding) {
+ // parent.getPackage0() may have been too shy, so drill into the split:
+ PackageBinding singleParent = ((SplitPackageBinding) parent).getIncarnation(this);
+ if (singleParent != null)
+ binding = singleParent.getPackage0(name);
+ }
+ if (binding == null) {
+ // declared here, not yet known, so create it now:
+ binding = new PackageBinding(subPkgCompoundName, parent, this.environment, this);
+ }
} else if (considerRequiredModules) {
// visible but foreign (when current is unnamed or auto):
for (char[] declaringModuleName : declaringModuleNames) {