From 320904a20f8c68c772b0275e1a7d2054a05c6ec3 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Thu, 10 Mar 2016 20:06:41 +0100 Subject: [PATCH] redundant cast: compare base types for anonymous classes --- .../src/com/intellij/psi/util/RedundantCastUtil.java | 7 ++++++- .../lambda/redundantCast/WithAnonymousClasses.java | 7 +++++++ .../codeInsight/daemon/lambda/LambdaRedundantCastTest.java | 4 ++++ 3 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/redundantCast/WithAnonymousClasses.java diff --git a/java/java-psi-api/src/com/intellij/psi/util/RedundantCastUtil.java b/java/java-psi-api/src/com/intellij/psi/util/RedundantCastUtil.java index a8bdfbd6ef16..c57387c4b8b8 100644 --- a/java/java-psi-api/src/com/intellij/psi/util/RedundantCastUtil.java +++ b/java/java-psi-api/src/com/intellij/psi/util/RedundantCastUtil.java @@ -377,8 +377,13 @@ public class RedundantCastUtil { newResult = newCall.resolveMethodGenerics(); } + final PsiAnonymousClass oldAnonymousClass = expression instanceof PsiNewExpression ? ((PsiNewExpression)expression).getAnonymousClass() : null; + final PsiAnonymousClass newAnonymousClass = newCall instanceof PsiNewExpression ? ((PsiNewExpression)newCall).getAnonymousClass() : null; + if (oldMethod.equals(newResult.getElement()) && - (!(newCall instanceof PsiCallExpression) || Comparing.equal(((PsiCallExpression)newCall).getType(), ((PsiCallExpression)expression).getType())) && + (!(newCall instanceof PsiCallExpression) || + oldAnonymousClass != null && newAnonymousClass != null && Comparing.equal(oldAnonymousClass.getBaseClassType(), newAnonymousClass.getBaseClassType()) || + Comparing.equal(((PsiCallExpression)newCall).getType(), ((PsiCallExpression)expression).getType())) && newResult.isValidResult()) { if (!(newArgs[i] instanceof PsiFunctionalExpression) || castType != null && castType.equals(((PsiFunctionalExpression)newArgs[i]).getFunctionalInterfaceType())) { addToResults(cast); diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/redundantCast/WithAnonymousClasses.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/redundantCast/WithAnonymousClasses.java new file mode 100644 index 000000000000..807175719185 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/redundantCast/WithAnonymousClasses.java @@ -0,0 +1,7 @@ + +class Y { + Y(int x) {} + Y bar() { + return new Y((int) 1) {}; + } +} diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/LambdaRedundantCastTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/LambdaRedundantCastTest.java index fc491c80a088..c6279580788e 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/LambdaRedundantCastTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/LambdaRedundantCastTest.java @@ -52,6 +52,10 @@ public class LambdaRedundantCastTest extends LightDaemonAnalyzerTestCase { doTest(); } + public void testWithAnonymousClasses() throws Exception { + doTest(); + } + private void doTest() { doTest(BASE_PATH + "/" + getTestName(false) + ".java", true, false); }