From f3bbc7af5a8e3fe04dfa0a39508556748b408812 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Tue, 18 Feb 2014 09:51:11 +0100 Subject: [PATCH] new inference: cleanup --- .../graphInference/InferenceSession.java | 88 +++++++------------ 1 file changed, 32 insertions(+), 56 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 f1d8af1fa451..4355378a92dd 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 @@ -187,74 +187,51 @@ public class InferenceSession { return infer(null, null, null); } - private PsiSubstitutor subst(@Nullable PsiParameter[] parameters, - @Nullable PsiExpression[] args, - @Nullable PsiCallExpression parent, - PsiMethod parentMethod) { - if (!repeatInferencePhases(false)) { - return null; - } - - initReturnTypeConstraint(parentMethod, parent); + private PsiSubstitutor tryToInfer(@Nullable PsiParameter[] parameters, + @Nullable PsiExpression[] args, + @Nullable PsiCallExpression parent, + PsiMethod parentMethod) { if (!repeatInferencePhases(true)) { return null; } - if (parameters != null && args != null) { - final Set additionalConstraints = new HashSet(); - if (parameters.length > 0) { - for (int i = 0; i < args.length; i++) { - if (args[i] != null) { - PsiType parameterType = getParameterType(parameters, args, i, mySiteSubstitutor); - if (!isPertinentToApplicability(args[i], parentMethod)) { - additionalConstraints.add(new ExpressionCompatibilityConstraint(args[i], parameterType)); - } - additionalConstraints.add(new CheckedExceptionCompatibilityConstraint(args[i], parameterType)); - } - } - } - - if (!additionalConstraints.isEmpty() && !proceedWithAdditionalConstraints(additionalConstraints)) { + if (parent != null) { + initReturnTypeConstraint(parentMethod, parent); + if (!repeatInferencePhases(true)) { return null; } + + if (parameters != null && args != null) { + final Set additionalConstraints = new HashSet(); + if (parameters.length > 0) { + for (int i = 0; i < args.length; i++) { + if (args[i] != null) { + PsiType parameterType = getParameterType(parameters, args, i, mySiteSubstitutor); + if (!isPertinentToApplicability(args[i], parentMethod)) { + additionalConstraints.add(new ExpressionCompatibilityConstraint(args[i], parameterType)); + } + additionalConstraints.add(new CheckedExceptionCompatibilityConstraint(args[i], parameterType)); + } + } + } + + if (!additionalConstraints.isEmpty() && !proceedWithAdditionalConstraints(additionalConstraints)) { + return null; + } + } } - return prepareSubstitution(); + + return PsiSubstitutor.EMPTY; } @NotNull public PsiSubstitutor infer(@Nullable PsiParameter[] parameters, @Nullable PsiExpression[] args, @Nullable PsiElement parent) { - - if (!repeatInferencePhases(true)) { - return prepareSubstitution(); - } - final Pair pair = getPair(parent); - if (pair != null) { - initReturnTypeConstraint(pair.first, (PsiCallExpression)parent); - if (!repeatInferencePhases(true)) { - return prepareSubstitution(); - } - } - - if (parameters != null && args != null && pair != null) { - final Set additionalConstraints = new HashSet(); - if (parameters.length > 0) { - for (int i = 0; i < args.length; i++) { - if (args[i] != null) { - PsiType parameterType = getParameterType(parameters, args, i, mySiteSubstitutor); - if (!isPertinentToApplicability(args[i], pair.first)) { - additionalConstraints.add(new ExpressionCompatibilityConstraint(args[i], parameterType)); - } - additionalConstraints.add(new CheckedExceptionCompatibilityConstraint(args[i], parameterType)); - } - } - } - - if (!additionalConstraints.isEmpty() && !proceedWithAdditionalConstraints(additionalConstraints)) { - return resolveSubset(myInferenceVariables.values(), mySiteSubstitutor, false); - } + final PsiSubstitutor subst = tryToInfer(parameters, args, pair != null ? pair.second : null, pair != null ? pair.first : null); + if (subst == null) { + return resolveSubset(myInferenceVariables.values(), mySiteSubstitutor, false); } final PsiSubstitutor substitutor = resolveBounds(myInferenceVariables.values(), mySiteSubstitutor); @@ -552,7 +529,7 @@ public class InferenceSession { final PsiTypeParameter[] typeParameters = ((PsiMethod)parentMethod).getTypeParameters(); final InferenceSession session = new InferenceSession(typeParameters, ((MethodCandidateInfo)result).getSiteSubstitutor(), myManager, argumentList); session.initExpressionConstraints(parameters, args, argumentList, (PsiMethod)parentMethod); - if (session.subst(parameters, args, callExpression, (PsiMethod)parentMethod) == null) { + if (session.tryToInfer(parameters, args, callExpression, (PsiMethod)parentMethod) == null) { return null; } final Collection params = session.getTypeParams(); @@ -725,7 +702,6 @@ public class InferenceSession { }, substitutor); } - @Nullable private PsiSubstitutor resolveSubset(Collection vars, PsiSubstitutor substitutor, boolean checkResult) { for (InferenceVariable var : vars) { LOG.assertTrue(var.getInstantiation() == PsiType.NULL);