diff --git a/plugins/InspectionGadgets/src/com/siyeh/InspectionGadgetsBundle.properties b/plugins/InspectionGadgets/src/com/siyeh/InspectionGadgetsBundle.properties
index 55bbba76e3c2..cd91310754d6 100644
--- a/plugins/InspectionGadgets/src/com/siyeh/InspectionGadgetsBundle.properties
+++ b/plugins/InspectionGadgets/src/com/siyeh/InspectionGadgetsBundle.properties
@@ -1278,6 +1278,7 @@ parameters.per.method.problem.descriptor=#ref() has too many parame
parameters.per.constructor.problem.descriptor=#ref() has too many parameters (num parameters = {0}) #loc
parameter.limit.option=Parameter limit:
three.negations.per.method.ignore.option=Ignore negations in 'equals()' methods
+three.negations.per.method.ignore.assert.option=Ignore negations in 'assert' statements
three.negations.per.method.problem.descriptor=#ref contains {0} negations #loc
thrown.exceptions.per.method.problem.descriptor=#ref has too many exceptions declared (num exceptions = {0}) #loc
thrown.exceptions.per.method.limit.option=Exceptions thrown limit:
diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/methodmetrics/NegationCountVisitor.java b/plugins/InspectionGadgets/src/com/siyeh/ig/methodmetrics/NegationCountVisitor.java
index 5b6903ed2810..2b0929383a51 100644
--- a/plugins/InspectionGadgets/src/com/siyeh/ig/methodmetrics/NegationCountVisitor.java
+++ b/plugins/InspectionGadgets/src/com/siyeh/ig/methodmetrics/NegationCountVisitor.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2003-2007 Dave Griffith
+ * Copyright 2003-2012 Dave Griffith, Bas Leijdekkers
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -21,8 +21,13 @@ import org.jetbrains.annotations.NotNull;
class NegationCountVisitor extends JavaRecursiveElementVisitor {
+ private final boolean myIgnoreInAssertStatements;
private int m_count = 0;
+ public NegationCountVisitor(boolean ignoreInAssertStatements) {
+ myIgnoreInAssertStatements = ignoreInAssertStatements;
+ }
+
@Override
public void visitBinaryExpression(@NotNull PsiBinaryExpression expression) {
super.visitBinaryExpression(expression);
@@ -45,6 +50,15 @@ class NegationCountVisitor extends JavaRecursiveElementVisitor {
}
}
+ @Override
+ public void visitAssertStatement(PsiAssertStatement statement) {
+ final int count = m_count;
+ super.visitAssertStatement(statement);
+ if (myIgnoreInAssertStatements) {
+ m_count = count;
+ }
+ }
+
public int getCount() {
return m_count;
}
diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/methodmetrics/ThreeNegationsPerMethodInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/methodmetrics/ThreeNegationsPerMethodInspection.java
index bcbbee1c1438..ce49baabd94a 100644
--- a/plugins/InspectionGadgets/src/com/siyeh/ig/methodmetrics/ThreeNegationsPerMethodInspection.java
+++ b/plugins/InspectionGadgets/src/com/siyeh/ig/methodmetrics/ThreeNegationsPerMethodInspection.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2003-2007 Dave Griffith, Bas Leijdekkers
+ * Copyright 2003-2012 Dave Griffith, Bas Leijdekkers
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -15,12 +15,12 @@
*/
package com.siyeh.ig.methodmetrics;
+import com.intellij.codeInspection.ui.MultipleCheckboxOptionsPanel;
import com.intellij.psi.PsiMethod;
import com.siyeh.InspectionGadgetsBundle;
import com.siyeh.ig.BaseInspection;
import com.siyeh.ig.BaseInspectionVisitor;
import com.siyeh.ig.psiutils.MethodUtils;
-import com.intellij.codeInspection.ui.SingleCheckboxOptionsPanel;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
@@ -32,24 +32,31 @@ public class ThreeNegationsPerMethodInspection extends BaseInspection {
*/
public boolean m_ignoreInEquals = true;
+ @SuppressWarnings("UnusedDeclaration")
+ public boolean ignoreInAssert = false;
+
+ @Override
@NotNull
public String getID() {
return "MethodWithMoreThanThreeNegations";
}
+ @Override
@NotNull
public String getDisplayName() {
return InspectionGadgetsBundle.message(
"three.negations.per.method.display.name");
}
+ @Override
public JComponent createOptionsPanel() {
- return new SingleCheckboxOptionsPanel(
- InspectionGadgetsBundle.message(
- "three.negations.per.method.ignore.option"),
- this, "m_ignoreInEquals");
+ final MultipleCheckboxOptionsPanel panel = new MultipleCheckboxOptionsPanel(this);
+ panel.addCheckbox(InspectionGadgetsBundle.message("three.negations.per.method.ignore.option"), "m_ignoreInEquals");
+ panel.addCheckbox(InspectionGadgetsBundle.message("three.negations.per.method.ignore.assert.option"), "ignoreInAssert");
+ return panel;
}
+ @Override
@NotNull
public String buildErrorString(Object... infos) {
final Integer negationCount = (Integer)infos[0];
@@ -57,6 +64,7 @@ public class ThreeNegationsPerMethodInspection extends BaseInspection {
"three.negations.per.method.problem.descriptor", negationCount);
}
+ @Override
public BaseInspectionVisitor buildVisitor() {
return new ThreeNegationsPerMethodVisitor();
}
@@ -69,7 +77,7 @@ public class ThreeNegationsPerMethodInspection extends BaseInspection {
if (method.getNameIdentifier() == null) {
return;
}
- final NegationCountVisitor visitor = new NegationCountVisitor();
+ final NegationCountVisitor visitor = new NegationCountVisitor(ignoreInAssert);
method.accept(visitor);
final int negationCount = visitor.getCount();
if (negationCount <= 3) {
diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/metrics/CyclomaticComplexityInspection.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/methodmetrics/CyclomaticComplexityInspection.java
similarity index 95%
rename from plugins/InspectionGadgets/test/com/siyeh/igtest/metrics/CyclomaticComplexityInspection.java
rename to plugins/InspectionGadgets/test/com/siyeh/igtest/methodmetrics/CyclomaticComplexityInspection.java
index bff9076706de..66db91ba37f7 100644
--- a/plugins/InspectionGadgets/test/com/siyeh/igtest/metrics/CyclomaticComplexityInspection.java
+++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/methodmetrics/CyclomaticComplexityInspection.java
@@ -1,4 +1,4 @@
-package com.siyeh.igtest.metrics;
+package com.siyeh.igtest.methodmetrics;
public class CyclomaticComplexityInspection
{
diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/metrics/FiveParametersPerMethodInspection.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/methodmetrics/FiveParametersPerMethodInspection.java
similarity index 83%
rename from plugins/InspectionGadgets/test/com/siyeh/igtest/metrics/FiveParametersPerMethodInspection.java
rename to plugins/InspectionGadgets/test/com/siyeh/igtest/methodmetrics/FiveParametersPerMethodInspection.java
index a1a22494c404..bc9ee5bfe8cf 100644
--- a/plugins/InspectionGadgets/test/com/siyeh/igtest/metrics/FiveParametersPerMethodInspection.java
+++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/methodmetrics/FiveParametersPerMethodInspection.java
@@ -1,4 +1,4 @@
-package com.siyeh.igtest.metrics;
+package com.siyeh.igtest.methodmetrics;
public class FiveParametersPerMethodInspection
{
diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/metrics/MultipleReturnPointsInspection.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/methodmetrics/MultipleReturnPointsInspection.java
similarity index 87%
rename from plugins/InspectionGadgets/test/com/siyeh/igtest/metrics/MultipleReturnPointsInspection.java
rename to plugins/InspectionGadgets/test/com/siyeh/igtest/methodmetrics/MultipleReturnPointsInspection.java
index fc1d798f6b3f..0e71fa92d6e6 100644
--- a/plugins/InspectionGadgets/test/com/siyeh/igtest/metrics/MultipleReturnPointsInspection.java
+++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/methodmetrics/MultipleReturnPointsInspection.java
@@ -1,4 +1,4 @@
-package com.siyeh.igtest.metrics;
+package com.siyeh.igtest.methodmetrics;
public class MultipleReturnPointsInspection
{
diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/metrics/NestingDepthInspection.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/methodmetrics/NestingDepthInspection.java
similarity index 93%
rename from plugins/InspectionGadgets/test/com/siyeh/igtest/metrics/NestingDepthInspection.java
rename to plugins/InspectionGadgets/test/com/siyeh/igtest/methodmetrics/NestingDepthInspection.java
index c8c60a0fa23d..210353d7cd5d 100644
--- a/plugins/InspectionGadgets/test/com/siyeh/igtest/metrics/NestingDepthInspection.java
+++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/methodmetrics/NestingDepthInspection.java
@@ -1,4 +1,4 @@
-package com.siyeh.igtest.metrics;
+package com.siyeh.igtest.methodmetrics;
public class NestingDepthInspection
{
diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/metrics/NonCommentSourceStatementsInspection.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/methodmetrics/NonCommentSourceStatementsInspection.java
similarity index 96%
rename from plugins/InspectionGadgets/test/com/siyeh/igtest/metrics/NonCommentSourceStatementsInspection.java
rename to plugins/InspectionGadgets/test/com/siyeh/igtest/methodmetrics/NonCommentSourceStatementsInspection.java
index fb8d021a3c74..cdb51a8f28d2 100644
--- a/plugins/InspectionGadgets/test/com/siyeh/igtest/metrics/NonCommentSourceStatementsInspection.java
+++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/methodmetrics/NonCommentSourceStatementsInspection.java
@@ -1,4 +1,4 @@
-package com.siyeh.igtest.metrics;
+package com.siyeh.igtest.methodmetrics;
public class NonCommentSourceStatementsInspection
{
diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/methodmetrics/three_negations_per_method/ThreeNegationsPerMethod.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/methodmetrics/three_negations_per_method/ThreeNegationsPerMethod.java
new file mode 100644
index 000000000000..70d4f68ecb81
--- /dev/null
+++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/methodmetrics/three_negations_per_method/ThreeNegationsPerMethod.java
@@ -0,0 +1,81 @@
+package com.siyeh.igtest.methodmetrics.three_negations_per_method;
+
+public class ThreeNegationsPerMethod
+{
+ int foo, bar, baz;
+
+ public void okayMethod()
+ {
+ if(!!!true)
+ {
+ return;
+ }
+ }
+
+ public void badMethod()
+ {
+ if(!!!!true)
+ {
+ return;
+ }
+ }
+
+ public void badMethod2()
+ {
+ if(!!!true && 3 !=4)
+ {
+ return;
+ }
+ }
+
+ public boolean equals(final Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ final ThreeNegationsPerMethod threeNegationsPerMethod = (ThreeNegationsPerMethod) o;
+
+ if (bar != threeNegationsPerMethod.bar) return false;
+ if (baz != threeNegationsPerMethod.baz) return false;
+ if (foo != threeNegationsPerMethod.foo) return false;
+
+ return true;
+ }
+
+ public int hashCode() {
+ int result;
+ result = foo;
+ result = 29 * result + bar;
+ result = 29 * result + baz;
+ return result;
+ }
+}
+class User {
+ public User getUser(final String username, final String password )
+ {
+ if (!isUsernameValid(username))
+ {
+ throw new IllegalArgumentException("Invalid username!");
+ }
+
+ if (!isPasswordValid(password))
+ {
+ throw new IllegalArgumentException("Invalid password!");
+ }
+
+ assert (username != null) && (password != null);
+
+ return searchLoginTable(username.toLowerCase(), password.toCharArray());
+ }
+
+ private User searchLoginTable(String s, char[] chars) {
+ return null;
+ }
+
+ private boolean isPasswordValid(String password) {
+ return true;
+ }
+
+ private boolean isUsernameValid(String username) {
+ return true;
+ }
+}
diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/methodmetrics/three_negations_per_method/expected.xml b/plugins/InspectionGadgets/test/com/siyeh/igtest/methodmetrics/three_negations_per_method/expected.xml
new file mode 100644
index 000000000000..8975ef28091a
--- /dev/null
+++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/methodmetrics/three_negations_per_method/expected.xml
@@ -0,0 +1,16 @@
+
+
+
+ ThreeNegationsPerMethod.java
+ 23
+ Method with more than three negations
+ <code>badMethod2</code> contains 4 negations #loc
+
+
+
+ ThreeNegationsPerMethod.java
+ 15
+ Method with more than three negations
+ <code>badMethod</code> contains 4 negations #loc
+
+
\ No newline at end of file
diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/metrics/ThreeNegationsPerMethodInspection.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/metrics/ThreeNegationsPerMethodInspection.java
deleted file mode 100644
index 8ea84c12b091..000000000000
--- a/plugins/InspectionGadgets/test/com/siyeh/igtest/metrics/ThreeNegationsPerMethodInspection.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package com.siyeh.igtest.metrics;
-
-public class ThreeNegationsPerMethodInspection
-{
- int foo, bar, baz;
-
- public void okayMethod()
- {
- if(!!!true)
- {
- return;
- }
- }
-
- public void badMethod()
- {
- if(!!!!true)
- {
- return;
- }
- }
-
- public void badMethod2()
- {
- if(!!!true && 3 !=4)
- {
- return;
- }
- }
-
- public boolean equals(final Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
-
- final ThreeNegationsPerMethodInspection threeNegationsPerMethodInspection = (ThreeNegationsPerMethodInspection) o;
-
- if (bar != threeNegationsPerMethodInspection.bar) return false;
- if (baz != threeNegationsPerMethodInspection.baz) return false;
- if (foo != threeNegationsPerMethodInspection.foo) return false;
-
- return true;
- }
-
- public int hashCode() {
- int result;
- result = foo;
- result = 29 * result + bar;
- result = 29 * result + baz;
- return result;
- }
-}
diff --git a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/methodmetrics/ThreeNegationsPerMethodInspectionTest.java b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/methodmetrics/ThreeNegationsPerMethodInspectionTest.java
new file mode 100644
index 000000000000..ab2f4ea0c0dc
--- /dev/null
+++ b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/methodmetrics/ThreeNegationsPerMethodInspectionTest.java
@@ -0,0 +1,13 @@
+package com.siyeh.ig.methodmetrics;
+
+import com.siyeh.ig.IGInspectionTestCase;
+
+public class ThreeNegationsPerMethodInspectionTest extends IGInspectionTestCase {
+
+ public void test() throws Exception {
+ final ThreeNegationsPerMethodInspection tool = new ThreeNegationsPerMethodInspection();
+ tool.m_ignoreInEquals = true;
+ tool.ignoreInAssert = true;
+ doTest("com/siyeh/igtest/methodmetrics/three_negations_per_method", tool);
+ }
+}
\ No newline at end of file