support shorthand property name in object literal (#4263)
This commit is contained in:
79
lib/parse.js
79
lib/parse.js
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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");
|
||||||
|
|||||||
Reference in New Issue
Block a user