From 01a83b461f541898cb4b2f9ef033245c1a7ee18b Mon Sep 17 00:00:00 2001 From: johnjbarton Date: Fri, 12 Aug 2011 13:55:19 -0700 Subject: [PATCH 1/3] parameter start arrives 'undefined' or 'null', any falsy value should be zero --- lib/parse-js.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/parse-js.js b/lib/parse-js.js index 17e15eef..86a89e7c 100644 --- a/lib/parse-js.js +++ b/lib/parse-js.js @@ -1278,7 +1278,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) { From 9e32ed5637c040f71e3e924763a1cf3a830f5309 Mon Sep 17 00:00:00 2001 From: johnjbarton Date: Fri, 12 Aug 2011 14:45:22 -0700 Subject: [PATCH 2/3] change embed_tokens to add .loc = NodeWithToken to each node rather than replace the ast[0] field --- lib/parse-js.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/parse-js.js b/lib/parse-js.js index 86a89e7c..978f8f65 100644 --- a/lib/parse-js.js +++ b/lib/parse-js.js @@ -747,15 +747,16 @@ function parse($TEXT, exigent_mode, embed_tokens) { return ex; }; - function add_tokens(str, start, end) { - return str instanceof NodeWithToken ? str : new NodeWithToken(str, start, end); + function add_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() { var start = S.token; var ast = parser.apply(this, arguments); - ast[0] = add_tokens(ast[0], start, prev()); + ast = add_tokens(ast, start, prev()); return ast; }; else return parser; From 51b81b4e0f203193ec551b573d4d99786c85e970 Mon Sep 17 00:00:00 2001 From: johnjbarton Date: Mon, 15 Aug 2011 09:57:31 -0700 Subject: [PATCH 3/3] re-implement .loc version of NodeWithToken to be backwards compat --- lib/parse-js.js | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/lib/parse-js.js b/lib/parse-js.js index 978f8f65..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 = { @@ -747,16 +751,26 @@ function parse($TEXT, exigent_mode, embed_tokens) { return ex; }; - function add_tokens(ast, start, end) { + 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 = add_tokens(ast, start, prev()); + ast = append_tokens(ast, start, prev()); return ast; }; else return parser;