From 02d7164d3bcb821653f0323fc5848cc33f7524a3 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 4 May 2020 13:30:07 +0200 Subject: [PATCH] java redundant cast: check erased context (IDEA-205885) GitOrigin-RevId: 1dd464c7b8feba43181c9e60472170b2bbbaa72e --- .../src/com/intellij/psi/util/RedundantCastUtil.java | 6 +++++- .../lambda/redundantCast/ErasedTargetType.java | 8 ++++++++ .../daemon/lambda/LambdaRedundantCastTest.java | 1 + 3 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/redundantCast/ErasedTargetType.java diff --git a/java/java-analysis-impl/src/com/intellij/psi/util/RedundantCastUtil.java b/java/java-analysis-impl/src/com/intellij/psi/util/RedundantCastUtil.java index 8498097940a9..528af900d4dc 100644 --- a/java/java-analysis-impl/src/com/intellij/psi/util/RedundantCastUtil.java +++ b/java/java-analysis-impl/src/com/intellij/psi/util/RedundantCastUtil.java @@ -384,8 +384,12 @@ public class RedundantCastUtil { else { final boolean varargs = newResult instanceof MethodCandidateInfo && ((MethodCandidateInfo)newResult).isVarargs(); final PsiType parameterType = PsiTypesUtil.getParameterType(parameters, i, varargs); - final PsiType newArgType = newResult.getSubstitutor().substitute(parameterType); + PsiType newArgType = newResult.getSubstitutor().substitute(parameterType); + if (newResult instanceof MethodCandidateInfo && PsiUtil.isRawSubstitutor(((MethodCandidateInfo)newResult).getElement(), newResult.getSubstitutor())) { + newArgType = TypeConversionUtil.erasure(newArgType); + } + if (Comparing.equal(castType, ((PsiFunctionalExpression)newArg).getGroundTargetType(newArgType))) { addToResults(cast); } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/redundantCast/ErasedTargetType.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/redundantCast/ErasedTargetType.java new file mode 100644 index 000000000000..dac067611644 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/redundantCast/ErasedTargetType.java @@ -0,0 +1,8 @@ +import java.util.function.Predicate; +class X { + void test(Predicate p) { + } + void foo(X x) { + x.test((Predicate)e -> e.isEmpty()); + } +} \ No newline at end of file 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 0203b75262bb..580e4238c809 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 @@ -82,6 +82,7 @@ public class LambdaRedundantCastTest extends LightDaemonAnalyzerTestCase { public void testCastInsideLambdaReturnExpressionPassedToEnumConstant() { doTest(); } public void testGroundTargetTypeDiffersFromCastType() { doTest(); } public void testInferenceErrorForApplicableMethod() { doTest(); } + public void testErasedTargetType() { doTest(); } public void testRejectReturnTypeChange() { doTest(); }