diff --git a/java/java-psi-api/src/com/intellij/psi/LambdaHighlightingUtil.java b/java/java-psi-api/src/com/intellij/psi/LambdaHighlightingUtil.java index a00e8806eb76..b30f262fb85e 100644 --- a/java/java-psi-api/src/com/intellij/psi/LambdaHighlightingUtil.java +++ b/java/java-psi-api/src/com/intellij/psi/LambdaHighlightingUtil.java @@ -15,6 +15,7 @@ */ package com.intellij.psi; +import com.intellij.openapi.util.Computable; import com.intellij.psi.util.MethodSignature; import com.intellij.psi.util.PsiUtil; import org.jetbrains.annotations.NotNull; @@ -58,8 +59,13 @@ public class LambdaHighlightingUtil { } } else if (functionalInterfaceReturnType != null) { final List returnExpressions = LambdaUtil.getReturnExpressions(lambdaExpression); - for (PsiExpression expression : returnExpressions) { - final PsiType expressionType = expression.getType(); + for (final PsiExpression expression : returnExpressions) { + final PsiType expressionType = PsiResolveHelper.ourGraphGuard.doPreventingRecursion(expression, true, new Computable() { + @Override + public PsiType compute() { + return expression.getType(); + } + }); if (expressionType != null && !functionalInterfaceReturnType.isAssignableFrom(expressionType)) { return "Incompatible return type " + expressionType.getPresentableText() + " in lambda expression"; } diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiConditionalExpressionImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiConditionalExpressionImpl.java index f397423bc7f8..27012ff60992 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiConditionalExpressionImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiConditionalExpressionImpl.java @@ -97,6 +97,7 @@ public class PsiConditionalExpressionImpl extends ExpressionPsiElement implement if (type2 == null) return null; } + if (type1 instanceof PsiLambdaParameterType || type2 instanceof PsiLambdaParameterType) return null; final PsiType leastUpperBound = GenericsUtil.getLeastUpperBound(type1, type2, getManager()); return leastUpperBound != null ? PsiUtil.captureToplevelWildcards(leastUpperBound, this) : null; }