diff --git a/java/compiler/impl/src/com/intellij/compiler/backwardRefs/CompilerReferenceReader.java b/java/compiler/impl/src/com/intellij/compiler/backwardRefs/CompilerReferenceReader.java index 8bd8335a8f23..a601ff96762a 100644 --- a/java/compiler/impl/src/com/intellij/compiler/backwardRefs/CompilerReferenceReader.java +++ b/java/compiler/impl/src/com/intellij/compiler/backwardRefs/CompilerReferenceReader.java @@ -62,7 +62,7 @@ class CompilerReferenceReader { } else { LightRef.LightClassHierarchyElementDef hierarchyElement = ((LightRef.LightMember)ref).getOwner(); - hierarchy = getWholeHierarchy(hierarchyElement, checkBaseClassAmbiguity); + hierarchy = getWholeHierarchy(hierarchyElement, checkBaseClassAmbiguity, -1); } if (hierarchy == null) return null; TIntHashSet set = new TIntHashSet(); @@ -222,13 +222,16 @@ class CompilerReferenceReader { } @Nullable("return null if the class hierarchy contains ambiguous qualified names") - LightRef.NamedLightRef[] getWholeHierarchy(LightRef.LightClassHierarchyElementDef hierarchyElement, boolean checkBaseClassAmbiguity) { + LightRef.NamedLightRef[] getWholeHierarchy(LightRef.LightClassHierarchyElementDef hierarchyElement, boolean checkBaseClassAmbiguity, int interruptNumber) { try { Set result = new THashSet<>(); Queue q = new Queue<>(10); q.addLast(hierarchyElement); while (!q.isEmpty()) { LightRef.NamedLightRef curClass = q.pullFirst(); + if (interruptNumber != -1 && result.size() > interruptNumber) { + break; + } if (result.add(curClass)) { if (checkBaseClassAmbiguity || curClass != hierarchyElement) { if (hasMultipleDefinitions(curClass)) { @@ -245,7 +248,7 @@ class CompilerReferenceReader { }); } } - return result.toArray(new LightRef.NamedLightRef[result.size()]); + return result.toArray(LightRef.NamedLightRef.EMPTY_ARRAY); } catch (StorageException e) { throw new RuntimeException(e); diff --git a/java/compiler/impl/src/com/intellij/compiler/backwardRefs/CompilerReferenceServiceImpl.java b/java/compiler/impl/src/com/intellij/compiler/backwardRefs/CompilerReferenceServiceImpl.java index 45fc80983acf..62f263ee4202 100644 --- a/java/compiler/impl/src/com/intellij/compiler/backwardRefs/CompilerReferenceServiceImpl.java +++ b/java/compiler/impl/src/com/intellij/compiler/backwardRefs/CompilerReferenceServiceImpl.java @@ -234,9 +234,10 @@ public class CompilerReferenceServiceImpl extends CompilerReferenceServiceEx imp .filter(r -> r instanceof LightRef.JavaLightMethodRef) .map(r -> (LightRef.JavaLightMethodRef) r) .flatMap(r -> { - LightRef.NamedLightRef[] hierarchy = myReader.getWholeHierarchy(r.getOwner(), false); + LightRef.NamedLightRef[] hierarchy = myReader.getWholeHierarchy(r.getOwner(), false, 10); return hierarchy == null ? Stream.empty() : Arrays.stream(hierarchy).map(c -> r.override(c.getName())); }) + .distinct() .map(r -> { int count = myReader.getOccurrenceCount(r); return count <= 1 ? null : new OccurrencesAware<>( diff --git a/jps/jps-builders/src/org/jetbrains/jps/backwardRefs/LightRef.java b/jps/jps-builders/src/org/jetbrains/jps/backwardRefs/LightRef.java index ff91080a2522..ffd5b592eb05 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/backwardRefs/LightRef.java +++ b/jps/jps-builders/src/org/jetbrains/jps/backwardRefs/LightRef.java @@ -35,6 +35,8 @@ public interface LightRef extends RW.Savable { LightRef override(int newOwner); interface NamedLightRef extends LightRef { + NamedLightRef[] EMPTY_ARRAY = new NamedLightRef[0]; + int getName(); }