From d30e4bcedaa10db0db16d0d3948322aec75c1c88 Mon Sep 17 00:00:00 2001 From: peter Date: Fri, 24 Jun 2016 22:59:36 +0200 Subject: [PATCH] stub hierarchy: mark binary classes also incomplete when unable to resolve their supers --- .../impl/StubHierarchyConnector.java | 52 +++++++++++-------- 1 file changed, 29 insertions(+), 23 deletions(-) diff --git a/java/java-impl/src/com/intellij/psi/stubsHierarchy/impl/StubHierarchyConnector.java b/java/java-impl/src/com/intellij/psi/stubsHierarchy/impl/StubHierarchyConnector.java index 395569fee488..9ae2fa34c197 100644 --- a/java/java-impl/src/com/intellij/psi/stubsHierarchy/impl/StubHierarchyConnector.java +++ b/java/java-impl/src/com/intellij/psi/stubsHierarchy/impl/StubHierarchyConnector.java @@ -29,6 +29,23 @@ public class StubHierarchyConnector { myResolve = new StubResolver(symbols, this); } + private void resolveName(Symbol.ClassSymbol place, QualifiedName name, Set result) throws IncompleteHierarchyException { + if (place.isCompiled()) { + Symbol.ClassSymbol[] candidates = myResolve.findGlobalType(name); + if (candidates.length == 0) { + throw new IncompleteHierarchyException(); + } + + Collections.addAll(result, candidates); + } else { + for (Symbol symbol : myResolve.resolveBase(place, name.myComponents)) { + if (symbol instanceof Symbol.ClassSymbol) { + result.add((Symbol.ClassSymbol)symbol); + } + } + } + } + void connect(Symbol sym) { Symbol.ClassSymbol c = (Symbol.ClassSymbol) sym; @@ -37,39 +54,28 @@ public class StubHierarchyConnector { } // Determine supertype. - Set supertypes = new HashSet(); + Set supertypes = new HashSet<>(); for (QualifiedName name : c.mySuperNames) { - if (c.isCompiled()) { - if (name != null) { - Collections.addAll(supertypes, myResolve.findGlobalType(name)); - } - } else { - try { - supertypes.addAll(myResolve.resolveBase(c, name.myComponents)); - } - catch (IncompleteHierarchyException ignore) { - c.markHierarchyIncomplete(); - break; - } + try { + resolveName(c, name, supertypes); + } + catch (IncompleteHierarchyException ignore) { + c.markHierarchyIncomplete(); + return; } } if (isJavaLangObject(c) || c.isHierarchyIncomplete()) { c.mySuperClasses = Symbol.ClassSymbol.EMPTY_ARRAY; } else { - for (Iterator iter = supertypes.iterator(); iter.hasNext();) { - Symbol s = iter.next(); - if (!(s instanceof Symbol.ClassSymbol) || isJavaLangObject(s)) { + for (Iterator iter = supertypes.iterator(); iter.hasNext();) { + Symbol.ClassSymbol s = iter.next(); + if (isJavaLangObject(s)) { iter.remove(); } } - if (supertypes.isEmpty()) { - c.mySuperClasses = Symbol.ClassSymbol.EMPTY_ARRAY; - } - else { - //noinspection SuspiciousToArrayCall - c.mySuperClasses = supertypes.toArray(new Symbol.ClassSymbol[supertypes.size()]); - } + c.mySuperClasses = + supertypes.isEmpty() ? Symbol.ClassSymbol.EMPTY_ARRAY : supertypes.toArray(new Symbol.ClassSymbol[supertypes.size()]); } // cleaning up