Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/ModuleBuilderTests.java100
-rw-r--r--org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/TypeSystem.java6
-rw-r--r--org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/UnresolvedReferenceBinding.java5
3 files changed, 106 insertions, 5 deletions
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 f8af4ddeb3..be1950e836 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
@@ -6105,6 +6105,106 @@ public class ModuleBuilderTests extends ModifyingResourceTests {
}
}
+ public void testBug522670() throws Exception {
+ if (!isJRE9) return;
+ Hashtable<String, String> javaCoreOptions = JavaCore.getOptions();
+ try {
+ Hashtable<String, String> newOptions=new Hashtable<>(javaCoreOptions);
+ newOptions.put(CompilerOptions.OPTION_Store_Annotations, JavaCore.ENABLED);
+ JavaCore.setOptions(newOptions);
+ IJavaProject p1 = setupModuleProject("util",
+ new String[] {
+ "src/module-info.java",
+ "module util {\n" +
+ " exports my.util;\n" +
+ "}\n" +
+ "",
+ "src/my/util/Data.java",
+ "package my.util;\n" +
+ "public class Data {\n" +
+ "}\n" +
+ "",
+ "src/my/util/AnnotatedInModule.java",
+ "package my.util;\n" +
+ "import static java.lang.annotation.ElementType.TYPE_USE;\n" +
+ "import java.lang.annotation.Target;\n" +
+ "@Target(TYPE_USE)\n" +
+ "@interface Y {\n" +
+ "}\n" +
+ "public abstract class AnnotatedInModule {\n" +
+ " abstract public @Y Data getTime();\n" +
+ "}\n" +
+ "",
+ });
+ IJavaProject p2 = setupModuleProject("util2",
+ new String[] {
+ "src/module-info.java",
+ "module util2 {\n" +
+ " exports my.util.nested;\n" +
+ "}\n" +
+ "",
+ "src/my/util/nested/Unrelated.java",
+ "package my.util.nested;\n" +
+ "class Unrelated {\n" +
+ "}\n" +
+ "",
+ });
+ String[] sources3 = {
+ "src/a/other/AnnotatedInOtherNonModule.java",
+ "package a.other;\n" +
+ "import static java.lang.annotation.ElementType.TYPE_USE;\n" +
+ "import java.lang.annotation.Target;\n" +
+ "import my.util.Data;\n" +
+ "@Target(TYPE_USE)\n" +
+ "@interface X {\n" +
+ "}\n" +
+ "public class AnnotatedInOtherNonModule {\n" +
+ " @X\n" +
+ " Data generationDate;\n" +
+ "}\n" +
+ "",
+ };
+ IClasspathAttribute[] attr = { JavaCore.newClasspathAttribute(IClasspathAttribute.MODULE, "true") };
+ // modulepath
+ IClasspathEntry[] deps3 = { JavaCore.newProjectEntry(p1.getPath(), null, false, attr, false) };
+ IJavaProject p3 = setupModuleProject("other", sources3, deps3);
+
+ String[] sources4 = {
+ "src/test/Test.java",
+ "package test;\n" +
+ "\n" +
+ "import a.other.AnnotatedInOtherNonModule;\n" +
+ "import my.util.AnnotatedInModule;\n" +
+ "import my.util.Data;\n" +
+ "\n" +
+ "public class Test extends AnnotatedInOtherNonModule {\n" +
+ " public Data f(AnnotatedInModule calendar) {\n" +
+ " return calendar.getTime();\n" +
+ " }\n" +
+ "}\n" +
+ "",
+ };
+ IClasspathEntry[] deps4 = { //
+ // modulepath (with split package my.util)
+ JavaCore.newProjectEntry(p1.getPath(), null, false, attr, false), //
+ JavaCore.newProjectEntry(p2.getPath(), null, false, attr, false), //
+ // classpath
+ JavaCore.newProjectEntry(p3.getPath()) //
+ };
+ IJavaProject p4 = setupModuleProject("test", sources4, deps4);
+ p4.getProject().getWorkspace().build(IncrementalProjectBuilder.FULL_BUILD, null);
+
+ assertNoErrors();
+ } finally {
+ JavaCore.setOptions(javaCoreOptions);
+ deleteProject("util");
+ deleteProject("util2");
+ deleteProject("other");
+ deleteProject("test");
+ }
+ }
+
+
protected void assertNoErrors() throws CoreException {
for (IProject p : getWorkspace().getRoot().getProjects()) {
int maxSeverity = p.findMaxProblemSeverity(null, true, IResource.DEPTH_INFINITE);
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/TypeSystem.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/TypeSystem.java
index cc07534a4b..c3058279b0 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/TypeSystem.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/TypeSystem.java
@@ -548,6 +548,9 @@ public class TypeSystem {
public void updateCaches(UnresolvedReferenceBinding unresolvedType, ReferenceBinding resolvedType) {
final int unresolvedTypeId = unresolvedType.id;
+ if (resolvedType.id != TypeIds.NoId) {
+ unresolvedType.id = resolvedType.id;
+ }
if (unresolvedTypeId != TypeIds.NoId) {
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=432977
TypeBinding[] derivedTypes = this.types[unresolvedTypeId];
@@ -555,7 +558,8 @@ public class TypeSystem {
if (derivedTypes[i] == null)
break;
if (derivedTypes[i] == unresolvedType) { //$IDENTITY-COMPARISON$
- resolvedType.id = unresolvedTypeId;
+ if(resolvedType.id == TypeIds.NoId)
+ resolvedType.id = unresolvedTypeId;
derivedTypes[i] = resolvedType;
}
}
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/UnresolvedReferenceBinding.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/UnresolvedReferenceBinding.java
index b80272adf3..6cb7126e02 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/UnresolvedReferenceBinding.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/UnresolvedReferenceBinding.java
@@ -119,9 +119,6 @@ ReferenceBinding resolve(LookupEnvironment environment, boolean convertGenericTo
// create a proxy for the missing BinaryType
targetType = environment.createMissingType(null, this.compoundName);
}
- if (targetType.id != TypeIds.NoId) {
- this.id = targetType.id;
- }
setResolvedType(targetType, environment);
}
if (convertGenericToRawType) {
@@ -147,7 +144,7 @@ public void swapUnresolved(UnresolvedReferenceBinding unresolvedType, ReferenceB
ReferenceBinding annotatedType = (ReferenceBinding) unannotatedType.clone(null);
this.resolvedType = annotatedType;
annotatedType.setTypeAnnotations(getTypeAnnotations(), environment.globalOptions.isAnnotationBasedNullAnalysisEnabled);
- annotatedType.id = unannotatedType.id = this.id;
+
environment.updateCaches(this, annotatedType);
if (this.wrappers != null)
for (int i = 0, l = this.wrappers.length; i < l; i++)

Back to the top