From 79befff8c74c03d4eddce26d76c1c8fb6edf8d79 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Mon, 25 Jun 2012 14:01:15 +0400 Subject: [PATCH] SOE in case of cyclic out-of-project classes --- .../intellij/psi/util/InheritanceUtil.java | 29 ++++++++++--------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/java/java-psi-api/src/com/intellij/psi/util/InheritanceUtil.java b/java/java-psi-api/src/com/intellij/psi/util/InheritanceUtil.java index aac2fcbc77c7..2cd5c7446a52 100644 --- a/java/java-psi-api/src/com/intellij/psi/util/InheritanceUtil.java +++ b/java/java-psi-api/src/com/intellij/psi/util/InheritanceUtil.java @@ -53,7 +53,7 @@ public class InheritanceUtil { return isInheritorOrSelf(aClass, baseClass, checkDeep); } - public static boolean processSupers(@Nullable PsiClass aClass, boolean includeSelf, Processor superProcessor) { + public static boolean processSupers(@Nullable PsiClass aClass, boolean includeSelf, @NotNull Processor superProcessor) { if (aClass == null) return true; if (includeSelf && !superProcessor.process(aClass)) return false; @@ -61,7 +61,7 @@ public class InheritanceUtil { return processSupers(aClass, superProcessor, new THashSet()); } - private static boolean processSupers(@NotNull PsiClass aClass, Processor superProcessor, Set visited) { + private static boolean processSupers(@NotNull PsiClass aClass, @NotNull Processor superProcessor, @NotNull Set visited) { if (!visited.add(aClass)) return true; for (final PsiClass intf : aClass.getInterfaces()) { @@ -82,11 +82,11 @@ public class InheritanceUtil { return false; } - public static boolean isInheritor(@Nullable PsiClass psiClass, final String baseClassName) { + public static boolean isInheritor(@Nullable PsiClass psiClass, @NotNull final String baseClassName) { return isInheritor(psiClass, false, baseClassName); } - public static boolean isInheritor(@Nullable PsiClass psiClass, final boolean strict, final String baseClassName) { + public static boolean isInheritor(@Nullable PsiClass psiClass, final boolean strict, @NotNull final String baseClassName) { if (psiClass == null) { return false; } @@ -105,21 +105,22 @@ public class InheritanceUtil { * @param results * @param includeNonProject */ - public static void getSuperClasses(PsiClass aClass, Set results, boolean includeNonProject) { - getSuperClassesOfList(aClass.getSuperTypes(), results, includeNonProject); + public static void getSuperClasses(@NotNull PsiClass aClass, @NotNull Set results, boolean includeNonProject) { + getSuperClassesOfList(aClass.getSuperTypes(), results, includeNonProject, new THashSet(), aClass.getManager()); } - public static void getSuperClassesOfList(PsiClassType[] types, Set results, - boolean includeNonProject) { + private static void getSuperClassesOfList(@NotNull PsiClassType[] types, + @NotNull Set results, + boolean includeNonProject, + @NotNull Set visited, + @NotNull PsiManager manager) { for (PsiClassType type : types) { PsiClass resolved = type.resolve(); - if (resolved != null) { - if (!results.contains(resolved)) { - if (includeNonProject || resolved.getManager().isInProject(resolved)) { - results.add(resolved); - } - getSuperClasses(resolved, results, includeNonProject); + if (resolved != null && visited.add(resolved)) { + if (includeNonProject || manager.isInProject(resolved)) { + results.add(resolved); } + getSuperClassesOfList(resolved.getSuperTypes(), results, includeNonProject, visited, manager); } } }