diff --git a/java/java-impl/src/com/intellij/codeInspection/ExplicitArrayFillingInspection.java b/java/java-impl/src/com/intellij/codeInspection/ExplicitArrayFillingInspection.java index aaa66f5231f6..6219e6f4cd30 100644 --- a/java/java-impl/src/com/intellij/codeInspection/ExplicitArrayFillingInspection.java +++ b/java/java-impl/src/com/intellij/codeInspection/ExplicitArrayFillingInspection.java @@ -13,6 +13,7 @@ import com.intellij.profile.codeInspection.InspectionProjectProfileManager; import com.intellij.psi.*; import com.intellij.psi.codeStyle.CodeStyleManager; import com.intellij.psi.codeStyle.JavaCodeStyleManager; +import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiTypesUtil; import com.intellij.util.ObjectUtils; import com.siyeh.ig.psiutils.*; @@ -54,8 +55,7 @@ public class ExplicitArrayFillingInspection extends AbstractBaseJavaLocalInspect if (!ExpressionUtils.isReferenceTo(index, loop.getCounter())) return; PsiExpression rValue = assignment.getRExpression(); if (rValue == null) return; - if (!VariableAccessUtils.collectUsedVariables(rValue).contains(loop.getCounter()) && - !SideEffectChecker.mayHaveSideEffects(rValue)) { + if (!isChangedInLoop(loop, rValue)) { Object constValue = ExpressionUtils.computeConstantExpression(rValue); if (constValue != null && constValue.equals(PsiTypesUtil.getDefaultValue(assignment.getType()))) { holder.registerProblem(statement, getRange(statement, ProblemHighlightType.WARNING), @@ -72,6 +72,12 @@ public class ExplicitArrayFillingInspection extends AbstractBaseJavaLocalInspect registerProblem(statement, true); } + private boolean isChangedInLoop(@NotNull CountingLoop loop, @NotNull PsiExpression rValue) { + return VariableAccessUtils.collectUsedVariables(rValue).contains(loop.getCounter()) || + SideEffectChecker.mayHaveSideEffects(rValue) || + PsiTreeUtil.findChildOfType(rValue, PsiNewExpression.class, false) != null; + } + private void registerProblem(@NotNull PsiForStatement statement, boolean isSetAll) { String message = InspectionsBundle.message("inspection.explicit.array.filling.description", isSetAll ? "setAll" : "fill"); ReplaceWithArraysCallFix fix = new ReplaceWithArraysCallFix(!isSetAll); diff --git a/java/java-tests/testData/inspection/explicitArrayFilling/afterChangedInLoop.java b/java/java-tests/testData/inspection/explicitArrayFilling/afterChangedInLoop.java new file mode 100644 index 000000000000..7ce065dc4d0b --- /dev/null +++ b/java/java-tests/testData/inspection/explicitArrayFilling/afterChangedInLoop.java @@ -0,0 +1,11 @@ +// "Replace loop with 'Arrays.setAll()' method call" "true" + +import java.util.Arrays; + +class Test { + + void fill2DArray() { + final double[][] arr = new double[2][]; + Arrays.setAll(arr, i -> new double[1]); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/inspection/explicitArrayFilling/beforeChangedInLoop.java b/java/java-tests/testData/inspection/explicitArrayFilling/beforeChangedInLoop.java new file mode 100644 index 000000000000..0239e4e21127 --- /dev/null +++ b/java/java-tests/testData/inspection/explicitArrayFilling/beforeChangedInLoop.java @@ -0,0 +1,11 @@ +// "Replace loop with 'Arrays.setAll()' method call" "true" + +class Test { + + void fill2DArray() { + final double[][] arr = new double[2][]; + for (int i = 0; i < arr.length; i++) { + arr[i] = new double[1]; + } + } +} \ No newline at end of file