From dc83428b4ba8fb0bf7f47acba3a117efbfc9e719 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Mon, 7 May 2012 12:16:45 +0200 Subject: [PATCH] IDEA-85579 (Inspections > Method metrics > Method with more then three negations: Add ignore assert) --- .../siyeh/InspectionGadgetsBundle.properties | 1 + .../methodmetrics/NegationCountVisitor.java | 16 +++- .../ThreeNegationsPerMethodInspection.java | 22 +++-- .../CyclomaticComplexityInspection.java | 2 +- .../FiveParametersPerMethodInspection.java | 2 +- .../MultipleReturnPointsInspection.java | 2 +- .../NestingDepthInspection.java | 2 +- .../NonCommentSourceStatementsInspection.java | 2 +- .../ThreeNegationsPerMethod.java | 81 +++++++++++++++++++ .../three_negations_per_method/expected.xml | 16 ++++ .../ThreeNegationsPerMethodInspection.java | 51 ------------ ...ThreeNegationsPerMethodInspectionTest.java | 13 +++ 12 files changed, 146 insertions(+), 64 deletions(-) rename plugins/InspectionGadgets/test/com/siyeh/igtest/{metrics => methodmetrics}/CyclomaticComplexityInspection.java (95%) rename plugins/InspectionGadgets/test/com/siyeh/igtest/{metrics => methodmetrics}/FiveParametersPerMethodInspection.java (83%) rename plugins/InspectionGadgets/test/com/siyeh/igtest/{metrics => methodmetrics}/MultipleReturnPointsInspection.java (87%) rename plugins/InspectionGadgets/test/com/siyeh/igtest/{metrics => methodmetrics}/NestingDepthInspection.java (93%) rename plugins/InspectionGadgets/test/com/siyeh/igtest/{metrics => methodmetrics}/NonCommentSourceStatementsInspection.java (96%) create mode 100644 plugins/InspectionGadgets/test/com/siyeh/igtest/methodmetrics/three_negations_per_method/ThreeNegationsPerMethod.java create mode 100644 plugins/InspectionGadgets/test/com/siyeh/igtest/methodmetrics/three_negations_per_method/expected.xml delete mode 100644 plugins/InspectionGadgets/test/com/siyeh/igtest/metrics/ThreeNegationsPerMethodInspection.java create mode 100644 plugins/InspectionGadgets/testsrc/com/siyeh/ig/methodmetrics/ThreeNegationsPerMethodInspectionTest.java 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