### Eclipse Workspace Patch 1.0 #P org.eclipse.jdt.core Index: search/org/eclipse/jdt/internal/core/search/matching/SuperTypeReferenceLocator.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/SuperTypeReferenceLocator.java,v retrieving revision 1.18 diff -u -r1.18 SuperTypeReferenceLocator.java --- search/org/eclipse/jdt/internal/core/search/matching/SuperTypeReferenceLocator.java 18 Sep 2008 15:24:57 -0000 1.18 +++ search/org/eclipse/jdt/internal/core/search/matching/SuperTypeReferenceLocator.java 2 Sep 2010 14:42:47 -0000 @@ -38,6 +38,7 @@ return nodeSet.addMatch(node, this.pattern.mustResolve ? POSSIBLE_MATCH : ACCURATE_MATCH); char[] typeRefSimpleName = null; + removeTypeArgumentsMatches(node, nodeSet); if (node instanceof SingleTypeReference) { typeRefSimpleName = ((SingleTypeReference) node).token; } else { // QualifiedTypeReference @@ -73,6 +74,45 @@ protected int referenceType() { return IJavaElement.TYPE; } +/* + * When the type reference is a type argument it cannot be a super type + * reference as well. Hence, this method seek through type arguments of + * the given type reference if any to remove any corresponding matches already + * stored in the node set... + * + * @see "https://bugs.eclipse.org/bugs/show_bug.cgi?id=322979" + */ +private void removeTypeArgumentsMatches(TypeReference typeReference, MatchingNodeSet nodeSet) { + if (typeReference instanceof ParameterizedSingleTypeReference) { + ParameterizedSingleTypeReference parameterizedTypeReference = (ParameterizedSingleTypeReference) typeReference; + if (parameterizedTypeReference.typeArguments != null) { + removeTypeArgumentsMatches(parameterizedTypeReference.typeArguments, nodeSet); + } + } + if (typeReference instanceof ParameterizedQualifiedTypeReference) { + ParameterizedQualifiedTypeReference parameterizedTypeReference = (ParameterizedQualifiedTypeReference) typeReference; + if (parameterizedTypeReference.typeArguments != null) { + TypeReference[][] typesArguments = parameterizedTypeReference.typeArguments; + int length = typesArguments.length; + for (int i=0; i{\n"+ + "public int compareTo(Object o) {\n"+ + "return 0;\n"+ + "}\n"+ + "}\n"); + waitUntilIndexesReady(); + int mask = IJavaSearchScope.APPLICATION_LIBRARIES | IJavaSearchScope.SOURCES ; + IJavaSearchScope scope = SearchEngine.createJavaSearchScope(new IJavaElement[] { project }, mask); + this.resultCollector.showAccuracy(true); + this.resultCollector.showSelection(); + search("Object", TYPE, IMPLEMENTORS, scope); + assertSearchResults( + "Test.java Test [public class Test extends !|Object|! implements Comparable{] EXACT_MATCH" + ); + } finally { + deleteProject("P"); + } +} + +public void testBug322979b() throws CoreException { + try + { + IJavaProject project = createJavaProject("P", new String[] {""}, new String[] {"JCL15_LIB"}, "", "1.5"); + createFile("/P/Test.java", + "public class Test extends java.lang.Object implements Comparable{\n"+ + "public int compareTo(Object o) {\n"+ + "return 0;\n"+ + "}\n"+ + "}\n"); + waitUntilIndexesReady(); + int mask = IJavaSearchScope.APPLICATION_LIBRARIES | IJavaSearchScope.SOURCES ; + IJavaSearchScope scope = SearchEngine.createJavaSearchScope(new IJavaElement[] { project }, mask); + IType type = getClassFile("P", getExternalJCLPathString("1.5"), "java.lang", "Object.class").getType(); + this.resultCollector.showAccuracy(true); + this.resultCollector.showSelection(); + search(type, IMPLEMENTORS, scope); + assertSearchResults( + "Test.java Test [public class Test extends !|java.lang.Object|! implements Comparable{] EXACT_MATCH" + ); + } finally { + deleteProject("P"); + } +} + +public void testBug322979c() throws CoreException { + try + { + IJavaProject project = createJavaProject("P", new String[] {""}, new String[] {"JCL15_LIB"}, "", "1.5"); + createFile("/P/Test.java", + "public class Test extends Object implements I01a, I01b, I01c {\n" + + "}\n" + + "interface I01a {}\n" + + "interface I01b {}\n" + + "interface I01c {}\n" + ); + waitUntilIndexesReady(); + int mask = IJavaSearchScope.APPLICATION_LIBRARIES | IJavaSearchScope.SOURCES ; + IJavaSearchScope scope = SearchEngine.createJavaSearchScope(new IJavaElement[] { project }, mask); + this.resultCollector.showSelection(); + search("java.lang.Object", TYPE, IMPLEMENTORS, scope); + assertSearchResults( + "Test.java Test [public class Test extends !|Object|! implements I01a, I01b, I01c {] EXACT_MATCH" + ); + } finally { + deleteProject("P"); + } +} + +public void testBug322979d() throws CoreException { + try + { + IJavaProject project = createJavaProject("P", new String[] {""}, new String[] {"JCL15_LIB"}, "", "1.5"); + createFile("/P/Test.java", + "public class Test extends Object implements I01<\n" + + " I02<\n" + + " I03>,\n" + + " I03, I02>>\n" + + " >,\n" + + " I01>> {\n" + + "}\n" + + "interface I01 {}\n" + + "interface I02 {}\n" + + "interface I03 {}\n" + ); + waitUntilIndexesReady(); + int mask = IJavaSearchScope.APPLICATION_LIBRARIES | IJavaSearchScope.SOURCES ; + IJavaSearchScope scope = SearchEngine.createJavaSearchScope(new IJavaElement[] { project }, mask); + this.resultCollector.showSelection(); + search("Object", TYPE, IMPLEMENTORS, scope); + assertSearchResults( + "Test.java Test [public class Test extends !|Object|! implements I01<] EXACT_MATCH" + ); + } finally { + deleteProject("P"); + } +} + +public void testBug322979e() throws CoreException { + try + { + IJavaProject project = createJavaProject("P", new String[] {""}, new String[] {"JCL15_LIB"}, "", "1.5"); + createFile("/P/Test.java", + "public class Test extends Object implements I01<\n" + + " I02<\n" + + " I03>,\n" + + " I03, I02>>\n" + + " >,\n" + + " I01>> {\n" + + "}\n" + + "interface I01 {}\n" + + "interface I02 {}\n" + + "interface I03 {}\n" + ); + waitUntilIndexesReady(); + int mask = IJavaSearchScope.APPLICATION_LIBRARIES | IJavaSearchScope.SOURCES ; + IJavaSearchScope scope = SearchEngine.createJavaSearchScope(new IJavaElement[] { project }, mask); + this.resultCollector.showSelection(); + search("Object", TYPE, REFERENCES, scope); + assertSearchResults( + "Test.java Test [public class Test extends !|Object|! implements I01<] EXACT_MATCH\n" + + "Test.java Test [ I03>,] EXACT_MATCH\n" + + "Test.java Test [ I02>,] EXACT_MATCH\n" + + "Test.java Test [ I03, I02>>] EXACT_MATCH\n" + + "Test.java Test [ I03, I02>>] EXACT_MATCH\n" + + "Test.java Test [ I03, I02>>] EXACT_MATCH\n" + + "Test.java Test [ I03, I02>>] EXACT_MATCH\n" + + "Test.java Test [ I01>> {] EXACT_MATCH\n" + + ""+ getExternalJCLPathString("1.5") + " java.lang.Object java.lang.Object.clone() EXACT_MATCH\n" + + ""+ getExternalJCLPathString("1.5") + " boolean java.lang.Object.equals(java.lang.Object) EXACT_MATCH\n" + + ""+ getExternalJCLPathString("1.5") + " java.lang.Class java.lang.Object.getClass() EXACT_MATCH" + ); + } finally { + deleteProject("P"); + } +} + +public void testBug322979f() throws CoreException { + try + { + IJavaProject project = createJavaProject("P", new String[] {""}, new String[] {"JCL15_LIB"}, "", "1.5"); + createFile("/P/Test.java", + "public class Test extends Object implements I01<\n" + + " I02<\n" + + " I03>,\n" + + " I03, I02>>\n" + + " >,\n" + + " I01>> {\n" + + "}\n" + + "interface I01 {}\n" + + "interface I02 {}\n" + + "interface I03 {}\n" + ); + waitUntilIndexesReady(); + int mask = IJavaSearchScope.APPLICATION_LIBRARIES | IJavaSearchScope.SOURCES ; + IJavaSearchScope scope = SearchEngine.createJavaSearchScope(new IJavaElement[] { project }, mask); + this.resultCollector.showSelection(); + search("Object", TYPE, REFERENCES | SUPERTYPE_TYPE_REFERENCE, scope); + assertSearchResults( + "Test.java Test [public class Test extends !|Object|! implements I01<] EXACT_MATCH" + ); + } finally { + deleteProject("P"); + } +} + +public void testBug322979g() throws CoreException { + try + { + IJavaProject project = createJavaProject("P", new String[] {""}, new String[] {"JCL15_LIB"}, "", "1.5"); + createFile("/P/Test.java", + "public class Test extends Object implements I.B>.C.B.C>>> {\n" + + "}\n" + + "interface I {\n" + + "}\n" + + "class A {\n" + + " class B {\n" + + " class C {}\n" + + " }\n" + + "}\n" + ); + waitUntilIndexesReady(); + int mask = IJavaSearchScope.APPLICATION_LIBRARIES | IJavaSearchScope.SOURCES ; + IJavaSearchScope scope = SearchEngine.createJavaSearchScope(new IJavaElement[] { project }, mask); + this.resultCollector.showSelection(); + search("Object", TYPE, IMPLEMENTORS, scope); + assertSearchResults( + "Test.java Test [public class Test extends !|Object|! implements I.B>.C.B.C>>> {] EXACT_MATCH" + ); + } finally { + deleteProject("P"); + } +} + /** * @bug 324109: [search] Java search shows incorrect results as accurate matches * @test search of method declaration off missing types should report potential matches and not accurate.