From 1cf721e0ce07ea3dd01166343a6451ccca80730d Mon Sep 17 00:00:00 2001 From: "Anna.Kozlova" Date: Wed, 28 Dec 2016 18:47:03 +0100 Subject: [PATCH] string comparison: evaluate based on equals comparison (IDEA-160823) --- .../psi/impl/ConstantExpressionVisitor.java | 4 +- ...hileBodyDueToConstantStringComparison.java | 43 +++++++++++++++++++ .../daemon/LightAdvHighlightingJdk6Test.java | 4 ++ 3 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting6/ReachableWhileBodyDueToConstantStringComparison.java diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/ConstantExpressionVisitor.java b/java/java-psi-impl/src/com/intellij/psi/impl/ConstantExpressionVisitor.java index 835be8ea8f0e..6b634abca4ef 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/ConstantExpressionVisitor.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/ConstantExpressionVisitor.java @@ -247,7 +247,7 @@ class ConstantExpressionVisitor extends JavaElementVisitor implements PsiConstan value = Boolean.valueOf(((Number)lOperandValue).doubleValue() == ((Number)rOperandValue).doubleValue()); } else if (lOperandValue instanceof String && rOperandValue instanceof String) { - value = Boolean.valueOf(lOperandValue == rOperandValue); + value = Boolean.valueOf(lOperandValue.equals(rOperandValue)); } else if (lOperandValue instanceof Boolean && rOperandValue instanceof Boolean) { value = Boolean.valueOf(((Boolean)lOperandValue).booleanValue() == ((Boolean)rOperandValue).booleanValue()); @@ -260,7 +260,7 @@ class ConstantExpressionVisitor extends JavaElementVisitor implements PsiConstan value = Boolean.valueOf(((Number)lOperandValue).doubleValue() != ((Number)rOperandValue).doubleValue()); } else if (lOperandValue instanceof String && rOperandValue instanceof String) { - value = Boolean.valueOf(lOperandValue != rOperandValue); + value = Boolean.valueOf(!lOperandValue.equals(rOperandValue)); } else if (lOperandValue instanceof Boolean && rOperandValue instanceof Boolean) { value = Boolean.valueOf(((Boolean)lOperandValue).booleanValue() != ((Boolean)rOperandValue).booleanValue()); diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting6/ReachableWhileBodyDueToConstantStringComparison.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting6/ReachableWhileBodyDueToConstantStringComparison.java new file mode 100644 index 000000000000..62122117498f --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting6/ReachableWhileBodyDueToConstantStringComparison.java @@ -0,0 +1,43 @@ + +class Bar { + public static final String T = ""; + + void m0() { + while (T == "") { + f(); + } + f(); + } + + void m() { + while (T == "a") { + f(); + } + } + + void m01() { + while (T != "") { + f(); + } + } + + void m1() { + while (T != "a") { + f(); + } + f(); + } + + void m2() { + while (T != T) { + f(); + } + } + + void m3() { + while (T == T) {} + f(); + } + + private void f() {} +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingJdk6Test.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingJdk6Test.java index 6d34bef3a548..b514f892657d 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingJdk6Test.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingJdk6Test.java @@ -94,4 +94,8 @@ public class LightAdvHighlightingJdk6Test extends LightDaemonAnalyzerTestCase { public void testStaticOnDemandImportResolvesToClass() throws Exception { doTest(false, false); } + + public void testReachableWhileBodyDueToConstantStringComparison() throws Exception { + doTest(false, false); + } }