From a218280be4727b496ca819f292646ed03bb68053 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Tue, 12 Aug 2014 15:51:42 +0400 Subject: [PATCH] new inference: take into account backward variable dependencies (IDEA-123951) --- .../resolve/graphInference/InferenceSession.java | 16 ++++++++++++++-- .../graphInference/InferenceVariable.java | 10 ++++++++++ .../daemon/lambda/NewLambdaHighlightingTest.java | 1 - 3 files changed, 24 insertions(+), 3 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 782df40b80b4..c04daa826daa 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 @@ -27,6 +27,7 @@ import com.intellij.psi.util.*; import com.intellij.util.ArrayUtilRt; import com.intellij.util.Function; import com.intellij.util.Processor; +import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -221,7 +222,7 @@ public class InferenceSession { } if (parameters != null && args != null && !MethodCandidateInfo.isOverloadCheck()) { - final Set additionalConstraints = new HashSet(); + final Set additionalConstraints = new LinkedHashSet(); if (parameters.length > 0) { collectAdditionalConstraints(parameters, args, properties.getMethod(), PsiSubstitutor.EMPTY, additionalConstraints, properties.isVarargs(), true); } @@ -881,7 +882,7 @@ public class InferenceSession { private Set buildSubset(final Set additionalConstraints) { - final Set subset = new HashSet(); + final Set subset = new LinkedHashSet(); final Set outputVariables = new HashSet(); for (ConstraintFormula constraint : additionalConstraints) { if (constraint instanceof InputOutputConstraintFormula) { @@ -899,8 +900,19 @@ public class InferenceSession { if (inputVariables != null) { boolean dependsOnOutput = false; for (InferenceVariable inputVariable : inputVariables) { + if (dependsOnOutput) break; + if (inputVariable.hasInstantiation(this)) continue; final Set dependencies = inputVariable.getDependencies(this); dependencies.add(inputVariable); + if (!hasCapture(inputVariable)) { + for (InferenceVariable outputVariable : outputVariables) { + if (ContainerUtil.intersects(outputVariable.getDependencies(this), dependencies)) { + dependsOnOutput = true; + break; + } + } + } + dependencies.retainAll(outputVariables); if (!dependencies.isEmpty()) { dependsOnOutput = true; diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceVariable.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceVariable.java index a19961f4c3a9..6bc9e0b89871 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceVariable.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceVariable.java @@ -115,6 +115,16 @@ public class InferenceVariable extends LightTypeParameter { return dependencies; } + public boolean hasInstantiation(InferenceSession session) { + List bounds = getBounds(InferenceBound.EQ); + if (bounds != null) { + for (PsiType bound : bounds) { + if (session.isProperType(bound)) return true; + } + } + return false; + } + public boolean isThrownBound() { return myThrownBound; } diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewLambdaHighlightingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewLambdaHighlightingTest.java index 2daed089d5c2..807ce9881c22 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewLambdaHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewLambdaHighlightingTest.java @@ -102,7 +102,6 @@ public class NewLambdaHighlightingTest extends LightDaemonAnalyzerTestCase { doTest(); } - @Bombed(day = 20, month = Calendar.AUGUST) public void testIDEA123951() throws Exception { doTest(); }