From f78dbdba4c55c42b4da96ebd184cda350a0b90a5 Mon Sep 17 00:00:00 2001 From: Dmitry Batkovich Date: Tue, 29 Dec 2015 14:40:39 +0300 Subject: [PATCH] conditional expression with similar branches doesn't distinguish different constructors in PsiNewExpression (IDEA-149822) --- .../com/siyeh/ig/psiutils/EquivalenceChecker.java | 6 ++++++ ...onditionalExpressionWithIdenticalBranches.java | 15 +++++++++++++++ .../expected.xml | 7 +++++++ 3 files changed, 28 insertions(+) diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/EquivalenceChecker.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/EquivalenceChecker.java index 6b08da31bf65..13a9c4ff0574 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/EquivalenceChecker.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/EquivalenceChecker.java @@ -15,6 +15,7 @@ */ package com.siyeh.ig.psiutils; +import com.intellij.openapi.util.Comparing; import com.intellij.psi.*; import com.intellij.psi.tree.IElementType; import com.intellij.psi.util.PsiTreeUtil; @@ -775,6 +776,11 @@ public class EquivalenceChecker { if (!expressionsAreEquivalentDecision(arrayInitializer1, arrayInitializer2).getExactlyMatches()) { return EXACTLY_UN_MATCHES; } + final PsiMethod constructor1 = newExpression1.resolveConstructor(); + final PsiMethod constructor2 = newExpression2.resolveConstructor(); + if (!Comparing.equal(constructor1, constructor2)) { + return EXACTLY_UN_MATCHES; + } final PsiExpression qualifier1 = newExpression1.getQualifier(); final PsiExpression qualifier2 = newExpression2.getQualifier(); if (!expressionsAreEquivalentDecision(qualifier1, qualifier2).getExactlyMatches()) { diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/controlflow/conditional_expression_with_identical_branches/ConditionalExpressionWithIdenticalBranches.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/controlflow/conditional_expression_with_identical_branches/ConditionalExpressionWithIdenticalBranches.java index 6e10b9151fca..24fccf260af9 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/controlflow/conditional_expression_with_identical_branches/ConditionalExpressionWithIdenticalBranches.java +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/controlflow/conditional_expression_with_identical_branches/ConditionalExpressionWithIdenticalBranches.java @@ -47,4 +47,19 @@ class ConditionalExpressionWithIdenticalBranches { int someMethod(String s, String s2) { return s.length(); } + + class Item { + Item(String name) { + } + + Item(int value) { + } + + void v() { + int i = 1; + Item item = (i == 1 ? new Item("1") : new Item(i)); // warning here + + Item item1 = (i == 1 ? new Item("1") : new Item("2")); // warning here + } + } } \ No newline at end of file diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/controlflow/conditional_expression_with_identical_branches/expected.xml b/plugins/InspectionGadgets/test/com/siyeh/igtest/controlflow/conditional_expression_with_identical_branches/expected.xml index 03494e3dd12d..6b270c082c80 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/controlflow/conditional_expression_with_identical_branches/expected.xml +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/controlflow/conditional_expression_with_identical_branches/expected.xml @@ -55,4 +55,11 @@ Conditional expression with identical or similar branches Conditional expression <code>new Random().nextBoolean() ? "2" + "q" + "1" : "2" + "qwe" + "1"</code> with identical or similar branches #loc + + + ConditionalExpressionWithIdenticalBranches.java + 62 + Conditional expression with identical or similar branches + Conditional expression <code>i == 1 ? new Item("1") : new Item("2")</code> with identical or similar branches #loc + \ No newline at end of file