From 1d19b2d96f6e383da520c8b96306bb047828eea5 Mon Sep 17 00:00:00 2001 From: peter Date: Wed, 22 May 2013 17:49:58 +0200 Subject: [PATCH] IDEA-106884 Detect that string concatenation produces not-null result --- .../dataFlow/ControlFlowAnalyzer.java | 5 +++++ .../fixture/StringConcatAlwaysNotNull.java | 15 +++++++++++++++ .../codeInspection/DataFlowInspectionTest.java | 1 + 3 files changed, 21 insertions(+) create mode 100644 java/java-tests/testData/inspection/dataFlow/fixture/StringConcatAlwaysNotNull.java diff --git a/java/java-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java b/java/java-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java index c3e51a45218d..229f4656634c 100644 --- a/java/java-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java +++ b/java/java-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java @@ -182,6 +182,11 @@ class ControlFlowAnalyzer extends JavaElementVisitor { generateDefaultBinOp(lExpr, rExpr, type); } } + else if (op == JavaTokenType.PLUSEQ && type != null && type.equalsToText(JAVA_LANG_STRING)) { + lExpr.accept(this); + rExpr.accept(this); + addInstruction(new BinopInstruction(JavaTokenType.PLUS, null, lExpr.getProject())); + } else { generateDefaultBinOp(lExpr, rExpr, type); } diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/StringConcatAlwaysNotNull.java b/java/java-tests/testData/inspection/dataFlow/fixture/StringConcatAlwaysNotNull.java new file mode 100644 index 000000000000..dd38e5a0fc9c --- /dev/null +++ b/java/java-tests/testData/inspection/dataFlow/fixture/StringConcatAlwaysNotNull.java @@ -0,0 +1,15 @@ +import org.jetbrains.annotations.NotNull; + +class X { + @NotNull + String foo() {return "";} + + void bar() { + String o = foo(); + o += ""; + if (o != null) { + + } + } + +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java index 36060cac29b6..fc5824cd047f 100644 --- a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java @@ -68,6 +68,7 @@ public class DataFlowInspectionTest extends LightCodeInsightFixtureTestCase { public void testIDEA84489() throws Throwable { doTest(); } public void testComparingToNotNullShouldNotAffectNullity() throws Throwable { doTest(); } public void testStringTernaryAlwaysTrue() throws Throwable { doTest(); } + public void testStringConcatAlwaysNotNull() throws Throwable { doTest(); } public void testNotNullPrimitive() throws Throwable { doTest(); } public void testBoxing128() throws Throwable { doTest(); }