EA-47133 - SOE: GenericsUtil.getLeastUpperClassesInner

This commit is contained in:
Anna Kozlova
2013-06-18 18:44:29 +04:00
parent c403e1bacb
commit 8a2413e4b3
3 changed files with 19 additions and 3 deletions
@@ -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<PsiClass> supers = new LinkedHashSet<PsiClass>();
getLeastUpperClassesInner(aClass, bClass, supers);
Set<PsiClass> visited = new HashSet<PsiClass>();
getLeastUpperClassesInner(aClass, bClass, supers, visited);
return supers.toArray(new PsiClass[supers.size()]);
}
private static void getLeastUpperClassesInner(PsiClass aClass, PsiClass bClass, Set<PsiClass> supers) {
private static void getLeastUpperClassesInner(PsiClass aClass, PsiClass bClass, Set<PsiClass> supers, Set<PsiClass> 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);
}
}
}
}
@@ -0,0 +1,12 @@
<error descr="Cyclic inheritance involving 'A'">interface A extends A</error> {}
interface B {}
<error descr="Cyclic inheritance involving 'A'">class T implements A, B</error>{
<T1> T1 foo(A a, B b) {
return null;
}
void bar (boolean a, A a1, B b1){
<error descr="Incompatible types. Found: 'java.lang.Object', required: 'T'">T t = a ? a1 : b1;</error>
}
}
@@ -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()));