From 0deaf6d6a5ad4de770736d598c6805c09e79d756 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 26 Oct 2015 18:52:08 +0100 Subject: [PATCH] recursive substitutors: additional constraints substitution should not repeat already performed substitution with site substitutor (IDEA-146841) --- .../graphInference/InferenceSession.java | 7 +++++- ...SubstitutorsWithAdditionalConstraints.java | 23 +++++++++++++++++++ .../lambda/NewLambdaHighlightingTest.java | 4 ++++ 3 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/RecursiveAtSiteSubstitutorsWithAdditionalConstraints.java 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 fe9e2309bf28..a0164ac251a5 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 @@ -1120,7 +1120,12 @@ public class InferenceSession { } private boolean proceedWithAdditionalConstraints(Set additionalConstraints) { - final PsiSubstitutor siteSubstitutor = mySiteSubstitutor; + //empty substitutor should be used to resolve input variables: + //all types in additional constraints are already substituted during collecting phase, + //recursive site substitutors (T -> List) would make additional constraints work with multiple times substituted types, which is incorrect. + //at the same time, recursive substitutions should not appear during inference but appear rather on site, + //so the problem should not influence consequence substitution of additional constraints + final PsiSubstitutor siteSubstitutor = PsiSubstitutor.EMPTY; while (!additionalConstraints.isEmpty()) { //extract subset of constraints diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/RecursiveAtSiteSubstitutorsWithAdditionalConstraints.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/RecursiveAtSiteSubstitutorsWithAdditionalConstraints.java new file mode 100644 index 000000000000..d96c7e1b7758 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/RecursiveAtSiteSubstitutorsWithAdditionalConstraints.java @@ -0,0 +1,23 @@ +import java.util.concurrent.ExecutorService; +import java.util.function.*; + +abstract class List { + + public abstract int length(); + public abstract B foldLeft(B identity, Function> f); + public abstract List map(Function f); + public abstract List flatMap(Function> f); + + public List> splitListAt(int i) { + return null; + } + + public List> divide(List> list, int depth) { + final List> divide = divide(list.flatMap(x -> x.splitListAt(x.length() / 2)), depth / 2); + return null; + } + + public void parFoldLeft(ExecutorService es, C identity, Function> f, List> dList) { + dList.map(x -> es.submit(() -> x.foldLeft(identity, f))); + } +} 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 33242381ec35..281ca8ba8621 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 @@ -232,6 +232,10 @@ public class NewLambdaHighlightingTest extends LightDaemonAnalyzerTestCase { doTest(); } + public void testRecursiveAtSiteSubstitutorsWithAdditionalConstraints() throws Exception { + doTest(); + } + private void doTest() { doTest(false); }