From 214cf92b0f661b339a2c08c314ff14999f8c0b4c Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 29 Jul 2014 19:31:57 +0200 Subject: [PATCH] dfa: support contracts with no args (IDEA-127768) --- .../dataFlow/MethodContract.java | 14 +++++++---- .../CheckedExceptionDominance/src/Test.java | 2 +- .../dataFlow/IDEADEV10489/expected.xml | 2 +- .../IDEADEV10489/src/IDEADEV10489.java | 8 ++----- .../dataFlow/fixture/AssertFailInCatch.java | 4 +--- .../dataFlow/fixture/CatchThrowable.java | 4 +++- .../dataFlow/fixture/ContractWithNoArgs.java | 24 +++++++++++++++++++ .../DataFlowInspectionTest.java | 1 + 8 files changed, 43 insertions(+), 16 deletions(-) create mode 100644 java/java-tests/testData/inspection/dataFlow/fixture/ContractWithNoArgs.java diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/MethodContract.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/MethodContract.java index 691c2f00d985..1167210f917e 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/MethodContract.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/MethodContract.java @@ -89,10 +89,16 @@ public class MethodContract { throw new ParseException("A contract clause must be in form arg1, ..., argN -> return-value"); } - String[] argStrings = clause.substring(0, arrowIndex).split(","); - ValueConstraint[] args = new ValueConstraint[argStrings.length]; - for (int i = 0; i < args.length; i++) { - args[i] = parseConstraint(argStrings[i]); + String beforeArrow = clause.substring(0, arrowIndex); + ValueConstraint[] args; + if (StringUtil.isNotEmpty(beforeArrow)) { + String[] argStrings = beforeArrow.split(","); + args = new ValueConstraint[argStrings.length]; + for (int i = 0; i < args.length; i++) { + args[i] = parseConstraint(argStrings[i]); + } + } else { + args = new ValueConstraint[0]; } result.add(new MethodContract(args, parseConstraint(clause.substring(arrowIndex + arrow.length())))); } diff --git a/java/java-tests/testData/inspection/dataFlow/CheckedExceptionDominance/src/Test.java b/java/java-tests/testData/inspection/dataFlow/CheckedExceptionDominance/src/Test.java index 4a0a690f0e21..4f0586d30a96 100644 --- a/java/java-tests/testData/inspection/dataFlow/CheckedExceptionDominance/src/Test.java +++ b/java/java-tests/testData/inspection/dataFlow/CheckedExceptionDominance/src/Test.java @@ -19,6 +19,6 @@ } public static void bar() throws CheckedException { - throw new CheckedException(); + if (new Random().nextInt() > 2) throw new CheckedException(); } } diff --git a/java/java-tests/testData/inspection/dataFlow/IDEADEV10489/expected.xml b/java/java-tests/testData/inspection/dataFlow/IDEADEV10489/expected.xml index bb6256f74012..4a088210968c 100644 --- a/java/java-tests/testData/inspection/dataFlow/IDEADEV10489/expected.xml +++ b/java/java-tests/testData/inspection/dataFlow/IDEADEV10489/expected.xml @@ -7,7 +7,7 @@ IDEADEV10489.java - 12 + 8 Method invocation 's.length()' may produce NullPointerException \ No newline at end of file diff --git a/java/java-tests/testData/inspection/dataFlow/IDEADEV10489/src/IDEADEV10489.java b/java/java-tests/testData/inspection/dataFlow/IDEADEV10489/src/IDEADEV10489.java index 60259479d353..ee41e588dd3e 100644 --- a/java/java-tests/testData/inspection/dataFlow/IDEADEV10489/src/IDEADEV10489.java +++ b/java/java-tests/testData/inspection/dataFlow/IDEADEV10489/src/IDEADEV10489.java @@ -1,7 +1,5 @@ class IDEADEV10489 { - static String getS() { - return null; - } + static native String getS(); static void f() { String s = getS(); @@ -17,7 +15,5 @@ class IDEADEV10489 { } } - private static boolean foo() { - return false; - } + private static native boolean foo(); } \ No newline at end of file diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/AssertFailInCatch.java b/java/java-tests/testData/inspection/dataFlow/fixture/AssertFailInCatch.java index 93fcf6d5c2d2..55c7c2b51de0 100644 --- a/java/java-tests/testData/inspection/dataFlow/fixture/AssertFailInCatch.java +++ b/java/java-tests/testData/inspection/dataFlow/fixture/AssertFailInCatch.java @@ -18,7 +18,5 @@ class Test { } } - private static @NotNull String createString() { - throw new NullPointerException(); - } + private static native @NotNull String createString(); } \ No newline at end of file diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/CatchThrowable.java b/java/java-tests/testData/inspection/dataFlow/fixture/CatchThrowable.java index ecb9b264bb62..a30d934f64b6 100644 --- a/java/java-tests/testData/inspection/dataFlow/fixture/CatchThrowable.java +++ b/java/java-tests/testData/inspection/dataFlow/fixture/CatchThrowable.java @@ -1,3 +1,5 @@ +import java.util.Random; + class BrokenAlignment { public static void main(String[] args) { @@ -20,7 +22,7 @@ class BrokenAlignment { } public static void doSomething() { - throw new RuntimeException("dummy"); + if (new Random().nextInt() > 2) throw new RuntimeException("dummy"); } } \ No newline at end of file diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/ContractWithNoArgs.java b/java/java-tests/testData/inspection/dataFlow/fixture/ContractWithNoArgs.java new file mode 100644 index 000000000000..006c2e3407ec --- /dev/null +++ b/java/java-tests/testData/inspection/dataFlow/fixture/ContractWithNoArgs.java @@ -0,0 +1,24 @@ +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +class Doo { + + @NotNull + public String doSomething() { + String s = getSomeString(); + if (s == null) { + throwSomeError(); + } + return s; + } + + private static void throwSomeError() { + throw new RuntimeException(); + } + + @Nullable + public String getSomeString() { + return Math.random() > 0.5 ? null : "Yeah"; + } + +} diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java index 8d12c870adc7..33eb32eb0ec6 100644 --- a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java @@ -252,6 +252,7 @@ public class DataFlowInspectionTest extends LightCodeInsightFixtureTestCase { public void testRootThrowableCause() { doTest(); } public void testUseInferredContracts() { doTest(); } + public void testContractWithNoArgs() { doTest(); } public void testContractInferenceBewareOverriding() { doTest(); } public void testNumberComparisonsWhenValueIsKnown() { doTest(); }