1
2
3
4 package net.sourceforge.pmd.lang.ecmascript.ast;
5
6 import java.io.IOException;
7 import java.io.Reader;
8 import java.util.ArrayList;
9 import java.util.List;
10
11 import net.sourceforge.pmd.lang.ast.ParseException;
12 import net.sourceforge.pmd.lang.ecmascript.EcmascriptParserOptions;
13
14 import org.apache.commons.io.IOUtils;
15 import org.mozilla.javascript.CompilerEnvirons;
16 import org.mozilla.javascript.Parser;
17 import org.mozilla.javascript.ast.AstRoot;
18 import org.mozilla.javascript.ast.ErrorCollector;
19 import org.mozilla.javascript.ast.ParseProblem;
20
21 public class EcmascriptParser {
22 protected final EcmascriptParserOptions parserOptions;
23
24 public EcmascriptParser(EcmascriptParserOptions parserOptions) {
25 this.parserOptions = parserOptions;
26 }
27
28 protected AstRoot parseEcmascript(final String sourceCode, final List<ParseProblem> parseProblems) throws ParseException {
29 final CompilerEnvirons compilerEnvirons = new CompilerEnvirons();
30 compilerEnvirons.setRecordingComments(parserOptions.isRecordingComments());
31 compilerEnvirons.setRecordingLocalJsDocComments(parserOptions.isRecordingLocalJsDocComments());
32 compilerEnvirons.setLanguageVersion(parserOptions.getRhinoLanguageVersion().getVersion());
33 compilerEnvirons.setIdeMode(true);
34 compilerEnvirons.setWarnTrailingComma(true);
35
36
37 final ErrorCollector errorCollector = new ErrorCollector();
38 final Parser parser = new Parser(compilerEnvirons, errorCollector);
39
40 final String sourceURI = "unknown";
41 final int beginLineno = 1;
42 AstRoot astRoot = parser.parse(sourceCode, sourceURI, beginLineno);
43 parseProblems.addAll(errorCollector.getErrors());
44 return astRoot;
45 }
46
47 public EcmascriptNode<AstRoot> parse(final Reader reader) {
48 try {
49 final List<ParseProblem> parseProblems = new ArrayList<ParseProblem>();
50 final String sourceCode = IOUtils.toString(reader);
51 final AstRoot astRoot = parseEcmascript(sourceCode, parseProblems);
52 final EcmascriptTreeBuilder treeBuilder = new EcmascriptTreeBuilder(sourceCode, parseProblems);
53 return treeBuilder.build(astRoot);
54 } catch (IOException e) {
55 throw new ParseException(e);
56 }
57 }
58 }