From 50c47371cc952091df4c8b673afba8de65758910 Mon Sep 17 00:00:00 2001 From: David Renz Date: Thu, 24 Mar 2016 15:36:13 +0100 Subject: [PATCH] Fixed cyclomatic complexity rule --- .../pmd/lang/apex/ast/ApexParserVisitor.java | 4 +++ .../apex/ast/ApexParserVisitorAdapter.java | 10 +++++++ .../pmd/lang/apex/ast/CompilerService.java | 9 +++---- .../pmd/lang/apex/rule/AbstractApexRule.java | 12 +++++++++ .../codesize/CyclomaticComplexityRule.java | 27 ++++++++++++++++--- .../codesize/StdCyclomaticComplexityRule.java | 16 +++++++++++ 6 files changed, 68 insertions(+), 10 deletions(-) diff --git a/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ast/ApexParserVisitor.java b/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ast/ApexParserVisitor.java index a89ac37964..bc5897ada7 100644 --- a/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ast/ApexParserVisitor.java +++ b/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ast/ApexParserVisitor.java @@ -43,6 +43,10 @@ public interface ApexParserVisitor { Object visit(ASTIfBlockStatement node, Object data); Object visit(ASTForEachStatement node, Object data); + + Object visit(ASTDoLoopStatement node, Object data); + + Object visit(ASTTernaryExpression node, Object data); Object visit(ASTCompilation node, Object data); diff --git a/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ast/ApexParserVisitorAdapter.java b/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ast/ApexParserVisitorAdapter.java index 0b6ab2714e..03cc381d0f 100644 --- a/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ast/ApexParserVisitorAdapter.java +++ b/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ast/ApexParserVisitorAdapter.java @@ -125,4 +125,14 @@ public class ApexParserVisitorAdapter implements ApexParserVisitor { public Object visit(ASTThrowStatement node, Object data) { return visit((ApexNode) node, data); } + + @Override + public Object visit(ASTDoLoopStatement node, Object data) { + return visit((ApexNode) node, data); + } + + @Override + public Object visit(ASTTernaryExpression node, Object data) { + return visit((ApexNode) node, data); + } } diff --git a/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ast/CompilerService.java b/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ast/CompilerService.java index a3dbc531c8..26f742da13 100644 --- a/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ast/CompilerService.java +++ b/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ast/CompilerService.java @@ -80,16 +80,13 @@ public class CompilerService { return visitAstsFromStrings(sources, visitor, CompilerStage.POST_TYPE_RESOLVE); } - public ApexCompiler visitAstsFromStrings(List sources, AstVisitor visitor, - CompilerStage compilerStage) { - List sourceFiles = sources.stream() - .map(s -> SourceFile.builder().setBody(canonicalizeString(s)).build()).collect(Collectors.toList()); + public ApexCompiler visitAstsFromStrings(List sources, AstVisitor visitor, CompilerStage compilerStage) { + List sourceFiles = sources.stream().map(s -> SourceFile.builder().setBody(canonicalizeString(s)).build()).collect(Collectors.toList()); CompilationInput compilationUnit = createCompilationInput(sourceFiles, visitor); return compile(compilationUnit, visitor, compilerStage); } - private ApexCompiler compile(CompilationInput compilationInput, AstVisitor visitor, - CompilerStage compilerStage) { + private ApexCompiler compile(CompilationInput compilationInput, AstVisitor visitor, CompilerStage compilerStage) { ApexCompiler compiler = ApexCompiler.builder().setInput(compilationInput).build(); compiler.compile(compilerStage); callAdditionalPassVisitor(compiler); diff --git a/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/rule/AbstractApexRule.java b/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/rule/AbstractApexRule.java index 7e6555022b..ee9aa91fdd 100644 --- a/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/rule/AbstractApexRule.java +++ b/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/rule/AbstractApexRule.java @@ -33,6 +33,8 @@ import net.sourceforge.pmd.lang.apex.ast.ASTUserClassMethods; import net.sourceforge.pmd.lang.apex.ast.ASTUserEnum; import net.sourceforge.pmd.lang.apex.ast.ASTUserInterface; import net.sourceforge.pmd.lang.apex.ast.ASTWhileLoopStatement; +import net.sourceforge.pmd.lang.apex.ast.ASTDoLoopStatement; +import net.sourceforge.pmd.lang.apex.ast.ASTTernaryExpression; import net.sourceforge.pmd.lang.apex.ast.ApexNode; import net.sourceforge.pmd.lang.apex.ast.ApexParserVisitor; import net.sourceforge.pmd.lang.ast.Node; @@ -166,6 +168,16 @@ public abstract class AbstractApexRule extends AbstractRule implements ApexParse public Object visit(ASTForEachStatement node, Object data) { return visit((ApexNode) node, data); } + + @Override + public Object visit(ASTDoLoopStatement node, Object data) { + return visit((ApexNode) node, data); + } + + @Override + public Object visit(ASTTernaryExpression node, Object data) { + return visit((ApexNode) node, data); + } @Override public Object visit(ASTCompilation node, Object data) { diff --git a/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/rule/codesize/CyclomaticComplexityRule.java b/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/rule/codesize/CyclomaticComplexityRule.java index 2cd1b9475a..4c92b1987c 100644 --- a/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/rule/codesize/CyclomaticComplexityRule.java +++ b/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/rule/codesize/CyclomaticComplexityRule.java @@ -8,6 +8,9 @@ import net.sourceforge.pmd.lang.apex.ast.ASTForEachStatement; import net.sourceforge.pmd.lang.apex.ast.ASTForLoopStatement; import net.sourceforge.pmd.lang.apex.ast.ASTIfBlockStatement; import net.sourceforge.pmd.lang.apex.ast.ASTWhileLoopStatement; +import net.sourceforge.pmd.lang.apex.ast.ASTDoLoopStatement; +import net.sourceforge.pmd.lang.apex.ast.ASTTernaryExpression; +import net.sourceforge.pmd.lang.apex.rule.codesize.NPathComplexityRule; /** * @author ported from Java version of Donald A. Leckie, @@ -31,8 +34,7 @@ public class CyclomaticComplexityRule extends StdCyclomaticComplexityRule { public Object visit(ASTForEachStatement node, Object data) { super.visit(node, data); - int boolCompFor = NPathComplexityRule - .sumExpressionComplexity(node.getFirstDescendantOfType(ASTExpression.class)); + int boolCompFor = NPathComplexityRule.sumExpressionComplexity(node.getFirstDescendantOfType(ASTExpression.class)); entryStack.peek().bumpDecisionPoints(boolCompFor); return data; } @@ -41,8 +43,7 @@ public class CyclomaticComplexityRule extends StdCyclomaticComplexityRule { public Object visit(ASTForLoopStatement node, Object data) { super.visit(node, data); - int boolCompFor = NPathComplexityRule - .sumExpressionComplexity(node.getFirstDescendantOfType(ASTExpression.class)); + int boolCompFor = NPathComplexityRule.sumExpressionComplexity(node.getFirstDescendantOfType(ASTExpression.class)); entryStack.peek().bumpDecisionPoints(boolCompFor); return data; } @@ -55,4 +56,22 @@ public class CyclomaticComplexityRule extends StdCyclomaticComplexityRule { entryStack.peek().bumpDecisionPoints(boolCompWhile); return data; } + + @Override + public Object visit(ASTDoLoopStatement node, Object data) { + super.visit( node, data ); + + int boolCompDo = NPathComplexityRule.sumExpressionComplexity( node.getFirstChildOfType( ASTExpression.class ) ); + entryStack.peek().bumpDecisionPoints( boolCompDo ); + return data; + } + + @Override + public Object visit(ASTTernaryExpression node, Object data) { + super.visit(node, data); + + int boolCompWhile = NPathComplexityRule.sumExpressionComplexity(node.getFirstChildOfType(ASTExpression.class)); + entryStack.peek().bumpDecisionPoints(boolCompWhile); + return data; + } } diff --git a/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/rule/codesize/StdCyclomaticComplexityRule.java b/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/rule/codesize/StdCyclomaticComplexityRule.java index 5afc1b5856..c8b2bfd543 100644 --- a/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/rule/codesize/StdCyclomaticComplexityRule.java +++ b/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/rule/codesize/StdCyclomaticComplexityRule.java @@ -19,6 +19,8 @@ import net.sourceforge.pmd.lang.apex.ast.ASTForEachStatement; import net.sourceforge.pmd.lang.apex.ast.ASTIfBlockStatement; import net.sourceforge.pmd.lang.apex.ast.ASTMethod; import net.sourceforge.pmd.lang.apex.ast.ASTWhileLoopStatement; +import net.sourceforge.pmd.lang.apex.ast.ASTDoLoopStatement; +import net.sourceforge.pmd.lang.apex.ast.ASTTernaryExpression; import net.sourceforge.pmd.lang.apex.rule.AbstractApexRule; import net.sourceforge.pmd.lang.rule.properties.BooleanProperty; import net.sourceforge.pmd.lang.rule.properties.IntegerProperty; @@ -123,6 +125,20 @@ public class StdCyclomaticComplexityRule extends AbstractApexRule { super.visit(node, data); return data; } + + @Override + public Object visit(ASTDoLoopStatement node, Object data) { + entryStack.peek().bumpDecisionPoints(); + super.visit(node, data); + return data; + } + + @Override + public Object visit(ASTTernaryExpression node, Object data) { + entryStack.peek().bumpDecisionPoints(); + super.visit(node, data); + return data; + } @Override public Object visit(ASTUserInterface node, Object data) {