Support switch statements correctly in Cognitive Complexity

This commit is contained in:
Gwilym Kuiper
2020-03-02 11:52:12 +00:00
parent 90f286a4a1
commit a32d12b796
2 changed files with 43 additions and 0 deletions

View File

@ -16,6 +16,7 @@ import net.sourceforge.pmd.lang.apex.ast.ASTIfElseBlockStatement;
import net.sourceforge.pmd.lang.apex.ast.ASTMethod;
import net.sourceforge.pmd.lang.apex.ast.ASTMethodCallExpression;
import net.sourceforge.pmd.lang.apex.ast.ASTPrefixExpression;
import net.sourceforge.pmd.lang.apex.ast.ASTSwitchStatement;
import net.sourceforge.pmd.lang.apex.ast.ASTTernaryExpression;
import net.sourceforge.pmd.lang.apex.ast.ASTWhileLoopStatement;
import net.sourceforge.pmd.lang.apex.ast.ApexNode;
@ -231,4 +232,15 @@ public class CognitiveComplexityVisitor extends ApexParserVisitorAdapter {
state.methodCall(node.getNode().getMethodName());
return super.visit(node, data);
}
@Override
public Object visit(ASTSwitchStatement node, Object data) {
State state = (State) data;
state.increaseNestingLevel();
super.visit(node, data);
state.decreaseNestingLevel();
return state;
}
}

View File

@ -359,4 +359,35 @@
]]>
</code>
</test-code>
<test-code>
<description>Switch statements only gain 1 complexity regardless of the number of cases</description>
<expected-problems>1</expected-problems>
<expected-messages>
<message>'c__Foo#foo(Integer)' has value 3.</message>
</expected-messages>
<code>
<![CDATA[
class Foo {
void foo(Integer n) {
switch on n { // +1
when 1 {
System.debug('when block 1');
}
when 2, 3, 4, 5 {
if (n <= 3) { // +2
System.debug('n <= 3');
}
System.debug('when block 2');
}
when else {
System.debug('default');
}
}
}
}
]]>
</code>
</test-code>
</test-data>