From fa579af4c30808dcd99605a74392f2ce9c277ba1 Mon Sep 17 00:00:00 2001 From: anna Date: Thu, 14 Nov 2013 15:51:31 +0100 Subject: [PATCH] new inference: input/output variables strictly after spec (cherry picked from commit 7a6936834b386b54df9e7901ee9c7452704ba084) --- .../InputOutputConstraintFormula.java | 97 +++++++++---------- 1 file changed, 46 insertions(+), 51 deletions(-) diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/InputOutputConstraintFormula.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/InputOutputConstraintFormula.java index 77b2ff865dda..40cd875f9068 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/InputOutputConstraintFormula.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/InputOutputConstraintFormula.java @@ -44,56 +44,54 @@ public abstract class InputOutputConstraintFormula implements ConstraintFormula public Set getInputVariables(InferenceSession session) { final PsiExpression psiExpression = getExpression(); - if (PsiPolyExpressionUtil.isPolyExpression(psiExpression)) { - final PsiType type = getT(); - if (psiExpression instanceof PsiLambdaExpression || psiExpression instanceof PsiMethodReferenceExpression) { - final InferenceVariable inferenceVariable = session.getInferenceVariable(type); - if (inferenceVariable != null) { - return Collections.singleton(inferenceVariable); - } - if (LambdaHighlightingUtil.checkInterfaceFunctional(type) == null) { - final PsiType functionType = - psiExpression instanceof PsiLambdaExpression - ? FunctionalInterfaceParameterizationUtil.getFunctionalType(type, (PsiLambdaExpression)psiExpression) - : type; - final PsiClassType.ClassResolveResult resolveResult = PsiUtil.resolveGenericsClassInType(functionType); - final PsiMethod interfaceMethod = LambdaUtil.getFunctionalInterfaceMethod(resolveResult); - if (interfaceMethod != null) { + final PsiType type = getT(); + if (psiExpression instanceof PsiLambdaExpression || psiExpression instanceof PsiMethodReferenceExpression) { + final InferenceVariable inferenceVariable = session.getInferenceVariable(type); + if (inferenceVariable != null) { + return Collections.singleton(inferenceVariable); + } + if (LambdaHighlightingUtil.checkInterfaceFunctional(type) == null) { + final PsiType functionType = + psiExpression instanceof PsiLambdaExpression + ? FunctionalInterfaceParameterizationUtil.getFunctionalType(type, (PsiLambdaExpression)psiExpression) + : type; + final PsiClassType.ClassResolveResult resolveResult = PsiUtil.resolveGenericsClassInType(functionType); + final PsiMethod interfaceMethod = LambdaUtil.getFunctionalInterfaceMethod(resolveResult); + if (interfaceMethod != null) { - final Set result = new HashSet(); - final PsiSubstitutor substitutor = LambdaUtil.getSubstitutor(interfaceMethod, resolveResult); - if (psiExpression instanceof PsiLambdaExpression && !((PsiLambdaExpression)psiExpression).hasFormalParameterTypes() || - psiExpression instanceof PsiMethodReferenceExpression && !((PsiMethodReferenceExpression)psiExpression).isExact()) { - for (PsiParameter parameter : interfaceMethod.getParameterList().getParameters()) { - session.collectDependencies(substitutor.substitute(parameter.getType()), result); - } + final Set result = new HashSet(); + final PsiSubstitutor substitutor = LambdaUtil.getSubstitutor(interfaceMethod, resolveResult); + if (psiExpression instanceof PsiLambdaExpression && !((PsiLambdaExpression)psiExpression).hasFormalParameterTypes() || + psiExpression instanceof PsiMethodReferenceExpression && !((PsiMethodReferenceExpression)psiExpression).isExact()) { + for (PsiParameter parameter : interfaceMethod.getParameterList().getParameters()) { + session.collectDependencies(substitutor.substitute(parameter.getType()), result); } - - collectReturnTypeVariables(session, psiExpression, substitutor.substitute(interfaceMethod.getReturnType()), result); - - return result; } + + collectReturnTypeVariables(session, psiExpression, substitutor.substitute(interfaceMethod.getReturnType()), result); + + return result; } } + } - if (psiExpression instanceof PsiParenthesizedExpression) { - final PsiExpression expression = ((PsiParenthesizedExpression)psiExpression).getExpression(); - return expression != null ? createSelfConstraint(type, expression).getInputVariables(session) : null; - } + if (psiExpression instanceof PsiParenthesizedExpression) { + final PsiExpression expression = ((PsiParenthesizedExpression)psiExpression).getExpression(); + return expression != null ? createSelfConstraint(type, expression).getInputVariables(session) : null; + } - if (psiExpression instanceof PsiConditionalExpression) { - final PsiExpression thenExpression = ((PsiConditionalExpression)psiExpression).getThenExpression(); - final PsiExpression elseExpression = ((PsiConditionalExpression)psiExpression).getElseExpression(); - final Set thenResult = thenExpression != null ? createSelfConstraint(type, thenExpression).getInputVariables(session) : null; - final Set elseResult = elseExpression != null ? createSelfConstraint(type, elseExpression).getInputVariables(session) : null; - if (thenResult == null) { - return elseResult; - } else if (elseResult == null) { - return thenResult; - } else { - thenResult.addAll(elseResult); - return thenResult; - } + if (psiExpression instanceof PsiConditionalExpression) { + final PsiExpression thenExpression = ((PsiConditionalExpression)psiExpression).getThenExpression(); + final PsiExpression elseExpression = ((PsiConditionalExpression)psiExpression).getElseExpression(); + final Set thenResult = thenExpression != null ? createSelfConstraint(type, thenExpression).getInputVariables(session) : null; + final Set elseResult = elseExpression != null ? createSelfConstraint(type, elseExpression).getInputVariables(session) : null; + if (thenResult == null) { + return elseResult; + } else if (elseResult == null) { + return thenResult; + } else { + thenResult.addAll(elseResult); + return thenResult; } } return null; @@ -102,15 +100,12 @@ public abstract class InputOutputConstraintFormula implements ConstraintFormula @Nullable public Set getOutputVariables(Set inputVariables, InferenceSession session) { - if (PsiPolyExpressionUtil.isPolyExpression(getExpression())) { - final HashSet mentionedVariables = new HashSet(); - session.collectDependencies(getT(), mentionedVariables); - if (inputVariables != null) { - mentionedVariables.removeAll(inputVariables); - } - return mentionedVariables; + final HashSet mentionedVariables = new HashSet(); + session.collectDependencies(getT(), mentionedVariables); + if (inputVariables != null) { + mentionedVariables.removeAll(inputVariables); } - return null; + return mentionedVariables.isEmpty() ? null : mentionedVariables; } @Override