From 8a2413e4b3d26171af8bafe6cdaee3f7b583cfeb Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Tue, 18 Jun 2013 18:42:50 +0400 Subject: [PATCH] EA-47133 - SOE: GenericsUtil.getLeastUpperClassesInner --- .../src/com/intellij/psi/GenericsUtil.java | 9 ++++++--- .../genericsHighlighting/SOEInLeastUpperClass.java | 12 ++++++++++++ .../codeInsight/daemon/GenericsHighlightingTest.java | 1 + 3 files changed, 19 insertions(+), 3 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/SOEInLeastUpperClass.java diff --git a/java/java-psi-api/src/com/intellij/psi/GenericsUtil.java b/java/java-psi-api/src/com/intellij/psi/GenericsUtil.java index df91b8441048..481f80981eed 100644 --- a/java/java-psi-api/src/com/intellij/psi/GenericsUtil.java +++ b/java/java-psi-api/src/com/intellij/psi/GenericsUtil.java @@ -186,18 +186,21 @@ public class GenericsUtil { public static PsiClass[] getLeastUpperClasses(PsiClass aClass, PsiClass bClass) { if (InheritanceUtil.isInheritorOrSelf(aClass, bClass, true)) return new PsiClass[]{bClass}; Set supers = new LinkedHashSet(); - getLeastUpperClassesInner(aClass, bClass, supers); + Set visited = new HashSet(); + getLeastUpperClassesInner(aClass, bClass, supers, visited); return supers.toArray(new PsiClass[supers.size()]); } - private static void getLeastUpperClassesInner(PsiClass aClass, PsiClass bClass, Set supers) { + private static void getLeastUpperClassesInner(PsiClass aClass, PsiClass bClass, Set supers, Set visited) { if (bClass.isInheritor(aClass, true)) { addSuper(supers, aClass); } else { final PsiClass[] aSupers = aClass.getSupers(); for (PsiClass aSuper : aSupers) { - getLeastUpperClassesInner(aSuper, bClass, supers); + if (visited.add(aSuper)) { + getLeastUpperClassesInner(aSuper, bClass, supers, visited); + } } } } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/SOEInLeastUpperClass.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/SOEInLeastUpperClass.java new file mode 100644 index 000000000000..70ad2666c619 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/SOEInLeastUpperClass.java @@ -0,0 +1,12 @@ +interface A extends A {} +interface B {} + +class T implements A, B{ + T1 foo(A a, B b) { + return null; + } + + void bar (boolean a, A a1, B b1){ + T t = a ? a1 : b1; + } +} diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java index fca092470feb..2d42a723066e 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java @@ -287,6 +287,7 @@ public class GenericsHighlightingTest extends LightDaemonAnalyzerTestCase { public void testIDEA104100() {doTest(LanguageLevel.JDK_1_7, JavaSdkVersion.JDK_1_7, false);} public void testIDEA104160() {doTest(LanguageLevel.JDK_1_7, JavaSdkVersion.JDK_1_7, false);} + public void testSOEInLeastUpperClass() {doTest(LanguageLevel.JDK_1_7, JavaSdkVersion.JDK_1_7, false);} public void testJavaUtilCollections_NoVerify() throws Exception { PsiClass collectionsClass = getJavaFacade().findClass("java.util.Collections", GlobalSearchScope.moduleWithLibrariesScope(getModule()));