diff options
author | Tor Norbye <tnorbye@google.com> | 2013-06-20 15:12:35 -0700 |
---|---|---|
committer | Tor Norbye <tnorbye@google.com> | 2013-06-20 15:12:35 -0700 |
commit | 0e154c74931b6ff5ad6e0ec512b32e30df3cb068 (patch) | |
tree | f11327e8a38cd36b012c743a78e3dbf856b857f0 /java/java-analysis-impl | |
parent | 9a718963c1d41c5bcd3a1bdd5e518d497964ccdf (diff) | |
download | idea-0e154c74931b6ff5ad6e0ec512b32e30df3cb068.tar.gz |
Snapshot 4a019151cb9b5542ea5ba9ed2f07b29cee0951f0 from master branch of git://git.jetbrains.org/idea/community.git
Change-Id: I2fd287fc46a5378a4c437af4c884c3a3be94c330
Diffstat (limited to 'java/java-analysis-impl')
3 files changed, 26 insertions, 5 deletions
diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java index 369f6ece05d4..24850aa689c5 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java @@ -29,6 +29,7 @@ import com.intellij.psi.util.*; import com.intellij.util.IncorrectOperationException; import com.intellij.util.containers.Stack; import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.*; @@ -38,6 +39,7 @@ import static com.intellij.psi.CommonClassNames.*; class ControlFlowAnalyzer extends JavaElementVisitor { private static final Logger LOG = Logger.getInstance("#com.intellij.codeInspection.dataFlow.ControlFlowAnalyzer"); private static final int NOT_FOUND = -10; + private boolean myIgnoreAssertions; private static class CannotAnalyzeException extends RuntimeException { } @@ -54,9 +56,8 @@ class ControlFlowAnalyzer extends JavaElementVisitor { myFactory = valueFactory; } - public ControlFlow buildControlFlow(PsiElement codeFragment) { - if (codeFragment == null) return null; - + public ControlFlow buildControlFlow(@NotNull PsiElement codeFragment, boolean ignoreAssertions) { + myIgnoreAssertions = ignoreAssertions; PsiManager manager = codeFragment.getManager(); GlobalSearchScope scope = codeFragment.getResolveScope(); myRuntimeException = myFactory.getNotNullFactory().create(PsiType.getJavaLangRuntimeException(manager, scope)); @@ -203,6 +204,10 @@ class ControlFlowAnalyzer extends JavaElementVisitor { } @Override public void visitAssertStatement(PsiAssertStatement statement) { + if (myIgnoreAssertions) { + return; + } + startElement(statement); final PsiExpression condition = statement.getAssertCondition(); final PsiExpression description = statement.getAssertDescription(); diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DataFlowInspectionBase.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DataFlowInspectionBase.java index 391fa1b5a8dc..a5028fc37792 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DataFlowInspectionBase.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DataFlowInspectionBase.java @@ -35,6 +35,7 @@ import com.intellij.codeInspection.dataFlow.instructions.*; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Pair; +import com.intellij.openapi.util.WriteExternalException; import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.*; import com.intellij.psi.util.PsiTreeUtil; @@ -42,6 +43,7 @@ import com.intellij.psi.util.PsiUtil; import com.intellij.util.ArrayUtil; import com.intellij.util.IncorrectOperationException; import com.intellij.util.SmartList; +import org.jdom.Element; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -54,6 +56,7 @@ public class DataFlowInspectionBase extends BaseJavaBatchLocalInspectionTool { @NonNls private static final String SHORT_NAME = "ConstantConditions"; public boolean SUGGEST_NULLABLE_ANNOTATIONS = false; public boolean DONT_REPORT_TRUE_ASSERT_STATEMENTS = false; + public boolean IGNORE_ASSERT_STATEMENTS = false; @Override public JComponent createOptionsPanel() { @@ -61,6 +64,15 @@ public class DataFlowInspectionBase extends BaseJavaBatchLocalInspectionTool { } @Override + public void writeSettings(@NotNull Element node) throws WriteExternalException { + node.addContent(new Element("option").setAttribute("name", "SUGGEST_NULLABLE_ANNOTATIONS").setAttribute("value", String.valueOf(SUGGEST_NULLABLE_ANNOTATIONS))); + node.addContent(new Element("option").setAttribute("name", "DONT_REPORT_TRUE_ASSERT_STATEMENTS").setAttribute("value", String.valueOf(DONT_REPORT_TRUE_ASSERT_STATEMENTS))); + if (IGNORE_ASSERT_STATEMENTS) { + node.addContent(new Element("option").setAttribute("name", "IGNORE_ASSERT_STATEMENTS").setAttribute("value", "true")); + } + } + + @Override @NotNull public PsiElementVisitor buildVisitor(@NotNull final ProblemsHolder holder, boolean isOnTheFly) { return new JavaElementVisitor() { @@ -85,7 +97,7 @@ public class DataFlowInspectionBase extends BaseJavaBatchLocalInspectionTool { if (scope == null) return; final StandardDataFlowRunner dfaRunner = new StandardDataFlowRunner(SUGGEST_NULLABLE_ANNOTATIONS); final StandardInstructionVisitor visitor = new DataFlowInstructionVisitor(dfaRunner); - final RunnerResult rc = dfaRunner.analyzeMethod(scope, visitor); + final RunnerResult rc = dfaRunner.analyzeMethod(scope, visitor, IGNORE_ASSERT_STATEMENTS); if (rc == RunnerResult.OK) { if (dfaRunner.problemsDetected(visitor)) { createDescription(dfaRunner, holder, visitor); diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DataFlowRunner.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DataFlowRunner.java index 4e30cdd0964c..a01901ce386c 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DataFlowRunner.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DataFlowRunner.java @@ -91,11 +91,15 @@ public class DataFlowRunner { } public final RunnerResult analyzeMethod(@NotNull PsiElement psiBlock, InstructionVisitor visitor) { + return analyzeMethod(psiBlock, visitor, false); + } + + public final RunnerResult analyzeMethod(@NotNull PsiElement psiBlock, InstructionVisitor visitor, boolean ignoreAssertions) { try { final Collection<DfaMemoryState> initialStates = createInitialStates(psiBlock, visitor); if (initialStates == null) return RunnerResult.NOT_APPLICABLE; - final ControlFlow flow = createControlFlowAnalyzer().buildControlFlow(psiBlock); + final ControlFlow flow = createControlFlowAnalyzer().buildControlFlow(psiBlock, ignoreAssertions); if (flow == null) return RunnerResult.NOT_APPLICABLE; int endOffset = flow.getInstructionCount(); |