java inference: prevent recursive conflict resolution when it isn't prevented by ResolveCache guard

advanceResolve(incomplete=true) prevents guard to work

GitOrigin-RevId: 437ec02af808a89c8339909411bec6d95ff225dc
This commit is contained in:
Anna Kozlova
2019-09-11 21:05:48 +02:00
committed by intellij-monorepo-bot
parent 4ffc23d976
commit fb5f755910
3 changed files with 32 additions and 1 deletions

View File

@@ -492,9 +492,11 @@ public class InferenceSession {
}
}
else if (returnExpression instanceof PsiLambdaExpression) {
if (!ignoreLambdaConstraintTree(returnExpression)) {
collectLambdaReturnExpression(additionalConstraints, ignoredConstraints, (PsiLambdaExpression)returnExpression, functionalType, myErased, initialSubstitutor);
}
}
}
private void collectAdditionalConstraints(final Set<ConstraintFormula> additionalConstraints,
final Set<ConstraintFormula> ignoredConstraints,

View File

@@ -0,0 +1,19 @@
import java.util.*;
import java.util.function.*;
class MyTest {
void foo(String[] strings){
final List<Consumer<String>> list = map2List(strings, str -> s -> asser<caret>tEquals(str, s));
}
static <T, V> List<V> map2List(T[] array, Function<? super T, ? extends V> mapper) {
return null;
}
static boolean assertEquals(Object o1, Object o2) {
return false;
}
static boolean assertEquals(String o1, String o2) {
return false;
}
}

View File

@@ -67,6 +67,16 @@ public class Java8ExpressionsCheckTest extends LightDaemonAnalyzerTestCase {
assertNotNull(getDataCall.getType());
}
public void testRecursiveConflictResolution() {
configure();
PsiMethodCallExpression assertEquals =
PsiTreeUtil.getParentOfType(getFile().findElementAt(getEditor().getCaretModel().getOffset()), PsiMethodCallExpression.class);
assertNotNull(assertEquals);
//ensure conflict check is not called recursively
assertNotNull(assertEquals.getMethodExpression().advancedResolve(true));
}
public void testLambdaParameterTypeDetection() {
configure();
PsiReferenceExpression referenceExpression =