From d83b1f12c7c956c70f6f69d70ec3219bf01da0b9 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Tue, 4 Sep 2012 12:55:39 +0400 Subject: [PATCH] lambda: skip conditional condition during inference from return value --- .../src/com/intellij/psi/LambdaUtil.java | 12 ++++++++++++ .../impl/source/resolve/PsiResolveHelperImpl.java | 7 ++++++- .../lambda/highlighting/ConditionalExpr.java | 12 ++++++++++++ 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/java/java-psi-api/src/com/intellij/psi/LambdaUtil.java b/java/java-psi-api/src/com/intellij/psi/LambdaUtil.java index 2ded7ceb7a80..859ffea05220 100644 --- a/java/java-psi-api/src/com/intellij/psi/LambdaUtil.java +++ b/java/java-psi-api/src/com/intellij/psi/LambdaUtil.java @@ -311,6 +311,18 @@ public class LambdaUtil { if (lambdaParams.length != methodParameters.length) return false; final boolean [] independent = new boolean[]{true}; expression.accept(new JavaRecursiveElementWalkingVisitor() { + @Override + public void visitConditionalExpression(PsiConditionalExpression expression) { + final PsiExpression thenExpression = expression.getThenExpression(); + if (thenExpression != null) { + thenExpression.accept(this); + } + final PsiExpression elseExpression = expression.getElseExpression(); + if (elseExpression != null) { + elseExpression.accept(this); + } + } + @Override public void visitReferenceExpression(PsiReferenceExpression expression) { super.visitReferenceExpression(expression); diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/PsiResolveHelperImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/PsiResolveHelperImpl.java index 37e502fbf4f4..f8cb8abd992f 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/PsiResolveHelperImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/PsiResolveHelperImpl.java @@ -605,7 +605,12 @@ public class PsiResolveHelperImpl implements PsiResolveHelper { final List expressions = lambdaExpression.getReturnExpressions(); for (final PsiExpression expression : expressions) { final boolean independent = LambdaUtil.isFreeFromTypeInferenceArgs(methodParameters, lambdaExpression, expression); - if (independent && methodParamsDependOnTypeParams) return FAILED_INFERENCE; + if (independent && methodParamsDependOnTypeParams ) { + if (lowerBound != PsiType.NULL) { + return null; + } + return FAILED_INFERENCE; + } if (!independent) { if (lowerBound != PsiType.NULL) { return null; diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/highlighting/ConditionalExpr.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/highlighting/ConditionalExpr.java index 7d54d43073f1..6c856aa2b3ce 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/highlighting/ConditionalExpr.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/highlighting/ConditionalExpr.java @@ -37,3 +37,15 @@ class Test { } } +class Test1 { + interface I { + V _(T t); + } + + static void bar(I ii, I ik){} + + { + bar(s -> s.equals("") ? 0 : 1, i -> ""); + } +} +