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 a60752e62360..e73458927ec5 100644 --- a/java/java-psi-api/src/com/intellij/psi/LambdaUtil.java +++ b/java/java-psi-api/src/com/intellij/psi/LambdaUtil.java @@ -126,15 +126,27 @@ public class LambdaUtil { @Contract("null -> false") public static boolean isValidLambdaContext(@Nullable PsiElement context) { - return context instanceof PsiTypeCastExpression || + context = PsiUtil.skipParenthesizedExprUp(context); + return isAssignmentOrInvocationContext(context) || + context instanceof PsiTypeCastExpression || + context instanceof PsiConditionalExpression && isAssignmentOrInvocationContext(PsiUtil.skipParenthesizedExprUp(context.getParent())) || + context instanceof PsiExpressionStatement; + } + + private static boolean isAssignmentOrInvocationContext(PsiElement context) { + return isAssignmentContext(context) || isInvocationContext(context); + } + + private static boolean isInvocationContext(@Nullable PsiElement context) { + return context instanceof PsiExpressionList; + } + + private static boolean isAssignmentContext(PsiElement context) { + return context instanceof PsiLambdaExpression || + context instanceof PsiReturnStatement || context instanceof PsiAssignmentExpression || context instanceof PsiVariable || - context instanceof PsiLambdaExpression || - context instanceof PsiReturnStatement || - context instanceof PsiExpressionList || - context instanceof PsiParenthesizedExpression || - context instanceof PsiArrayInitializerExpression || - context instanceof PsiConditionalExpression && PsiTreeUtil.getParentOfType(context, PsiTypeCastExpression.class) == null; + context instanceof PsiArrayInitializerExpression; } public static boolean isLambdaFullyInferred(PsiLambdaExpression expression, PsiType functionalInterfaceType) { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/highlighting/LambdaContext.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/highlighting/LambdaContext.java index a5efd12bd7a0..cff20f669666 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/highlighting/LambdaContext.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/highlighting/LambdaContext.java @@ -23,6 +23,8 @@ interface II { class Test1 { void bar(boolean b){ II ik = b ? (s)-> true : (s)->false; - II ik1 = (II)(b ? (s)-> true : (s)->false); + II ik1 = (II)((b ? (s)-> true : (s)->false)); + II ik2 = (II)(ik1 = (b ? (s)-> true : (s)->false)); + (b ? (s) -> true : ik)._(""); } } \ No newline at end of file