diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/NewObjectEqualityInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/NewObjectEqualityInspection.java index 86fc72b365bd..3efac74893c2 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/NewObjectEqualityInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/NewObjectEqualityInspection.java @@ -9,7 +9,6 @@ import com.intellij.psi.*; import com.intellij.psi.controlFlow.*; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtil; -import com.intellij.util.containers.ContainerUtil; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; @@ -21,8 +20,8 @@ import com.siyeh.ig.psiutils.VariableAccessUtils; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; -import java.util.Collections; import java.util.List; +import java.util.Set; import static com.intellij.util.ObjectUtils.tryCast; @@ -99,8 +98,9 @@ public class NewObjectEqualityInspection extends BaseInspection { catch (AnalysisCanceledException e) { return expression; } - int start = flow.getEndOffset(initializer) + 1; - if (ControlFlowUtils.isVariableReferencedBeforeStatementEntry(flow, start, expression, variable, Collections.emptySet())) { + int initializerEnd = flow.getEndOffset(initializer); + int start = initializerEnd + 1; + if (ControlFlowUtils.isVariableReferencedBeforeStatementEntry(flow, start, expression, variable, Set.of(initializerEnd))) { return expression; } return initializer; diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ControlFlowUtils.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ControlFlowUtils.java index ad1b2c41c8bd..a5eb1f2155b3 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ControlFlowUtils.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ControlFlowUtils.java @@ -880,7 +880,7 @@ public final class ControlFlowUtils { if (to == statementStart && (from < statementStart || from >= statementEnd)) { return true; } - if (!referenced.get(to)) { + if (!referenced.get(to) && !excluded.contains(to)) { referenced.set(to); changed = true; } diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/new_object_equality/ControlFlow.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/new_object_equality/ControlFlow.java index 9d4c7b32e67b..3d53083bac18 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/new_object_equality/ControlFlow.java +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/new_object_equality/ControlFlow.java @@ -4,6 +4,17 @@ import java.util.*; public class ControlFlow { + void nonLeak(Object obj) { + while (true) { + Object obj2 = new Object(); + if (obj == obj2) { + System.out.println("equal"); + } else { + if (Math.random() > 0.5) return; + } + } + } + void test() { while (true) { Object obj = new Object();