From a69b51e25d94756c790f5f58d8f59ed48d70b6e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A1bio=20Santos?= Date: Tue, 20 Mar 2018 20:48:28 +0000 Subject: [PATCH] template string mozilla ASTs --- lib/ast.js | 2 +- lib/mozilla-ast.js | 62 ++++++++++++++++++++++++++++++++ lib/parse.js | 3 +- test/input/spidermonkey/input.js | 5 +++ 4 files changed, 70 insertions(+), 2 deletions(-) diff --git a/lib/ast.js b/lib/ast.js index f921a71c..da654606 100644 --- a/lib/ast.js +++ b/lib/ast.js @@ -445,7 +445,7 @@ var AST_PrefixedTemplateString = DEFNODE("PrefixedTemplateString", "template_str this.prefix._walk(visitor); this.template_string._walk(visitor); } -}) +}); var AST_TemplateString = DEFNODE("TemplateString", "segments", { $documentation: "A template string literal", diff --git a/lib/mozilla-ast.js b/lib/mozilla-ast.js index 173c6a15..ec8bc87d 100644 --- a/lib/mozilla-ast.js +++ b/lib/mozilla-ast.js @@ -114,6 +114,36 @@ expression: from_moz(M.argument) }); }, + TemplateElement: function(M) { + return new AST_TemplateSegment({ + start: my_start_token(M), + end: my_end_token(M), + value: M.value.cooked, + raw: M.value.raw + }); + }, + TemplateLiteral: function(M) { + var segments = []; + for (var i = 0; i < M.quasis.length; i++) { + segments.push(from_moz(M.quasis[i])); + if (M.expressions[i]) { + segments.push(from_moz(M.expressions[i])); + } + } + return new AST_TemplateString({ + start: my_start_token(M), + end: my_end_token(M), + segments: segments + }); + }, + TaggedTemplateExpression: function(M) { + return new AST_PrefixedTemplateString({ + start: my_start_token(M), + end: my_end_token(M), + template_string: from_moz(M.quasi), + prefix: from_moz(M.tag) + }); + }, FunctionDeclaration: function(M) { return new AST_Defun({ start: my_start_token(M), @@ -457,6 +487,38 @@ }; }); + def_to_moz(AST_PrefixedTemplateString, function To_Moz_TaggedTemplateExpression(M) { + return { + type: "TaggedTemplateExpression", + tag: to_moz(M.prefix), + quasi: to_moz(M.template_string) + }; + }); + + def_to_moz(AST_TemplateString, function To_Moz_TemplateLiteral(M) { + var quasis = []; + var expressions = []; + for (var i = 0; i < M.segments.length; i++) { + if (i % 2 !== 0) { + expressions.push(to_moz(M.segments[i])); + } else { + quasis.push({ + type: "TemplateElement", + value: { + raw: M.segments[i].raw, + cooked: M.segments[i].value + }, + tail: i === M.segments.length - 1 + }); + } + } + return { + type: "TemplateLiteral", + quasis: quasis, + expressions: expressions + }; + }); + def_to_moz(AST_Defun, function To_Moz_FunctionDeclaration(M) { return { type: "FunctionDeclaration", diff --git a/lib/parse.js b/lib/parse.js index ddf09001..78640dc5 100644 --- a/lib/parse.js +++ b/lib/parse.js @@ -2693,7 +2693,8 @@ function parse($TEXT, options) { return subscripts(new AST_PrefixedTemplateString({ start: start, prefix: expr, - template_string: template_string() + template_string: template_string(), + end: prev() }), allow_calls); } return expr; diff --git a/test/input/spidermonkey/input.js b/test/input/spidermonkey/input.js index 9108aa0d..033bbfa4 100644 --- a/test/input/spidermonkey/input.js +++ b/test/input/spidermonkey/input.js @@ -66,6 +66,11 @@ var { w: w1, ...V } = { w: 7, x: 1, y: 2 }; for (const x of y) {} async function f1() { await x + y; } +``; +`x`; +`x${1}`; +String.raw`\n`; + // arrow.js var foo = ([]) => "foo";