diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/VariableAccessUtils.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/VariableAccessUtils.java index 765c53c4942d..02c8fb76009d 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/VariableAccessUtils.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/VariableAccessUtils.java @@ -26,10 +26,7 @@ import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; -import java.util.Set; +import java.util.*; public class VariableAccessUtils { @@ -241,6 +238,18 @@ public class VariableAccessUtils { return ExpressionUtils.isReferenceTo(expression, variable); } + public static List getVariableReferences(@NotNull PsiVariable variable, @Nullable PsiElement context) { + if (context == null) return Collections.emptyList(); + List result = new ArrayList<>(); + PsiTreeUtil.processElements(context, e -> { + if (e instanceof PsiReferenceExpression && ((PsiReferenceExpression)e).isReferenceTo(variable)) { + result.add((PsiReferenceExpression)e); + } + return true; + }); + return result; + } + @Contract("_, null -> false") public static boolean variableIsUsed(@NotNull PsiVariable variable, @Nullable PsiElement context) { diff --git a/plugins/InspectionGadgets/src/com/intellij/codeInspection/redundantCast/CastCanBeRemovedNarrowingVariableTypeInspection.java b/plugins/InspectionGadgets/src/com/intellij/codeInspection/redundantCast/CastCanBeRemovedNarrowingVariableTypeInspection.java index a2aba7a20cca..60bcb87a1dce 100644 --- a/plugins/InspectionGadgets/src/com/intellij/codeInspection/redundantCast/CastCanBeRemovedNarrowingVariableTypeInspection.java +++ b/plugins/InspectionGadgets/src/com/intellij/codeInspection/redundantCast/CastCanBeRemovedNarrowingVariableTypeInspection.java @@ -12,6 +12,7 @@ import com.intellij.psi.util.RedundantCastUtil; import com.intellij.psi.util.TypeConversionUtil; import com.siyeh.ig.psiutils.ExpressionUtils; import com.siyeh.ig.psiutils.HighlightUtils; +import com.siyeh.ig.psiutils.VariableAccessUtils; import org.jetbrains.annotations.NotNull; import static com.intellij.util.ObjectUtils.tryCast; @@ -43,18 +44,12 @@ public class CastCanBeRemovedNarrowingVariableTypeInspection extends AbstractBas } PsiElement block = PsiUtil.getVariableCodeBlock(variable, null); if (block == null) return; - boolean redundantCast = PsiTreeUtil.processElements(block, e -> { - if (e instanceof PsiReferenceExpression) { - PsiReferenceExpression reference = (PsiReferenceExpression)e; - return !reference.isReferenceTo(variable) || isVariableTypeChangeSafeForReference(cast, castType, reference); - } - return true; - }); - if (redundantCast) { - String message = InspectionsBundle - .message("inspection.cast.can.be.removed.narrowing.variable.type.message", variable.getName(), castType.getPresentableText()); - holder.registerProblem(castTypeElement, message, new CastCanBeRemovedNarrowingVariableTypeFix(variable, castType, isOnTheFly)); + for (PsiReferenceExpression reference : VariableAccessUtils.getVariableReferences(variable, block)) { + if (!isVariableTypeChangeSafeForReference(cast, castType, reference)) return; } + String message = InspectionsBundle + .message("inspection.cast.can.be.removed.narrowing.variable.type.message", variable.getName(), castType.getPresentableText()); + holder.registerProblem(castTypeElement, message, new CastCanBeRemovedNarrowingVariableTypeFix(variable, castType, isOnTheFly)); } }; } diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/redundancy/RedundantCollectionOperationInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/redundancy/RedundantCollectionOperationInspection.java index 7158e7ba7ff5..d93dc5852b6c 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/redundancy/RedundantCollectionOperationInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/redundancy/RedundantCollectionOperationInspection.java @@ -16,6 +16,8 @@ import com.siyeh.ig.psiutils.*; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; +import java.util.List; + import static com.intellij.util.ObjectUtils.tryCast; import static com.siyeh.ig.callMatcher.CallMatcher.*; @@ -443,13 +445,8 @@ public class RedundantCollectionOperationInspection extends AbstractBaseJavaLoca return null; } PsiCodeBlock block = PsiTreeUtil.getParentOfType(localVariable, PsiCodeBlock.class); - if (block != null && VariableAccessUtils.variableIsUsed(localVariable, block) && - PsiTreeUtil.processElements(block, element -> { - if (!(element instanceof PsiReferenceExpression)) return true; - PsiReferenceExpression ref = (PsiReferenceExpression)element; - if (!(ref.isReferenceTo(localVariable))) return true; - return isAllowedContext(ref); - })) { + List references = VariableAccessUtils.getVariableReferences(localVariable, block); + if (!references.isEmpty() && references.stream().allMatch(RedundantAsListForIterationHandler::isAllowedContext)) { return new RedundantAsListForIterationHandler(); } }