From 8d12f07a6aea3d0efb279aa621ab6722f70a28a3 Mon Sep 17 00:00:00 2001 From: peter Date: Wed, 6 Apr 2011 12:57:22 +0200 Subject: [PATCH] fix some empty stack exceptions during dfa analysis --- .../dataFlow/ControlFlowAnalyzer.java | 3 ++- .../codeInspection/dataFlow/DataFlowRunner.java | 3 ++- .../instructions/MethodCallInstruction.java | 2 +- .../completion/normal/OrAssignmentDfa.java | 17 +++++++++++++++++ .../normal/OrAssignmentDfa_after.java | 17 +++++++++++++++++ .../completion/NormalCompletionTest.groovy | 2 ++ 6 files changed, 41 insertions(+), 3 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/completion/normal/OrAssignmentDfa.java create mode 100644 java/java-tests/testData/codeInsight/completion/normal/OrAssignmentDfa_after.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 cf03fa2c32f9..6bca3124730d 100644 --- a/java/java-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java +++ b/java/java-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java @@ -532,9 +532,10 @@ class ControlFlowAnalyzer extends JavaElementVisitor { generateBoxingUnboxingInstructionFor(caseExpression, PsiType.INT); if (TypeConversionUtil.isEnumType(caseExpression.getType())) { addInstruction(new FieldReferenceInstruction(caseExpression, "switch statement expression")); + } else { + addInstruction(new PopInstruction()); } - addInstruction(new PopInstruction()); } PsiCodeBlock body = switchStmt.getBody(); diff --git a/java/java-impl/src/com/intellij/codeInspection/dataFlow/DataFlowRunner.java b/java/java-impl/src/com/intellij/codeInspection/dataFlow/DataFlowRunner.java index 0a50f444b59b..3e27932031b3 100644 --- a/java/java-impl/src/com/intellij/codeInspection/dataFlow/DataFlowRunner.java +++ b/java/java-impl/src/com/intellij/codeInspection/dataFlow/DataFlowRunner.java @@ -161,7 +161,8 @@ public class DataFlowRunner { LOG.error(psiBlock.getText(), e); /* TODO[max] !!! hack (of 18186). Please fix in better times. */ return RunnerResult.ABORTED; } - catch (EmptyStackException e) /* TODO[max] !!! hack (of 18186). Please fix in better times. */ { + catch (EmptyStackException e) { + //LOG.error(psiBlock.getText(), e); /* TODO[max] !!! hack (of 18186). Please fix in better times. */ return RunnerResult.ABORTED; } } diff --git a/java/java-impl/src/com/intellij/codeInspection/dataFlow/instructions/MethodCallInstruction.java b/java/java-impl/src/com/intellij/codeInspection/dataFlow/instructions/MethodCallInstruction.java index 51c6dee10de0..079e0f0ba4e9 100644 --- a/java/java-impl/src/com/intellij/codeInspection/dataFlow/instructions/MethodCallInstruction.java +++ b/java/java-impl/src/com/intellij/codeInspection/dataFlow/instructions/MethodCallInstruction.java @@ -57,7 +57,7 @@ public class MethodCallInstruction extends Instruction { public MethodCallInstruction(@NotNull PsiExpression context, MethodType methodType) { myContext = context; myMethodType = methodType; - myCall = context instanceof PsiCallExpression ? (PsiCallExpression)context : null; + myCall = methodType == MethodType.REGULAR_METHOD_CALL && context instanceof PsiCallExpression ? (PsiCallExpression)context : null; final PsiExpressionList argList = myCall == null ? null : myCall.getArgumentList(); myArgs = argList != null ? argList.getExpressions() : PsiExpression.EMPTY_ARRAY; diff --git a/java/java-tests/testData/codeInsight/completion/normal/OrAssignmentDfa.java b/java/java-tests/testData/codeInsight/completion/normal/OrAssignmentDfa.java new file mode 100644 index 000000000000..48fab97edaa3 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normal/OrAssignmentDfa.java @@ -0,0 +1,17 @@ +class Foo { + + boolean foo(Object o, final PairFunction fun){ + boolean result = true; + result |= fun.fun(path); + if (o instanceof String) { + o.subst + } + } + + void foo(String s) {} +} + +interface PairFunction { + U fun(T t, V v); + +} diff --git a/java/java-tests/testData/codeInsight/completion/normal/OrAssignmentDfa_after.java b/java/java-tests/testData/codeInsight/completion/normal/OrAssignmentDfa_after.java new file mode 100644 index 000000000000..cecc36797b06 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normal/OrAssignmentDfa_after.java @@ -0,0 +1,17 @@ +class Foo { + + boolean foo(Object o, final PairFunction fun){ + boolean result = true; + result |= fun.fun(path); + if (o instanceof String) { + ((String) o).substring() + } + } + + void foo(String s) {} +} + +interface PairFunction { + U fun(T t, V v); + +} diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy index 4677a94efca2..ce92618fb7dc 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy @@ -809,6 +809,8 @@ public class NormalCompletionTest extends LightFixtureCompletionTestCase { public void testQualifierCastingWithUnknownAssignments() throws Throwable { doTest(); } public void testQualifierCastingBeforeLt() throws Throwable { doTest(); } + public void testOrAssignmentDfa() throws Throwable { doTest(); } + public void testWildcardsInLookup() throws Exception { configure() assertNotNull(getLookup());