/**
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd.lang.apex.ast;
import java.io.IOException;
import java.io.Reader;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.io.IOUtils;
import net.sourceforge.pmd.lang.apex.ApexParserOptions;
import net.sourceforge.pmd.lang.ast.ParseException;
import apex.jorje.semantic.ast.compilation.Compilation;
import apex.jorje.semantic.ast.compilation.UserClass;
import apex.jorje.semantic.ast.compilation.UserEnum;
import apex.jorje.semantic.ast.compilation.UserInterface;
import apex.jorje.semantic.ast.compilation.UserTrigger;
import apex.jorje.semantic.ast.visitor.AdditionalPassScope;
import apex.jorje.semantic.ast.visitor.AstVisitor;
public class ApexParser {
protected final ApexParserOptions parserOptions;
private Map<Integer, String> suppressMap;
private String suppressMarker = "NOPMD";
public ApexParser(ApexParserOptions parserOptions) {
this.parserOptions = parserOptions;
if (parserOptions.getSuppressMarker() != null) {
suppressMarker = parserOptions.getSuppressMarker();
}
}
public Compilation parseApex(final String sourceCode) throws ParseException {
TopLevelVisitor visitor = new TopLevelVisitor();
CompilerService.INSTANCE.visitAstFromString(sourceCode, visitor);
Compilation astRoot = visitor.getTopLevel();
return astRoot;
}
public ApexNode<Compilation> parse(final Reader reader) {
try {
final String sourceCode = IOUtils.toString(reader);
final Compilation astRoot = parseApex(sourceCode);
final ApexTreeBuilder treeBuilder = new ApexTreeBuilder(sourceCode);
suppressMap = new HashMap<>();
if (astRoot == null) {
throw new ParseException("Couldn't parse the source - there is not root node - Syntax Error??");
}
ApexNode<Compilation> tree = treeBuilder.build(astRoot);
return tree;
} catch (IOException e) {
throw new ParseException(e);
}
}
public Map<Integer, String> getSuppressMap() {
return suppressMap;
}
private class TopLevelVisitor extends AstVisitor<AdditionalPassScope> {
Compilation topLevel;
public Compilation getTopLevel() {
return topLevel;
}
@Override
public void visitEnd(UserClass node, AdditionalPassScope scope) {
topLevel = node;
}
@Override
public void visitEnd(UserEnum node, AdditionalPassScope scope) {
topLevel = node;
}
@Override
public void visitEnd(UserInterface node, AdditionalPassScope scope) {
topLevel = node;
}
@Override
public void visitEnd(UserTrigger node, AdditionalPassScope scope) {
topLevel = node;
}
}
}