template string mozilla ASTs

This commit is contained in:
Fábio Santos 2018-03-20 20:48:28 +00:00
parent 0c924fca64
commit a69b51e25d
4 changed files with 70 additions and 2 deletions

View File

@ -445,7 +445,7 @@ var AST_PrefixedTemplateString = DEFNODE("PrefixedTemplateString", "template_str
this.prefix._walk(visitor); this.prefix._walk(visitor);
this.template_string._walk(visitor); this.template_string._walk(visitor);
} }
}) });
var AST_TemplateString = DEFNODE("TemplateString", "segments", { var AST_TemplateString = DEFNODE("TemplateString", "segments", {
$documentation: "A template string literal", $documentation: "A template string literal",

View File

@ -114,6 +114,36 @@
expression: from_moz(M.argument) 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) { FunctionDeclaration: function(M) {
return new AST_Defun({ return new AST_Defun({
start: my_start_token(M), 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) { def_to_moz(AST_Defun, function To_Moz_FunctionDeclaration(M) {
return { return {
type: "FunctionDeclaration", type: "FunctionDeclaration",

View File

@ -2693,7 +2693,8 @@ function parse($TEXT, options) {
return subscripts(new AST_PrefixedTemplateString({ return subscripts(new AST_PrefixedTemplateString({
start: start, start: start,
prefix: expr, prefix: expr,
template_string: template_string() template_string: template_string(),
end: prev()
}), allow_calls); }), allow_calls);
} }
return expr; return expr;

View File

@ -66,6 +66,11 @@ var { w: w1, ...V } = { w: 7, x: 1, y: 2 };
for (const x of y) {} for (const x of y) {}
async function f1() { await x + y; } async function f1() { await x + y; }
``;
`x`;
`x${1}`;
String.raw`\n`;
// arrow.js // arrow.js
var foo = ([]) => "foo"; var foo = ([]) => "foo";