package com.github.signed.pmd;
import java.io.StringReader;
import com.github.signed.pmd.rules.AlwaysComplain;
import net.sourceforge.pmd.PMD;
import net.sourceforge.pmd.PMDConfiguration;
import net.sourceforge.pmd.PMDException;
import net.sourceforge.pmd.Report;
import net.sourceforge.pmd.RuleContext;
import net.sourceforge.pmd.RuleSet;
import net.sourceforge.pmd.lang.LanguageVersion;
import net.sourceforge.pmd.lang.LanguageVersionHandler;
import net.sourceforge.pmd.lang.Parser;
import net.sourceforge.pmd.lang.VisitorStarter;
import net.sourceforge.pmd.lang.ast.Node;
import net.sourceforge.pmd.lang.java.Java17Handler;
import net.sourceforge.pmd.lang.java.JavaLanguageModule;
import net.sourceforge.pmd.lang.java.ast.JavaNode;
import net.sourceforge.pmd.lang.java.ast.ParseException;
public class AstParser {
public static final LanguageVersion JAVA_7 = new LanguageVersion(new JavaLanguageModule(), "1.7", new Java17Handler());
public JavaNode parse(String source) throws PMDException {
Report report = new Report();
RuleContext ctx = new RuleContext();
ctx.setReport(report);
ctx.setSourceCodeFilename("n/a");
ctx.setLanguageVersion(JAVA_7);
RuleSet rules = new RuleSet();
rules.addRule(new AlwaysComplain());
PMDConfiguration configuration = new PMDConfiguration();
configuration.setDefaultLanguageVersion(JAVA_7);
try (StringReader sourceCode = new StringReader(source)) {
try {
LanguageVersion languageVersion = ctx.getLanguageVersion();
LanguageVersionHandler languageVersionHandler = languageVersion.getLanguageVersionHandler();
Parser parser = PMD.parserFor(languageVersion, configuration);
Node rootNode = parser.parse(ctx.getSourceCodeFilename(), sourceCode);
languageVersionHandler.getSymbolFacade().start(rootNode);
languageVersion.getLanguageVersionHandler().getDataFlowFacade().start(rootNode);
VisitorStarter typeResolutionFacade = languageVersion.getLanguageVersionHandler().getTypeResolutionFacade(configuration.getClassLoader());
typeResolutionFacade.start(rootNode);
return (JavaNode) rootNode;
} catch (ParseException pe) {
throw new PMDException("Error while parsing " + ctx.getSourceCodeFilename(), pe);
} catch (Exception e) {
throw new PMDException("Error while processing " + ctx.getSourceCodeFilename(), e);
}
}
}
}