/**
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd.test.lang;
import java.io.Reader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import net.sourceforge.pmd.Rule;
import net.sourceforge.pmd.RuleContext;
import net.sourceforge.pmd.RuleViolation;
import net.sourceforge.pmd.lang.AbstractLanguageVersionHandler;
import net.sourceforge.pmd.lang.AbstractParser;
import net.sourceforge.pmd.lang.BaseLanguageModule;
import net.sourceforge.pmd.lang.Parser;
import net.sourceforge.pmd.lang.ParserOptions;
import net.sourceforge.pmd.lang.TokenManager;
import net.sourceforge.pmd.lang.ast.Node;
import net.sourceforge.pmd.lang.ast.ParseException;
import net.sourceforge.pmd.lang.rule.AbstractRuleChainVisitor;
import net.sourceforge.pmd.lang.rule.AbstractRuleViolationFactory;
import net.sourceforge.pmd.lang.rule.ParametricRuleViolation;
import net.sourceforge.pmd.test.lang.ast.DummyNode;
/**
* Dummy language used for testing PMD.
*/
public class DummyLanguageModule extends BaseLanguageModule {
public static final String NAME = "Dummy";
public static final String TERSE_NAME = "dummy";
public DummyLanguageModule() {
super(NAME, null, TERSE_NAME, DummyRuleChainVisitor.class, "dummy");
addVersion("1.0", new Handler(), false);
addVersion("1.1", new Handler(), false);
addVersion("1.2", new Handler(), false);
addVersion("1.3", new Handler(), false);
addVersion("1.4", new Handler(), false);
addVersion("1.5", new Handler(), false);
addVersion("1.6", new Handler(), false);
addVersion("1.7", new Handler(), true);
addVersion("1.8", new Handler(), false);
}
public static class DummyRuleChainVisitor extends AbstractRuleChainVisitor {
@Override
protected void visit(Rule rule, Node node, RuleContext ctx) {
rule.apply(Arrays.asList(node), ctx);
}
@Override
protected void indexNodes(List<Node> nodes, RuleContext ctx) {
for (Node n : nodes) {
indexNode(n);
List<Node> childs = new ArrayList<>();
for (int i = 0; i < n.jjtGetNumChildren(); i++) {
childs.add(n.jjtGetChild(i));
}
indexNodes(childs, ctx);
}
}
}
public static class Handler extends AbstractLanguageVersionHandler {
@Override
public RuleViolationFactory getRuleViolationFactory() {
return new RuleViolationFactory();
}
@Override
public Parser getParser(ParserOptions parserOptions) {
return new AbstractParser(parserOptions) {
@Override
public Node parse(String fileName, Reader source) throws ParseException {
DummyNode node = new DummyNode(1);
node.testingOnlySetBeginLine(1);
node.testingOnlySetBeginColumn(1);
node.setImage("Foo");
return node;
}
@Override
public Map<Integer, String> getSuppressMap() {
return Collections.emptyMap();
}
@Override
public boolean canParse() {
return true;
}
@Override
protected TokenManager createTokenManager(Reader source) {
return null;
}
};
}
}
public static class RuleViolationFactory extends AbstractRuleViolationFactory {
@Override
protected RuleViolation createRuleViolation(Rule rule, RuleContext ruleContext, Node node, String message) {
return createRuleViolation(rule, ruleContext, node, message, 0, 0);
}
@Override
protected RuleViolation createRuleViolation(Rule rule, RuleContext ruleContext, Node node, String message,
int beginLine, int endLine) {
ParametricRuleViolation<Node> rv = new ParametricRuleViolation<Node>(rule, ruleContext, node, message) {
{
// just for testing variable expansion
this.packageName = "foo";
}
};
rv.setLines(beginLine, endLine);
return rv;
}
}
}