From 1327600ef4d42e4d24337e1e45344ec635a5b412 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Fri, 22 Mar 2019 10:44:54 +0700 Subject: [PATCH] IDEA-205881 Remove redundant cast leads to incompilable code --- .../java-psi-api/src/com/intellij/psi/LambdaUtil.java | 11 ++++++++++- .../lambda/redundantCast/SuperBoundLambda.java | 11 +++++++++++ .../daemon/lambda/LambdaRedundantCastTest.java | 3 +++ 3 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/redundantCast/SuperBoundLambda.java 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 abfd34ec6897..ac2c874d57d6 100644 --- a/java/java-psi-api/src/com/intellij/psi/LambdaUtil.java +++ b/java/java-psi-api/src/com/intellij/psi/LambdaUtil.java @@ -829,7 +829,16 @@ public class LambdaUtil { anEnum.add(resolveMethod); return (PsiCall)anEnum.add(call); } - PsiType type = PsiTypesUtil.getExpectedTypeByParent(call); + PsiElement expressionForType = call; + while (true) { + PsiElement parent = PsiUtil.skipParenthesizedExprUp(expressionForType.getParent()); + if (!(parent instanceof PsiConditionalExpression) || + PsiTreeUtil.isAncestor(((PsiConditionalExpression)parent).getCondition(), expressionForType, false)) { + break; + } + expressionForType = parent; + } + PsiType type = PsiTypesUtil.getExpectedTypeByParent(expressionForType); if (type != null && PsiTypesUtil.isDenotableType(type, call)) { return (PsiCall)copyWithExpectedType(call, type); } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/redundantCast/SuperBoundLambda.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/redundantCast/SuperBoundLambda.java new file mode 100644 index 000000000000..1aaf5c468dbb --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/redundantCast/SuperBoundLambda.java @@ -0,0 +1,11 @@ +import java.util.function.*; +import java.util.*; + +class Y { + List filter(Collection collection, + Predicate condition) {return null;} + boolean testString(String s) {return s.isEmpty();} + List test(List input, boolean b) { + return b ? new ArrayList<>() : filter(input, o -> o instanceof String && testString((String)o)); + } +} diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/lambda/LambdaRedundantCastTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/lambda/LambdaRedundantCastTest.java index 97414c253938..3d876e2da8b5 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/lambda/LambdaRedundantCastTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/lambda/LambdaRedundantCastTest.java @@ -90,6 +90,9 @@ public class LambdaRedundantCastTest extends LightDaemonAnalyzerTestCase { public void testInvalidConditional() { doTest(); } + public void testSuperBoundLambda() { + doTest(); + } private void doTest() { doTest(BASE_PATH + "/" + getTestName(false) + ".java", true, false);