Merge branch 'pr-1558'

This commit is contained in:
Andreas Dangel
2019-01-26 18:45:06 +01:00
23 changed files with 506 additions and 144 deletions

View File

@ -5,21 +5,34 @@
package net.sourceforge.pmd.lang.apex;
import java.io.Writer;
import java.util.Arrays;
import java.util.List;
import net.sourceforge.pmd.lang.AbstractLanguageVersionHandler;
import net.sourceforge.pmd.lang.Parser;
import net.sourceforge.pmd.lang.ParserOptions;
import net.sourceforge.pmd.lang.VisitorStarter;
import net.sourceforge.pmd.lang.XPathHandler;
import net.sourceforge.pmd.lang.apex.ast.ASTMethod;
import net.sourceforge.pmd.lang.apex.ast.ASTUserClassOrInterface;
import net.sourceforge.pmd.lang.apex.ast.ApexNode;
import net.sourceforge.pmd.lang.apex.ast.DumpFacade;
import net.sourceforge.pmd.lang.apex.metrics.ApexMetricsComputer;
import net.sourceforge.pmd.lang.apex.metrics.api.ApexClassMetricKey;
import net.sourceforge.pmd.lang.apex.metrics.api.ApexOperationMetricKey;
import net.sourceforge.pmd.lang.apex.multifile.ApexMultifileVisitorFacade;
import net.sourceforge.pmd.lang.apex.rule.ApexRuleViolationFactory;
import net.sourceforge.pmd.lang.ast.xpath.DefaultASTXPathHandler;
import net.sourceforge.pmd.lang.metrics.LanguageMetricsProvider;
import net.sourceforge.pmd.lang.metrics.internal.AbstractLanguageMetricsProvider;
import net.sourceforge.pmd.lang.rule.RuleViolationFactory;
public class ApexHandler extends AbstractLanguageVersionHandler {
private final ApexMetricsProvider myMetricsProvider = new ApexMetricsProvider();
@Override
public VisitorStarter getMultifileFacade() {
return rootNode -> new ApexMultifileVisitorFacade().initializeWith((ApexNode<?>) rootNode);
@ -51,4 +64,31 @@ public class ApexHandler extends AbstractLanguageVersionHandler {
return rootNode -> new DumpFacade().initializeWith(writer, prefix, recurse, (ApexNode<?>) rootNode);
}
@Override
public LanguageMetricsProvider<ASTUserClassOrInterface<?>, ASTMethod> getLanguageMetricsProvider() {
return myMetricsProvider;
}
private static class ApexMetricsProvider extends AbstractLanguageMetricsProvider<ASTUserClassOrInterface<?>, ASTMethod> {
@SuppressWarnings("unchecked")
ApexMetricsProvider() {
// a wild double cast
super((Class<ASTUserClassOrInterface<?>>) (Object) ASTUserClassOrInterface.class, ASTMethod.class, ApexMetricsComputer.getInstance());
}
@Override
public List<ApexClassMetricKey> getAvailableTypeMetrics() {
return Arrays.asList(ApexClassMetricKey.values());
}
@Override
public List<ApexOperationMetricKey> getAvailableOperationMetrics() {
return Arrays.asList(ApexOperationMetricKey.values());
}
}
}

View File

@ -7,6 +7,7 @@ package net.sourceforge.pmd.lang.apex.metrics;
import java.util.ArrayList;
import java.util.List;
import net.sourceforge.pmd.annotation.InternalApi;
import net.sourceforge.pmd.lang.apex.ast.ASTMethod;
import net.sourceforge.pmd.lang.apex.ast.ASTUserClassOrInterface;
import net.sourceforge.pmd.lang.metrics.AbstractMetricsComputer;
@ -18,7 +19,13 @@ import net.sourceforge.pmd.lang.metrics.AbstractMetricsComputer;
*/
public class ApexMetricsComputer extends AbstractMetricsComputer<ASTUserClassOrInterface<?>, ASTMethod> {
static final ApexMetricsComputer INSTANCE = new ApexMetricsComputer();
private static final ApexMetricsComputer INSTANCE = new ApexMetricsComputer();
@InternalApi
public static ApexMetricsComputer getInstance() {
return INSTANCE;
}
@Override

View File

@ -27,7 +27,7 @@ public class ApexMetricsFacade extends AbstractMetricsFacade<ASTUserClassOrInter
@Override
protected MetricsComputer<ASTUserClassOrInterface<?>, ASTMethod> getLanguageSpecificComputer() {
return ApexMetricsComputer.INSTANCE;
return ApexMetricsComputer.getInstance();
}

View File

@ -91,7 +91,7 @@ public class ApexProjectMirrorTest {
@Override
public Object visit(ASTMethod node, Object data) {
MetricMemoizer<ASTMethod> op = toplevel.getOperationMemoizer(node.getQualifiedName());
result.add((int) ApexMetricsComputer.INSTANCE.computeForOperation(opMetricKey, node, force,
result.add((int) ApexMetricsComputer.getInstance().computeForOperation(opMetricKey, node, force,
MetricOptions.emptyOptions(), op));
return super.visit(node, data);
}
@ -100,7 +100,7 @@ public class ApexProjectMirrorTest {
@Override
public Object visit(ASTUserClass node, Object data) {
MetricMemoizer<ASTUserClassOrInterface<?>> clazz = toplevel.getClassMemoizer(node.getQualifiedName());
result.add((int) ApexMetricsComputer.INSTANCE.computeForType(classMetricKey, node, force,
result.add((int) ApexMetricsComputer.getInstance().computeForType(classMetricKey, node, force,
MetricOptions.emptyOptions(), clazz));
return super.visit(node, data);
}