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 if (!options.strict && is("punc", "}")) break;
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, a.push(new AST_ObjectGetter({
name: "" + as_property_name(), start: start,
end: prev() key: new AST_SymbolAccessor({
}); start: S.token,
if (name == "get") { name: "" + as_property_name(),
a.push(new AST_ObjectGetter({ end: prev(),
start : start, }),
key : key, value: create_accessor(),
value : create_accessor(), end: prev(),
end : prev() }));
})); continue;
continue; case "set":
} a.push(new AST_ObjectSetter({
if (name == "set") { start: start,
a.push(new AST_ObjectSetter({ key: new AST_SymbolAccessor({
start : start, start: S.token,
key : key, name: "" + as_property_name(),
value : create_accessor(), end: prev(),
end : prev() }),
})); value: create_accessor(),
continue; 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;
} }
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");