From dba42cc50f39ad09c6edb124442d2c17d2dd8737 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Mon, 4 May 2020 11:18:44 +0700 Subject: [PATCH] EqualsBetweenInconvertibleTypesInspection: one more fix for captured types with 2+ type arguments GitOrigin-RevId: 010a4462b407d7ce628aca43182e2a42e808930e --- ...EqualsBetweenInconvertibleTypesInspection.java | 4 ++-- .../siyeh/ig/bugs/InconvertibleTypesChecker.java | 15 ++++++--------- ...lsBetweenInconvertibleTypesInspectionTest.java | 2 ++ 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/EqualsBetweenInconvertibleTypesInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/EqualsBetweenInconvertibleTypesInspection.java index 5f8437ea7a66..db01c1380985 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/EqualsBetweenInconvertibleTypesInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/EqualsBetweenInconvertibleTypesInspection.java @@ -27,7 +27,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; -import java.util.HashMap; +import java.util.HashSet; public class EqualsBetweenInconvertibleTypesInspection extends BaseInspection { @@ -92,7 +92,7 @@ public class EqualsBetweenInconvertibleTypesInspection extends BaseInspection { !TypeUtils.areConvertible(lhsType, rhsType) /* red code */) { return; } - createInconvertibleTypesChecker().deepCheck(lhsType, rhsType, expression.getOperationSign(), new HashMap<>(), WARN_IF_NO_MUTUAL_SUBCLASS_FOUND, isOnTheFly()); + createInconvertibleTypesChecker().deepCheck(lhsType, rhsType, expression.getOperationSign(), new HashSet<>(), WARN_IF_NO_MUTUAL_SUBCLASS_FOUND, isOnTheFly()); } @Override diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/InconvertibleTypesChecker.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/InconvertibleTypesChecker.java index 982ce2455b7e..210c2fc9769a 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/InconvertibleTypesChecker.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/InconvertibleTypesChecker.java @@ -1,14 +1,15 @@ // Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.siyeh.ig.bugs; +import com.intellij.openapi.util.Couple; import com.intellij.psi.*; import com.intellij.psi.util.PsiUtil; import com.siyeh.ig.psiutils.InheritanceUtil; import com.siyeh.ig.psiutils.TypeUtils; import org.jetbrains.annotations.NotNull; -import java.util.HashMap; -import java.util.Map; +import java.util.HashSet; +import java.util.Set; public abstract class InconvertibleTypesChecker { protected abstract void registerEqualsError(PsiElement highlightLocation, @@ -26,7 +27,7 @@ public abstract class InconvertibleTypesChecker { return; } if (TypeUtils.areConvertible(leftType, rightType) || TypeUtils.mayBeEqualByContract(leftType, rightType)) { - deepCheck(leftType, rightType, name, new HashMap<>(), warnIfNoMutualSubclassFound, onTheFly); + deepCheck(leftType, rightType, name, new HashSet<>(), warnIfNoMutualSubclassFound, onTheFly); return; } registerEqualsError(name, leftType, rightType, false); @@ -35,7 +36,7 @@ public abstract class InconvertibleTypesChecker { protected void deepCheck(@NotNull PsiType leftType, @NotNull PsiType rightType, PsiElement highlightLocation, - Map checked, + Set> checked, boolean warnIfNoMutualSubclassFound, boolean onTheFly) { if (leftType instanceof PsiCapturedWildcardType) { @@ -44,11 +45,7 @@ public abstract class InconvertibleTypesChecker { if (rightType instanceof PsiCapturedWildcardType) { rightType = ((PsiCapturedWildcardType)rightType).getUpperBound(); } - PsiType checkedRight = checked.putIfAbsent(leftType, rightType); - if (checkedRight != null) { - if (!checkedRight.equals(rightType)) { - registerEqualsError(highlightLocation, leftType, rightType, false); - } + if (!checked.add(Couple.of(leftType, rightType))) { return; } if (leftType.isAssignableFrom(rightType) || rightType.isAssignableFrom(leftType)) return; diff --git a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/bugs/EqualsBetweenInconvertibleTypesInspectionTest.java b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/bugs/EqualsBetweenInconvertibleTypesInspectionTest.java index e208057e46ba..28f775a1d79b 100644 --- a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/bugs/EqualsBetweenInconvertibleTypesInspectionTest.java +++ b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/bugs/EqualsBetweenInconvertibleTypesInspectionTest.java @@ -211,9 +211,11 @@ public class EqualsBetweenInconvertibleTypesInspectionTest extends LightJavaInsp public void testCapture() { doTest("class X {\n" + " static final X CONST = new X<>();\n" + + " static final X CONST2 = new X<>();\n" + " \n" + " void test(X[] data) {\n" + " if (data[0] == CONST) {}\n" + + " if (data[0] == CONST2) {}\n" + " }\n" + "}"); }