From 026e917bb94c2dbd1e0cc1eba431183dcbbab88f Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 4 May 2020 21:23:10 +0200 Subject: [PATCH] java redundant cast: check for inference problems when test against expected by parent type (IDEA-215022) GitOrigin-RevId: a33a36e76da7fc49284e93903158e9257b66a97c --- .../intellij/psi/util/RedundantCastUtil.java | 7 ++++ .../InferenceIncompatibilityWithoutCast.java | 36 +++++++++++++++++++ .../codeInspection/RedundantCast18Test.java | 1 + 3 files changed, 44 insertions(+) create mode 100644 java/java-tests/testData/inspection/redundantCast/lambda/InferenceIncompatibilityWithoutCast.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 528af900d4dc..89c81fba339e 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 @@ -611,6 +611,13 @@ public class RedundantCastUtil { LOG.assertTrue(initializer != null, operand.getText()); opType = initializer.getType(); + if (initializer instanceof PsiMethodCallExpression) { + JavaResolveResult newResult = ((PsiMethodCallExpression)initializer).resolveMethodGenerics(); + if (newResult instanceof MethodCandidateInfo && ((MethodCandidateInfo)newResult).getInferenceErrorMessage() != null) { + return; + } + } + if (opType != null) { if (operand instanceof PsiConditionalExpression) { if (!isApplicableForConditionalBranch(opType, ((PsiConditionalExpression)operand).getThenExpression())) return; diff --git a/java/java-tests/testData/inspection/redundantCast/lambda/InferenceIncompatibilityWithoutCast.java b/java/java-tests/testData/inspection/redundantCast/lambda/InferenceIncompatibilityWithoutCast.java new file mode 100644 index 000000000000..2976878c00f8 --- /dev/null +++ b/java/java-tests/testData/inspection/redundantCast/lambda/InferenceIncompatibilityWithoutCast.java @@ -0,0 +1,36 @@ + +import java.util.*; + +import java.util.function.Predicate; + +class MyTest { + private final Set set; + + public MyTest() { + set = (Set) newSet(); + } + + private static > Set newSet() { + return null; + } + + static Predicate eq(Predicate predicate) { + return predicate::test; + } + + static void test(Predicate predicate) { + class X { + void test2() { + Predicate not = (Predicate)eq(predicate); + } + } + } +} +class Repro { + public interface MembersInjector { } + static MembersInjector create(Class cls) { return null; } + public static void main(String[] args) { + Class[] parameterTypes = new Class[1]; + MembersInjector injector = (MembersInjector) create(parameterTypes[0]); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInspection/RedundantCast18Test.java b/java/java-tests/testSrc/com/intellij/java/codeInspection/RedundantCast18Test.java index 15a5eb4aedc3..ff0591a4272e 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInspection/RedundantCast18Test.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInspection/RedundantCast18Test.java @@ -47,4 +47,5 @@ public class RedundantCast18Test extends LightDaemonAnalyzerTestCase { public void testFieldInitializer() { doTest();} public void testDiamondWithUpperBounds() { doTest();} public void testBinaryConversions() { doTest();} + public void testInferenceIncompatibilityWithoutCast() { doTest();} } \ No newline at end of file