From b82de04775a490f7a1ebf7a8911f7d1a24a5f0b6 Mon Sep 17 00:00:00 2001 From: "Alex Lam S.L" Date: Sun, 8 Nov 2020 02:44:44 +0000 Subject: [PATCH] support shorthand property name in object literal (#4263) --- lib/parse.js | 79 +++++++++++++++++++++++++-------------------- test/ufuzz/index.js | 17 ++++++---- 2 files changed, 54 insertions(+), 42 deletions(-) diff --git a/lib/parse.js b/lib/parse.js index 82717d26..78311f89 100644 --- a/lib/parse.js +++ b/lib/parse.js @@ -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; + // allow trailing comma + 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") { - a.push(new AST_ObjectGetter({ - start : start, - key : key, - value : create_accessor(), - end : prev() - })); - continue; - } - if (name == "set") { - a.push(new AST_ObjectSetter({ - start : start, - key : key, - value : create_accessor(), - end : prev() - })); - continue; - } + if (!is("punc", ":") && type == "name") switch (name) { + case "get": + a.push(new AST_ObjectGetter({ + start: start, + key: new AST_SymbolAccessor({ + start: S.token, + name: "" + as_property_name(), + end: prev(), + }), + value: create_accessor(), + end: prev(), + })); + continue; + case "set": + a.push(new AST_ObjectSetter({ + start: start, + key: new AST_SymbolAccessor({ + start: S.token, + name: "" + as_property_name(), + end: prev(), + }), + value: create_accessor(), + 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); } diff --git a/test/ufuzz/index.js b/test/ufuzz/index.js index 1ebc655b..48e5a2fe 100644 --- a/test/ufuzz/index.js +++ b/test/ufuzz/index.js @@ -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) { - obj.push(createAccessor(recurmax, stmtDepth, canThrow)); - } else { - var key = KEYS[rng(KEYS.length)]; - obj.push(key + ":(" + createExpression(recurmax, COMMA_OK, stmtDepth, canThrow) + "),"); - } + for (var i = rng(6); --i >= 0;) switch (rng(20)) { + case 0: + obj.push(createAccessor(recurmax, 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"); -- 2.34.1