added sourceFile and program options to parse

- if `program` is given, it'll be used as the toplevel node, instead of
  creating a new node, and statements will be added to its body
- if `sourceFile` is given and `locations` is ON, it'll set the `source`
  property in every node's `loc`.
This commit is contained in:
Mihai Bazon 2012-10-05 14:52:12 +03:00 committed by Marijn Haverbeke
parent b5e580a876
commit feaa7df563

View File

@ -26,14 +26,15 @@
// //
// [api]: https://developer.mozilla.org/en-US/docs/SpiderMonkey/Parser_API // [api]: https://developer.mozilla.org/en-US/docs/SpiderMonkey/Parser_API
var options, input, inputLen; var options, input, inputLen, sourceFile;
exports.parse = function(inpt, opts) { exports.parse = function(inpt, opts) {
input = String(inpt); inputLen = input.length; input = String(inpt); inputLen = input.length;
options = opts || {}; options = opts || {};
for (var opt in defaultOptions) if (!options.hasOwnProperty(opt)) for (var opt in defaultOptions) if (!options.hasOwnProperty(opt))
options[opt] = defaultOptions[opt]; options[opt] = defaultOptions[opt];
return parseTopLevel(); sourceFile = options.sourceFile || null;
return parseTopLevel(options.program);
}; };
// A second optional argument can be given to further configure // A second optional argument can be given to further configure
@ -808,7 +809,7 @@
tokCommentsBefore = null; tokCommentsBefore = null;
} }
if (options.locations) if (options.locations)
node.loc = {start: tokStartLoc, end: null}; node.loc = {start: tokStartLoc, end: null, source: sourceFile};
return node; return node;
} }
@ -824,7 +825,7 @@
other.commentsBefore = null; other.commentsBefore = null;
} }
if (options.locations) if (options.locations)
node.loc = {start: other.loc.start, end: null}; node.loc = {start: other.loc.start, end: null, source: other.loc.source};
return node; return node;
} }
@ -916,9 +917,11 @@
// ### Statement parsing // ### Statement parsing
// Parse a program. Initializes the parser, reads any number of // Parse a program. Initializes the parser, reads any number of
// statements, and wraps them in a Program node. // statements, and wraps them in a Program node. Optionally takes a
// `program` argument. If present, the statements will be appended
// to its body instead of creating a new node.
function parseTopLevel() { function parseTopLevel(program) {
initTokenState(); initTokenState();
lastStart = lastEnd = tokPos; lastStart = lastEnd = tokPos;
if (options.locations) lastEndLoc = curLineLoc(); if (options.locations) lastEndLoc = curLineLoc();
@ -926,8 +929,8 @@
labels = []; labels = [];
readToken(); readToken();
var node = startNode(), first = true; var node = program || startNode(), first = true;
node.body = []; if (!program) node.body = [];
while (tokType !== _eof) { while (tokType !== _eof) {
var stmt = parseStatement(); var stmt = parseStatement();
node.body.push(stmt); node.body.push(stmt);