support shorthand property name in object literal (#4263)

This commit is contained in:
Alex Lam S.L
2020-11-08 02:44:44 +00:00
committed by GitHub
parent 4bbeb09f7c
commit b82de04775
2 changed files with 54 additions and 42 deletions

View File

@@ -1219,7 +1219,7 @@ function parse($TEXT, options) {
var tok = S.token, ret; var tok = S.token, ret;
switch (tok.type) { switch (tok.type) {
case "name": case "name":
ret = _make_symbol(AST_SymbolRef); ret = _make_symbol(AST_SymbolRef, tok);
break; break;
case "num": case "num":
ret = new AST_Number({ start: tok, end: tok, value: tok.value }); ret = new AST_Number({ start: tok, end: tok, value: tok.value });
@@ -1337,36 +1337,45 @@ function parse($TEXT, options) {
var first = true, a = []; var first = true, a = [];
while (!is("punc", "}")) { while (!is("punc", "}")) {
if (first) first = false; else expect(","); if (first) first = false; else expect(",");
if (!options.strict && is("punc", "}"))
// allow trailing comma // allow trailing comma
break; if (!options.strict && is("punc", "}")) break;
var start = S.token; var start = S.token;
var type = start.type; var type = start.type;
var name = as_property_name(); var name = as_property_name();
if (type == "name" && !is("punc", ":")) { if (!is("punc", ":") && type == "name") switch (name) {
var key = new AST_SymbolAccessor({ case "get":
start: S.token,
name: "" + as_property_name(),
end: prev()
});
if (name == "get") {
a.push(new AST_ObjectGetter({ a.push(new AST_ObjectGetter({
start: start, start: start,
key : key, key: new AST_SymbolAccessor({
start: S.token,
name: "" + as_property_name(),
end: prev(),
}),
value: create_accessor(), value: create_accessor(),
end : prev() end: prev(),
})); }));
continue; continue;
} case "set":
if (name == "set") {
a.push(new AST_ObjectSetter({ a.push(new AST_ObjectSetter({
start: start, start: start,
key : key, key: new AST_SymbolAccessor({
start: S.token,
name: "" + as_property_name(),
end: prev(),
}),
value: create_accessor(), value: create_accessor(),
end : prev() end: prev(),
}));
continue;
default:
a.push(new AST_ObjectKeyVal({
start: start,
quote: start.quote,
key: "" + name,
value: _make_symbol(AST_SymbolRef, start),
end: prev(),
})); }));
continue; continue;
}
} }
expect(":"); expect(":");
a.push(new AST_ObjectKeyVal({ a.push(new AST_ObjectKeyVal({
@@ -1405,12 +1414,12 @@ function parse($TEXT, options) {
return name; return name;
} }
function _make_symbol(type) { function _make_symbol(type, token) {
var name = S.token.value; var name = token.value;
return new (name == "this" ? AST_This : type)({ return new (name === "this" ? AST_This : type)({
name : String(name), name: "" + name,
start : S.token, start: token,
end : S.token end: token,
}); });
} }
@@ -1424,7 +1433,7 @@ function parse($TEXT, options) {
if (!noerror) croak("Name expected"); if (!noerror) croak("Name expected");
return null; return null;
} }
var sym = _make_symbol(type); var sym = _make_symbol(type, S.token);
if (S.input.has_directive("use strict") && sym instanceof AST_SymbolDeclaration) { if (S.input.has_directive("use strict") && sym instanceof AST_SymbolDeclaration) {
strict_verify_symbol(sym); strict_verify_symbol(sym);
} }

View File

@@ -944,13 +944,16 @@ function createAccessor(recurmax, stmtDepth, canThrow) {
function createObjectLiteral(recurmax, stmtDepth, canThrow) { function createObjectLiteral(recurmax, stmtDepth, canThrow) {
recurmax--; recurmax--;
var obj = ["({"]; var obj = ["({"];
for (var i = rng(6); --i >= 0;) { for (var i = rng(6); --i >= 0;) switch (rng(20)) {
if (rng(20) == 0) { case 0:
obj.push(createAccessor(recurmax, stmtDepth, canThrow)); obj.push(createAccessor(recurmax, stmtDepth, canThrow));
} else { break;
var key = KEYS[rng(KEYS.length)]; case 1:
obj.push(key + ":(" + createExpression(recurmax, COMMA_OK, stmtDepth, canThrow) + "),"); obj.push(getVarName() + ",");
} break;
default:
obj.push(KEYS[rng(KEYS.length)] + ":(" + createExpression(recurmax, COMMA_OK, stmtDepth, canThrow) + "),");
break;
} }
obj.push("})"); obj.push("})");
return obj.join("\n"); return obj.join("\n");