Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[apex] Remove apex statistical rules #1750

Merged
merged 7 commits into from Apr 11, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Expand Up @@ -70,6 +70,14 @@ public boolean hasSuppressWarningsAnnotationFor(Rule rule) {
return false;
}

/**
* Returns true if this is a synthetic class initializer, inserted
* by the parser.
*/
public boolean isSynthetic() {
return getImage().matches("<clinit>|<init>|clone");
}

public boolean isConstructor() {
return node.getMethodInfo().isConstructor();
}
Expand Down
Expand Up @@ -33,7 +33,7 @@ protected List<ASTMethod> findOperations(ASTUserClassOrInterface<?> node) {
List<ASTMethod> candidates = node.findChildrenOfType(ASTMethod.class);
List<ASTMethod> result = new ArrayList<>(candidates);
for (ASTMethod method : candidates) {
if (method.getImage().matches("(<clinit>|<init>|clone)")) {
if (method.isSynthetic()) {
result.remove(method);
}
}
Expand Down
Expand Up @@ -26,7 +26,7 @@ public abstract class AbstractApexOperationMetric extends AbstractApexMetric<AST
*/
@Override
public boolean supports(ASTMethod node) {
return !node.getImage().matches("(<clinit>|<init>|clone)")
return !node.isSynthetic()
&& !node.getFirstChildOfType(ASTModifierNode.class).isAbstract();
}
}

This file was deleted.

Expand Up @@ -7,153 +7,163 @@
import net.sourceforge.pmd.lang.apex.ast.ASTBreakStatement;
import net.sourceforge.pmd.lang.apex.ast.ASTContinueStatement;
import net.sourceforge.pmd.lang.apex.ast.ASTDoLoopStatement;
import net.sourceforge.pmd.lang.apex.ast.ASTFieldDeclaration;
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.ASTIfElseBlockStatement;
import net.sourceforge.pmd.lang.apex.ast.ASTMethod;
import net.sourceforge.pmd.lang.apex.ast.ASTMethodCallExpression;
import net.sourceforge.pmd.lang.apex.ast.ASTReturnStatement;
import net.sourceforge.pmd.lang.apex.ast.ASTStatement;
import net.sourceforge.pmd.lang.apex.ast.ASTThrowStatement;
import net.sourceforge.pmd.lang.apex.ast.ASTTryCatchFinallyBlockStatement;
import net.sourceforge.pmd.lang.apex.ast.ASTUserClass;
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.AbstractApexNodeBase;
import net.sourceforge.pmd.lang.apex.rule.AbstractStatisticalApexRule;
import net.sourceforge.pmd.lang.apex.ast.ApexNode;
import net.sourceforge.pmd.lang.apex.ast.ApexParserVisitorAdapter;
import net.sourceforge.pmd.lang.apex.rule.internal.AbstractCounterCheckRule;
import net.sourceforge.pmd.lang.ast.Node;
import net.sourceforge.pmd.stat.DataPoint;
import net.sourceforge.pmd.util.NumericConstants;

/**
* Abstract superclass for NCSS counting methods. Counts tokens according to
* <a href="http://www.kclee.de/clemens/java/javancss/">JavaNCSS rules</a>.
*
*
* @author ported from Java original of Jason Bennett
*/
public abstract class AbstractNcssCountRule extends AbstractStatisticalApexRule {
public abstract class AbstractNcssCountRule<T extends ApexNode<?>> extends AbstractCounterCheckRule<T> {

private Class<?> nodeClass;

/**
* Count the nodes of the given type using NCSS rules.
*
* @param nodeClass
* class of node to count
*
* @param nodeClass class of node to count
*/
protected AbstractNcssCountRule(Class<?> nodeClass) {
this.nodeClass = nodeClass;

setProperty(MINIMUM_DESCRIPTOR, 1000d);
protected AbstractNcssCountRule(Class<T> nodeClass) {
super(nodeClass);
}


@Override
public Object visit(AbstractApexNodeBase node, Object data) {
int numNodes = 0;
protected int getMetric(T node) {
return (Integer) new NcssVisitor().visit(node, null) + 1;
}

private static class NcssVisitor extends ApexParserVisitorAdapter {

for (int i = 0; i < node.jjtGetNumChildren(); i++) {
AbstractApexNodeBase n = (AbstractApexNodeBase) node.jjtGetChild(i);
Integer treeSize = (Integer) n.jjtAccept(this, data);
numNodes += treeSize.intValue();
@Override
public Object visit(AbstractApexNodeBase node, Object data) {
return countNodeChildren(node, data);
}

if (this.nodeClass.isInstance(node)) {
// Add 1 to account for base node
numNodes++;
DataPoint point = new DataPoint();
point.setNode(node);
point.setScore(1.0 * numNodes);
point.setMessage(getMessage());
addDataPoint(point);
/**
* Count the number of children of the given node. Adds one to count the
* node itself.
*
* @param node node having children counted
* @param data node data
*
* @return count of the number of children of the node, plus one
*/
protected Integer countNodeChildren(Node node, Object data) {
int nodeCount = 0;
for (int i = 0; i < node.jjtGetNumChildren(); i++) {
nodeCount += (Integer) ((AbstractApexNodeBase) node.jjtGetChild(i)).jjtAccept(this, data);
}
return nodeCount;
}

return Integer.valueOf(numNodes);
}
@Override
public Object visit(ASTForLoopStatement node, Object data) {
return countNodeChildren(node, data) + 1;
}

/**
* Count the number of children of the given node. Adds one to count the
* node itself.
*
* @param node
* node having children counted
* @param data
* node data
* @return count of the number of children of the node, plus one
*/
protected Integer countNodeChildren(Node node, Object data) {
Integer nodeCount;
int lineCount = 0;
for (int i = 0; i < node.jjtGetNumChildren(); i++) {
nodeCount = (Integer) ((AbstractApexNodeBase) node.jjtGetChild(i)).jjtAccept(this, data);
lineCount += nodeCount.intValue();
}
return ++lineCount;
}
@Override
public Object visit(ASTForEachStatement node, Object data) {
return countNodeChildren(node, data) + 1;
}

@Override
public Object visit(ASTForLoopStatement node, Object data) {
return countNodeChildren(node, data);
}
@Override
public Object visit(ASTDoLoopStatement node, Object data) {
return countNodeChildren(node, data) + 1;
}

@Override
public Object visit(ASTForEachStatement node, Object data) {
return countNodeChildren(node, data);
}
@Override
public Object visit(ASTIfBlockStatement node, Object data) {
return countNodeChildren(node, data) + 1;
}

@Override
public Object visit(ASTDoLoopStatement node, Object data) {
return countNodeChildren(node, data);
}
@Override
public Object visit(ASTIfElseBlockStatement node, Object data) {
return countNodeChildren(node, data) + 2;
}

@Override
public Object visit(ASTIfBlockStatement node, Object data) {
return countNodeChildren(node, data);
}
@Override
public Object visit(ASTWhileLoopStatement node, Object data) {
return countNodeChildren(node, data) + 1;
}

@Override
public Object visit(ASTIfElseBlockStatement node, Object data) {
@Override
public Object visit(ASTBreakStatement node, Object data) {
return 1;
}

Integer lineCount = countNodeChildren(node, data);
lineCount++;
@Override
public Object visit(ASTTryCatchFinallyBlockStatement node, Object data) {
return countNodeChildren(node, data) + 1;
}

return lineCount;
}
@Override
public Object visit(ASTContinueStatement node, Object data) {
return 1;
}

@Override
public Object visit(ASTWhileLoopStatement node, Object data) {
return countNodeChildren(node, data);
}
@Override
public Object visit(ASTReturnStatement node, Object data) {
return countNodeChildren(node, data) + 1;
}

@Override
public Object visit(ASTBreakStatement node, Object data) {
return NumericConstants.ONE;
}
@Override
public Object visit(ASTThrowStatement node, Object data) {
return countNodeChildren(node, data) + 1;
}

@Override
public Object visit(ASTTryCatchFinallyBlockStatement node, Object data) {
return countNodeChildren(node, data);
}
@Override
public Object visit(ASTStatement node, Object data) {
return 1;
}

@Override
public Object visit(ASTContinueStatement node, Object data) {
return NumericConstants.ONE;
}
@Override
public Object visit(ASTMethodCallExpression node, Object data) {
return 1;
}

@Override
public Object visit(ASTReturnStatement node, Object data) {
return countNodeChildren(node, data);
}
@Override
public Object visit(ASTMethod node, Object data) {
return node.isSynthetic() ? 0 : countNodeChildren(node, data);
}

@Override
public Object visit(ASTThrowStatement node, Object data) {
return countNodeChildren(node, data);
}
@Override
public Object visit(ASTUserClass node, Object data) {
return countNodeChildren(node, data) + 1;
}

@Override
public Object visit(ASTStatement node, Object data) {
return NumericConstants.ONE;
}
@Override
public Object visit(ASTUserEnum node, Object data) {
return countNodeChildren(node, data) + 1;
}

@Override
public Object visit(ASTMethodCallExpression node, Object data) {
return NumericConstants.ONE;
@Override
public Object visit(ASTUserInterface node, Object data) {
return countNodeChildren(node, data) + 1;
}

@Override
public Object visit(ASTFieldDeclaration node, Object data) {
return 1;
}
}
}
Expand Up @@ -5,23 +5,25 @@
package net.sourceforge.pmd.lang.apex.rule.design;

import net.sourceforge.pmd.lang.apex.ast.ASTUserClass;
import net.sourceforge.pmd.lang.apex.rule.internal.AbstractCounterCheckRule;

/**
* This rule detects when a class exceeds a certain threshold. i.e. if a class
* has more than 1000 lines of code.
*/
public class ExcessiveClassLengthRule extends ExcessiveLengthRule {
public class ExcessiveClassLengthRule extends AbstractCounterCheckRule.AbstractLineLengthCheckRule<ASTUserClass> {

public ExcessiveClassLengthRule() {
super(ASTUserClass.class);
setProperty(MINIMUM_DESCRIPTOR, 1000d);
}

@Override
public Object visit(ASTUserClass node, Object data) {
if (!node.getModifiers().isTest()) {
return super.visit(node, data);
}
protected int defaultReportLevel() {
return 1000;
}

return data;
@Override
protected boolean isIgnored(ASTUserClass node) {
return node.getModifiers().isTest();
}
}