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

View File

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