diff options
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++) |