From 2e5a6537773d740db22b707fe196da0f5dc2d942 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Tue, 19 Jan 2016 16:31:41 +0100 Subject: [PATCH] inference: reuse dependencies graph --- .../resolve/graphInference/InferenceSession.java | 14 ++++++-------- .../graphInference/InferenceVariablesOrder.java | 7 +++++-- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java index 4dfe008219e6..4ced9fde48ed 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java @@ -570,9 +570,9 @@ public class InferenceSession { } PsiSubstitutor prepareSubstitution() { - ArrayList allVars = new ArrayList(myInferenceVariables); - while (!allVars.isEmpty()) { - final List variables = InferenceVariablesOrder.resolveOrder(allVars, this); + Iterator> iterator = InferenceVariablesOrder.resolveOrderIterator(myInferenceVariables, this); + while (iterator.hasNext()) { + final List variables = iterator.next(); for (InferenceVariable inferenceVariable : variables) { final PsiTypeParameter typeParameter = inferenceVariable.getParameter(); PsiType instantiation = inferenceVariable.getInstantiation(); @@ -583,7 +583,6 @@ public class InferenceSession { .put(typeParameter, JavaPsiFacade.getInstance(typeParameter.getProject()).getElementFactory().createType(typeParameter)); } } - allVars.removeAll(variables); } return mySiteSubstitutor; } @@ -1053,11 +1052,10 @@ public class InferenceSession { private PsiSubstitutor resolveSubsetOrdered(Set varsToResolve, PsiSubstitutor siteSubstitutor) { PsiSubstitutor substitutor = siteSubstitutor; - final HashSet copy = new HashSet(varsToResolve); - while (!copy.isEmpty()) { - final List vars = InferenceVariablesOrder.resolveOrder(copy, this); + final Iterator> varsIterator = InferenceVariablesOrder.resolveOrderIterator(varsToResolve, this); + while (varsIterator.hasNext()) { + List vars = varsIterator.next(); final PsiSubstitutor resolveSubset = resolveSubset(vars, substitutor); - copy.removeAll(vars); substitutor = substitutor.putAll(resolveSubset); } return substitutor; diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceVariablesOrder.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceVariablesOrder.java index 1c91b060b6a8..65bcac7e6e80 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceVariablesOrder.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceVariablesOrder.java @@ -27,8 +27,11 @@ import java.util.*; */ public class InferenceVariablesOrder { - public static List resolveOrder(Collection vars, InferenceSession session) { + return resolveOrderIterator(vars, session).next(); + } + + public static Iterator> resolveOrderIterator(Collection vars, InferenceSession session) { Map> nodes = new LinkedHashMap>(); for (InferenceVariable var : vars) { @@ -52,7 +55,7 @@ public class InferenceVariablesOrder { public List fun(InferenceGraphNode node) { return node.getValue(); } - }).iterator().next(); + }).iterator(); } public static List>> tarjan(Collection> nodes) {