From f8e479a020ebe91bdc758975d1bafb9b3ea0ee06 Mon Sep 17 00:00:00 2001 From: "Anna.Kozlova" Date: Thu, 31 Mar 2016 18:39:49 +0200 Subject: [PATCH] redundant cast: don't mark casts inside array index access expressions acceptable (IDEA-153661) --- .../src/com/intellij/psi/util/RedundantCastUtil.java | 10 ++++++---- .../inspection/redundantCast/IDEADEV25675/expected.xml | 5 +++++ .../inspection/redundantCast/IDEADEV25675/src/A.java | 7 +++++++ 3 files changed, 18 insertions(+), 4 deletions(-) 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 d4829aa8b268..3cb4bf3e1e60 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 @@ -642,7 +642,7 @@ public class RedundantCastUtil { } } - if (arrayAccessAtTheLeftSideOfAssignment(parent)) { + if (arrayAccessAtTheLeftSideOfAssignment(parent, typeCast)) { if (TypeConversionUtil.isAssignable(opType, castTo, false) && opType.getArrayDimensions() == castTo.getArrayDimensions()) { addToResults(typeCast); } @@ -715,11 +715,13 @@ public class RedundantCastUtil { return true; } - private static boolean arrayAccessAtTheLeftSideOfAssignment(PsiElement element) { - PsiAssignmentExpression assignment = PsiTreeUtil.getParentOfType(element, PsiAssignmentExpression.class, false, PsiMember.class); + private static boolean arrayAccessAtTheLeftSideOfAssignment(PsiElement parent, PsiElement element) { + PsiAssignmentExpression assignment = PsiTreeUtil.getParentOfType(parent, PsiAssignmentExpression.class, false, PsiMember.class); if (assignment == null) return false; PsiExpression lExpression = assignment.getLExpression(); - return PsiTreeUtil.isAncestor(lExpression, element, false) && lExpression instanceof PsiArrayAccessExpression; + return lExpression instanceof PsiArrayAccessExpression && + PsiTreeUtil.isAncestor(lExpression, parent, false) && + !PsiTreeUtil.isAncestor(((PsiArrayAccessExpression)lExpression).getIndexExpression(), element, false); } } diff --git a/java/java-tests/testData/inspection/redundantCast/IDEADEV25675/expected.xml b/java/java-tests/testData/inspection/redundantCast/IDEADEV25675/expected.xml index c440a49c4378..5ee65171181a 100644 --- a/java/java-tests/testData/inspection/redundantCast/IDEADEV25675/expected.xml +++ b/java/java-tests/testData/inspection/redundantCast/IDEADEV25675/expected.xml @@ -5,5 +5,10 @@ 3 Casting 'array' to String[] is redundant + + A.java + 20 + Casting '1' to 'Integer' is redundant + diff --git a/java/java-tests/testData/inspection/redundantCast/IDEADEV25675/src/A.java b/java/java-tests/testData/inspection/redundantCast/IDEADEV25675/src/A.java index 074a0415074b..3c86677c178b 100644 --- a/java/java-tests/testData/inspection/redundantCast/IDEADEV25675/src/A.java +++ b/java/java-tests/testData/inspection/redundantCast/IDEADEV25675/src/A.java @@ -12,4 +12,11 @@ public class Test { t.obj = new Object[1]; ((Object[])t.obj)[0] = val; } + + public static void arrayDims() { + int[] ints = new int[] {}; + Object foo = 1; + ints[(Integer) foo] = 0; + ints[(Integer) 1] = 0; + } } \ No newline at end of file