inference: reuse dependencies graph

This commit is contained in:
Anna Kozlova
2016-01-19 20:46:08 +01:00
parent 0d1cca1cd1
commit 2e5a653777
2 changed files with 11 additions and 10 deletions
@@ -570,9 +570,9 @@ public class InferenceSession {
}
PsiSubstitutor prepareSubstitution() {
ArrayList<InferenceVariable> allVars = new ArrayList<InferenceVariable>(myInferenceVariables);
while (!allVars.isEmpty()) {
final List<InferenceVariable> variables = InferenceVariablesOrder.resolveOrder(allVars, this);
Iterator<List<InferenceVariable>> iterator = InferenceVariablesOrder.resolveOrderIterator(myInferenceVariables, this);
while (iterator.hasNext()) {
final List<InferenceVariable> 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<InferenceVariable> varsToResolve, PsiSubstitutor siteSubstitutor) {
PsiSubstitutor substitutor = siteSubstitutor;
final HashSet<InferenceVariable> copy = new HashSet<InferenceVariable>(varsToResolve);
while (!copy.isEmpty()) {
final List<InferenceVariable> vars = InferenceVariablesOrder.resolveOrder(copy, this);
final Iterator<List<InferenceVariable>> varsIterator = InferenceVariablesOrder.resolveOrderIterator(varsToResolve, this);
while (varsIterator.hasNext()) {
List<InferenceVariable> vars = varsIterator.next();
final PsiSubstitutor resolveSubset = resolveSubset(vars, substitutor);
copy.removeAll(vars);
substitutor = substitutor.putAll(resolveSubset);
}
return substitutor;
@@ -27,8 +27,11 @@ import java.util.*;
*/
public class InferenceVariablesOrder {
public static List<InferenceVariable> resolveOrder(Collection<InferenceVariable> vars, InferenceSession session) {
return resolveOrderIterator(vars, session).next();
}
public static Iterator<List<InferenceVariable>> resolveOrderIterator(Collection<InferenceVariable> vars, InferenceSession session) {
Map<InferenceVariable, InferenceGraphNode<InferenceVariable>> nodes =
new LinkedHashMap<InferenceVariable, InferenceGraphNode<InferenceVariable>>();
for (InferenceVariable var : vars) {
@@ -52,7 +55,7 @@ public class InferenceVariablesOrder {
public List<InferenceVariable> fun(InferenceGraphNode<InferenceVariable> node) {
return node.getValue();
}
}).iterator().next();
}).iterator();
}
public static <T> List<List<InferenceGraphNode<T>>> tarjan(Collection<InferenceGraphNode<T>> nodes) {