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