diff --git a/lib/parse-js.js b/lib/parse-js.js index 17e15eef..0f03fa8b 100644 --- a/lib/parse-js.js +++ b/lib/parse-js.js @@ -663,6 +663,10 @@ function NodeWithToken(str, start, end) { NodeWithToken.prototype.toString = function() { return this.name; }; +// embed_tokens === true: first element is NodeWithToken, +// === ".loc": array .loc property set to NodeWithToken, +// else first element is string name of node. + function parse($TEXT, exigent_mode, embed_tokens) { var S = { @@ -750,14 +754,25 @@ function parse($TEXT, exigent_mode, embed_tokens) { function add_tokens(str, start, end) { return str instanceof NodeWithToken ? str : new NodeWithToken(str, start, end); }; + + function append_tokens(ast, start, end) { + ast.loc = ast.loc || new NodeWithToken(ast[0], start, end); + return ast; + }; function maybe_embed_tokens(parser) { - if (embed_tokens) return function() { + if (embed_tokens === true) return function() { var start = S.token; var ast = parser.apply(this, arguments); ast[0] = add_tokens(ast[0], start, prev()); return ast; }; + else if (embed_tokens === ".loc") return function() { + var start = S.token; + var ast = parser.apply(this, arguments); + ast = append_tokens(ast, start, prev()); + return ast; + }; else return parser; }; @@ -1278,7 +1293,7 @@ function array_to_hash(a) { }; function slice(a, start) { - return Array.prototype.slice.call(a, start == null ? 0 : start); + return Array.prototype.slice.call(a, start || 0); }; function characters(str) {