From e1a21a36935f72acf86291403891671d80a191f0 Mon Sep 17 00:00:00 2001 From: kingwl Date: Sat, 20 Jun 2020 14:42:30 +0800 Subject: [PATCH 1/3] Avoid effect of element access expression --- src/compiler/transformers/esnext.ts | 9 +++++-- .../logicalAssignment10(target=es2015).js | 19 ++++++++++++++ ...logicalAssignment10(target=es2015).symbols | 19 ++++++++++++++ .../logicalAssignment10(target=es2015).types | 26 +++++++++++++++++++ .../logicalAssignment10(target=es2020).js | 18 +++++++++++++ ...logicalAssignment10(target=es2020).symbols | 19 ++++++++++++++ .../logicalAssignment10(target=es2020).types | 26 +++++++++++++++++++ .../logicalAssignment10(target=esnext).js | 17 ++++++++++++ ...logicalAssignment10(target=esnext).symbols | 19 ++++++++++++++ .../logicalAssignment10(target=esnext).types | 26 +++++++++++++++++++ .../logicalAssignment2(target=es2015).js | 14 +++++----- .../logicalAssignment2(target=es2020).js | 14 +++++----- .../logicalAssignment/logicalAssignment10.ts | 9 +++++++ 13 files changed, 219 insertions(+), 16 deletions(-) create mode 100644 tests/baselines/reference/logicalAssignment10(target=es2015).js create mode 100644 tests/baselines/reference/logicalAssignment10(target=es2015).symbols create mode 100644 tests/baselines/reference/logicalAssignment10(target=es2015).types create mode 100644 tests/baselines/reference/logicalAssignment10(target=es2020).js create mode 100644 tests/baselines/reference/logicalAssignment10(target=es2020).symbols create mode 100644 tests/baselines/reference/logicalAssignment10(target=es2020).types create mode 100644 tests/baselines/reference/logicalAssignment10(target=esnext).js create mode 100644 tests/baselines/reference/logicalAssignment10(target=esnext).symbols create mode 100644 tests/baselines/reference/logicalAssignment10(target=esnext).types create mode 100644 tests/cases/conformance/esnext/logicalAssignment/logicalAssignment10.ts diff --git a/src/compiler/transformers/esnext.ts b/src/compiler/transformers/esnext.ts index f38d0b7262d60..8c2e6eee39795 100644 --- a/src/compiler/transformers/esnext.ts +++ b/src/compiler/transformers/esnext.ts @@ -53,16 +53,21 @@ namespace ts { ); } else { + const tempArgumentExpression = factory.createTempVariable(hoistVariableDeclaration); + assignmentTarget = factory.createElementAccessExpression( tempVariable, - left.argumentExpression + tempArgumentExpression ); left = factory.createElementAccessExpression( factory.createAssignment( tempVariable, left.expression ), - left.argumentExpression + factory.createAssignment( + tempArgumentExpression, + left.argumentExpression + ) ); } } diff --git a/tests/baselines/reference/logicalAssignment10(target=es2015).js b/tests/baselines/reference/logicalAssignment10(target=es2015).js new file mode 100644 index 0000000000000..90ea89ff125f5 --- /dev/null +++ b/tests/baselines/reference/logicalAssignment10(target=es2015).js @@ -0,0 +1,19 @@ +//// [logicalAssignment10.ts] +var count = 0; +var obj = {}; +function incr() { + return ++count; +} + +obj[incr()] ??= incr(); + + +//// [logicalAssignment10.js] +var _a; +var _b, _c; +var count = 0; +var obj = {}; +function incr() { + return ++count; +} +(_a = (_b = obj)[_c = incr()]) !== null && _a !== void 0 ? _a : (_b[_c] = incr()); diff --git a/tests/baselines/reference/logicalAssignment10(target=es2015).symbols b/tests/baselines/reference/logicalAssignment10(target=es2015).symbols new file mode 100644 index 0000000000000..7cab406774317 --- /dev/null +++ b/tests/baselines/reference/logicalAssignment10(target=es2015).symbols @@ -0,0 +1,19 @@ +=== tests/cases/conformance/esnext/logicalAssignment/logicalAssignment10.ts === +var count = 0; +>count : Symbol(count, Decl(logicalAssignment10.ts, 0, 3)) + +var obj = {}; +>obj : Symbol(obj, Decl(logicalAssignment10.ts, 1, 3)) + +function incr() { +>incr : Symbol(incr, Decl(logicalAssignment10.ts, 1, 13)) + + return ++count; +>count : Symbol(count, Decl(logicalAssignment10.ts, 0, 3)) +} + +obj[incr()] ??= incr(); +>obj : Symbol(obj, Decl(logicalAssignment10.ts, 1, 3)) +>incr : Symbol(incr, Decl(logicalAssignment10.ts, 1, 13)) +>incr : Symbol(incr, Decl(logicalAssignment10.ts, 1, 13)) + diff --git a/tests/baselines/reference/logicalAssignment10(target=es2015).types b/tests/baselines/reference/logicalAssignment10(target=es2015).types new file mode 100644 index 0000000000000..b5b6d81ef01ff --- /dev/null +++ b/tests/baselines/reference/logicalAssignment10(target=es2015).types @@ -0,0 +1,26 @@ +=== tests/cases/conformance/esnext/logicalAssignment/logicalAssignment10.ts === +var count = 0; +>count : number +>0 : 0 + +var obj = {}; +>obj : {} +>{} : {} + +function incr() { +>incr : () => number + + return ++count; +>++count : number +>count : number +} + +obj[incr()] ??= incr(); +>obj[incr()] ??= incr() : any +>obj[incr()] : error +>obj : {} +>incr() : number +>incr : () => number +>incr() : number +>incr : () => number + diff --git a/tests/baselines/reference/logicalAssignment10(target=es2020).js b/tests/baselines/reference/logicalAssignment10(target=es2020).js new file mode 100644 index 0000000000000..e1afe130ceb34 --- /dev/null +++ b/tests/baselines/reference/logicalAssignment10(target=es2020).js @@ -0,0 +1,18 @@ +//// [logicalAssignment10.ts] +var count = 0; +var obj = {}; +function incr() { + return ++count; +} + +obj[incr()] ??= incr(); + + +//// [logicalAssignment10.js] +var _a, _b; +var count = 0; +var obj = {}; +function incr() { + return ++count; +} +(_a = obj)[_b = incr()] ?? (_a[_b] = incr()); diff --git a/tests/baselines/reference/logicalAssignment10(target=es2020).symbols b/tests/baselines/reference/logicalAssignment10(target=es2020).symbols new file mode 100644 index 0000000000000..7cab406774317 --- /dev/null +++ b/tests/baselines/reference/logicalAssignment10(target=es2020).symbols @@ -0,0 +1,19 @@ +=== tests/cases/conformance/esnext/logicalAssignment/logicalAssignment10.ts === +var count = 0; +>count : Symbol(count, Decl(logicalAssignment10.ts, 0, 3)) + +var obj = {}; +>obj : Symbol(obj, Decl(logicalAssignment10.ts, 1, 3)) + +function incr() { +>incr : Symbol(incr, Decl(logicalAssignment10.ts, 1, 13)) + + return ++count; +>count : Symbol(count, Decl(logicalAssignment10.ts, 0, 3)) +} + +obj[incr()] ??= incr(); +>obj : Symbol(obj, Decl(logicalAssignment10.ts, 1, 3)) +>incr : Symbol(incr, Decl(logicalAssignment10.ts, 1, 13)) +>incr : Symbol(incr, Decl(logicalAssignment10.ts, 1, 13)) + diff --git a/tests/baselines/reference/logicalAssignment10(target=es2020).types b/tests/baselines/reference/logicalAssignment10(target=es2020).types new file mode 100644 index 0000000000000..b5b6d81ef01ff --- /dev/null +++ b/tests/baselines/reference/logicalAssignment10(target=es2020).types @@ -0,0 +1,26 @@ +=== tests/cases/conformance/esnext/logicalAssignment/logicalAssignment10.ts === +var count = 0; +>count : number +>0 : 0 + +var obj = {}; +>obj : {} +>{} : {} + +function incr() { +>incr : () => number + + return ++count; +>++count : number +>count : number +} + +obj[incr()] ??= incr(); +>obj[incr()] ??= incr() : any +>obj[incr()] : error +>obj : {} +>incr() : number +>incr : () => number +>incr() : number +>incr : () => number + diff --git a/tests/baselines/reference/logicalAssignment10(target=esnext).js b/tests/baselines/reference/logicalAssignment10(target=esnext).js new file mode 100644 index 0000000000000..6f583319f76e3 --- /dev/null +++ b/tests/baselines/reference/logicalAssignment10(target=esnext).js @@ -0,0 +1,17 @@ +//// [logicalAssignment10.ts] +var count = 0; +var obj = {}; +function incr() { + return ++count; +} + +obj[incr()] ??= incr(); + + +//// [logicalAssignment10.js] +var count = 0; +var obj = {}; +function incr() { + return ++count; +} +obj[incr()] ??= incr(); diff --git a/tests/baselines/reference/logicalAssignment10(target=esnext).symbols b/tests/baselines/reference/logicalAssignment10(target=esnext).symbols new file mode 100644 index 0000000000000..7cab406774317 --- /dev/null +++ b/tests/baselines/reference/logicalAssignment10(target=esnext).symbols @@ -0,0 +1,19 @@ +=== tests/cases/conformance/esnext/logicalAssignment/logicalAssignment10.ts === +var count = 0; +>count : Symbol(count, Decl(logicalAssignment10.ts, 0, 3)) + +var obj = {}; +>obj : Symbol(obj, Decl(logicalAssignment10.ts, 1, 3)) + +function incr() { +>incr : Symbol(incr, Decl(logicalAssignment10.ts, 1, 13)) + + return ++count; +>count : Symbol(count, Decl(logicalAssignment10.ts, 0, 3)) +} + +obj[incr()] ??= incr(); +>obj : Symbol(obj, Decl(logicalAssignment10.ts, 1, 3)) +>incr : Symbol(incr, Decl(logicalAssignment10.ts, 1, 13)) +>incr : Symbol(incr, Decl(logicalAssignment10.ts, 1, 13)) + diff --git a/tests/baselines/reference/logicalAssignment10(target=esnext).types b/tests/baselines/reference/logicalAssignment10(target=esnext).types new file mode 100644 index 0000000000000..b5b6d81ef01ff --- /dev/null +++ b/tests/baselines/reference/logicalAssignment10(target=esnext).types @@ -0,0 +1,26 @@ +=== tests/cases/conformance/esnext/logicalAssignment/logicalAssignment10.ts === +var count = 0; +>count : number +>0 : 0 + +var obj = {}; +>obj : {} +>{} : {} + +function incr() { +>incr : () => number + + return ++count; +>++count : number +>count : number +} + +obj[incr()] ??= incr(); +>obj[incr()] ??= incr() : any +>obj[incr()] : error +>obj : {} +>incr() : number +>incr : () => number +>incr() : number +>incr : () => number + diff --git a/tests/baselines/reference/logicalAssignment2(target=es2015).js b/tests/baselines/reference/logicalAssignment2(target=es2015).js index c5dbfbac49f05..6c7539647e670 100644 --- a/tests/baselines/reference/logicalAssignment2(target=es2015).js +++ b/tests/baselines/reference/logicalAssignment2(target=es2015).js @@ -31,13 +31,13 @@ c.foo.bar().baz ??= result.foo.bar().baz //// [logicalAssignment2.js] "use strict"; var _a, _b, _c; -var _d, _e, _f, _g, _h, _j, _k, _l, _m; +var _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q; (_d = a).baz && (_d.baz = result.baz); (_e = b).baz || (_e.baz = result.baz); (_a = (_f = c).baz) !== null && _a !== void 0 ? _a : (_f.baz = result.baz); -(_g = a.foo)["baz"] && (_g["baz"] = result.foo.baz); -(_h = b.foo)["baz"] || (_h["baz"] = result.foo.baz); -(_b = (_j = c.foo)["baz"]) !== null && _b !== void 0 ? _b : (_j["baz"] = result.foo.baz); -(_k = a.foo.bar()).baz && (_k.baz = result.foo.bar().baz); -(_l = b.foo.bar()).baz || (_l.baz = result.foo.bar().baz); -(_c = (_m = c.foo.bar()).baz) !== null && _c !== void 0 ? _c : (_m.baz = result.foo.bar().baz); +(_g = a.foo)[_h = "baz"] && (_g[_h] = result.foo.baz); +(_j = b.foo)[_k = "baz"] || (_j[_k] = result.foo.baz); +(_b = (_l = c.foo)[_m = "baz"]) !== null && _b !== void 0 ? _b : (_l[_m] = result.foo.baz); +(_o = a.foo.bar()).baz && (_o.baz = result.foo.bar().baz); +(_p = b.foo.bar()).baz || (_p.baz = result.foo.bar().baz); +(_c = (_q = c.foo.bar()).baz) !== null && _c !== void 0 ? _c : (_q.baz = result.foo.bar().baz); diff --git a/tests/baselines/reference/logicalAssignment2(target=es2020).js b/tests/baselines/reference/logicalAssignment2(target=es2020).js index fd285b64ad7c6..09ec9eb23f090 100644 --- a/tests/baselines/reference/logicalAssignment2(target=es2020).js +++ b/tests/baselines/reference/logicalAssignment2(target=es2020).js @@ -30,13 +30,13 @@ c.foo.bar().baz ??= result.foo.bar().baz //// [logicalAssignment2.js] "use strict"; -var _a, _b, _c, _d, _e, _f, _g, _h, _j; +var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m; (_a = a).baz && (_a.baz = result.baz); (_b = b).baz || (_b.baz = result.baz); (_c = c).baz ?? (_c.baz = result.baz); -(_d = a.foo)["baz"] && (_d["baz"] = result.foo.baz); -(_e = b.foo)["baz"] || (_e["baz"] = result.foo.baz); -(_f = c.foo)["baz"] ?? (_f["baz"] = result.foo.baz); -(_g = a.foo.bar()).baz && (_g.baz = result.foo.bar().baz); -(_h = b.foo.bar()).baz || (_h.baz = result.foo.bar().baz); -(_j = c.foo.bar()).baz ?? (_j.baz = result.foo.bar().baz); +(_d = a.foo)[_e = "baz"] && (_d[_e] = result.foo.baz); +(_f = b.foo)[_g = "baz"] || (_f[_g] = result.foo.baz); +(_h = c.foo)[_j = "baz"] ?? (_h[_j] = result.foo.baz); +(_k = a.foo.bar()).baz && (_k.baz = result.foo.bar().baz); +(_l = b.foo.bar()).baz || (_l.baz = result.foo.bar().baz); +(_m = c.foo.bar()).baz ?? (_m.baz = result.foo.bar().baz); diff --git a/tests/cases/conformance/esnext/logicalAssignment/logicalAssignment10.ts b/tests/cases/conformance/esnext/logicalAssignment/logicalAssignment10.ts new file mode 100644 index 0000000000000..cf827a129f9bc --- /dev/null +++ b/tests/cases/conformance/esnext/logicalAssignment/logicalAssignment10.ts @@ -0,0 +1,9 @@ +// @target: esnext, es2020, es2015 + +var count = 0; +var obj = {}; +function incr() { + return ++count; +} + +obj[incr()] ??= incr(); From 45ed2b92d9407936fb641140fd9da3116d3717d0 Mon Sep 17 00:00:00 2001 From: kingwl Date: Sat, 20 Jun 2020 15:15:38 +0800 Subject: [PATCH 2/3] Avoid unnecessary copy --- src/compiler/transformers/esnext.ts | 36 ++++++++++--------- .../logicalAssignment10(target=es2015).js | 4 +-- .../logicalAssignment10(target=es2020).js | 4 +-- .../logicalAssignment2(target=es2015).js | 20 +++++------ .../logicalAssignment2(target=es2020).js | 20 +++++------ .../logicalAssignment3(target=es2015).js | 7 ++-- .../logicalAssignment3(target=es2020).js | 7 ++-- .../baselines/reference/logicalAssignment9.js | 5 ++- 8 files changed, 52 insertions(+), 51 deletions(-) diff --git a/src/compiler/transformers/esnext.ts b/src/compiler/transformers/esnext.ts index 8c2e6eee39795..09b68d57e25b5 100644 --- a/src/compiler/transformers/esnext.ts +++ b/src/compiler/transformers/esnext.ts @@ -25,7 +25,7 @@ namespace ts { if (isLogicalOrCoalescingAssignmentExpression(binaryExpression)) { return transformLogicalAssignment(binaryExpression); } - // falls through + // falls through default: return visitEachChild(node, visitor, context); } @@ -37,35 +37,39 @@ namespace ts { let left = skipParentheses(visitNode(binaryExpression.left, visitor, isLeftHandSideExpression)); let assignmentTarget = left; const right = skipParentheses(visitNode(binaryExpression.right, visitor, isExpression)); + if (isAccessExpression(left)) { - const tempVariable = factory.createTempVariable(hoistVariableDeclaration); + const propertyAccessTargetSimpleCopiable = isSimpleCopiableExpression(left.expression); + const propertyAccessTarget = propertyAccessTargetSimpleCopiable ? left.expression : + factory.createTempVariable(hoistVariableDeclaration); + const propertyAccessTargetAssignment = propertyAccessTargetSimpleCopiable ? left.expression : factory.createAssignment( + propertyAccessTarget, + left.expression + ); + if (isPropertyAccessExpression(left)) { assignmentTarget = factory.createPropertyAccessExpression( - tempVariable, + propertyAccessTarget, left.name ); left = factory.createPropertyAccessExpression( - factory.createAssignment( - tempVariable, - left.expression - ), + propertyAccessTargetAssignment, left.name ); } else { - const tempArgumentExpression = factory.createTempVariable(hoistVariableDeclaration); + const elementAccessArgumentSimpleCopiable = isSimpleCopiableExpression(left.argumentExpression); + const elementAccessArgument = elementAccessArgumentSimpleCopiable ? left.argumentExpression : + factory.createTempVariable(hoistVariableDeclaration); assignmentTarget = factory.createElementAccessExpression( - tempVariable, - tempArgumentExpression + propertyAccessTarget, + elementAccessArgument ); left = factory.createElementAccessExpression( - factory.createAssignment( - tempVariable, - left.expression - ), - factory.createAssignment( - tempArgumentExpression, + propertyAccessTargetAssignment, + elementAccessArgumentSimpleCopiable ? left.argumentExpression : factory.createAssignment( + elementAccessArgument, left.argumentExpression ) ); diff --git a/tests/baselines/reference/logicalAssignment10(target=es2015).js b/tests/baselines/reference/logicalAssignment10(target=es2015).js index 90ea89ff125f5..c3a32c172d8bf 100644 --- a/tests/baselines/reference/logicalAssignment10(target=es2015).js +++ b/tests/baselines/reference/logicalAssignment10(target=es2015).js @@ -10,10 +10,10 @@ obj[incr()] ??= incr(); //// [logicalAssignment10.js] var _a; -var _b, _c; +var _b; var count = 0; var obj = {}; function incr() { return ++count; } -(_a = (_b = obj)[_c = incr()]) !== null && _a !== void 0 ? _a : (_b[_c] = incr()); +(_a = obj[_b = incr()]) !== null && _a !== void 0 ? _a : (obj[_b] = incr()); diff --git a/tests/baselines/reference/logicalAssignment10(target=es2020).js b/tests/baselines/reference/logicalAssignment10(target=es2020).js index e1afe130ceb34..6b44e532182ae 100644 --- a/tests/baselines/reference/logicalAssignment10(target=es2020).js +++ b/tests/baselines/reference/logicalAssignment10(target=es2020).js @@ -9,10 +9,10 @@ obj[incr()] ??= incr(); //// [logicalAssignment10.js] -var _a, _b; +var _a; var count = 0; var obj = {}; function incr() { return ++count; } -(_a = obj)[_b = incr()] ?? (_a[_b] = incr()); +obj[_a = incr()] ?? (obj[_a] = incr()); diff --git a/tests/baselines/reference/logicalAssignment2(target=es2015).js b/tests/baselines/reference/logicalAssignment2(target=es2015).js index 6c7539647e670..4a5b10d2ff082 100644 --- a/tests/baselines/reference/logicalAssignment2(target=es2015).js +++ b/tests/baselines/reference/logicalAssignment2(target=es2015).js @@ -31,13 +31,13 @@ c.foo.bar().baz ??= result.foo.bar().baz //// [logicalAssignment2.js] "use strict"; var _a, _b, _c; -var _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q; -(_d = a).baz && (_d.baz = result.baz); -(_e = b).baz || (_e.baz = result.baz); -(_a = (_f = c).baz) !== null && _a !== void 0 ? _a : (_f.baz = result.baz); -(_g = a.foo)[_h = "baz"] && (_g[_h] = result.foo.baz); -(_j = b.foo)[_k = "baz"] || (_j[_k] = result.foo.baz); -(_b = (_l = c.foo)[_m = "baz"]) !== null && _b !== void 0 ? _b : (_l[_m] = result.foo.baz); -(_o = a.foo.bar()).baz && (_o.baz = result.foo.bar().baz); -(_p = b.foo.bar()).baz || (_p.baz = result.foo.bar().baz); -(_c = (_q = c.foo.bar()).baz) !== null && _c !== void 0 ? _c : (_q.baz = result.foo.bar().baz); +var _d, _e, _f, _g, _h, _j; +a.baz && (a.baz = result.baz); +b.baz || (b.baz = result.baz); +(_a = c.baz) !== null && _a !== void 0 ? _a : (c.baz = result.baz); +(_d = a.foo)["baz"] && (_d["baz"] = result.foo.baz); +(_e = b.foo)["baz"] || (_e["baz"] = result.foo.baz); +(_b = (_f = c.foo)["baz"]) !== null && _b !== void 0 ? _b : (_f["baz"] = result.foo.baz); +(_g = a.foo.bar()).baz && (_g.baz = result.foo.bar().baz); +(_h = b.foo.bar()).baz || (_h.baz = result.foo.bar().baz); +(_c = (_j = c.foo.bar()).baz) !== null && _c !== void 0 ? _c : (_j.baz = result.foo.bar().baz); diff --git a/tests/baselines/reference/logicalAssignment2(target=es2020).js b/tests/baselines/reference/logicalAssignment2(target=es2020).js index 09ec9eb23f090..08181ce3d5e12 100644 --- a/tests/baselines/reference/logicalAssignment2(target=es2020).js +++ b/tests/baselines/reference/logicalAssignment2(target=es2020).js @@ -30,13 +30,13 @@ c.foo.bar().baz ??= result.foo.bar().baz //// [logicalAssignment2.js] "use strict"; -var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m; -(_a = a).baz && (_a.baz = result.baz); -(_b = b).baz || (_b.baz = result.baz); -(_c = c).baz ?? (_c.baz = result.baz); -(_d = a.foo)[_e = "baz"] && (_d[_e] = result.foo.baz); -(_f = b.foo)[_g = "baz"] || (_f[_g] = result.foo.baz); -(_h = c.foo)[_j = "baz"] ?? (_h[_j] = result.foo.baz); -(_k = a.foo.bar()).baz && (_k.baz = result.foo.bar().baz); -(_l = b.foo.bar()).baz || (_l.baz = result.foo.bar().baz); -(_m = c.foo.bar()).baz ?? (_m.baz = result.foo.bar().baz); +var _a, _b, _c, _d, _e, _f; +a.baz && (a.baz = result.baz); +b.baz || (b.baz = result.baz); +c.baz ?? (c.baz = result.baz); +(_a = a.foo)["baz"] && (_a["baz"] = result.foo.baz); +(_b = b.foo)["baz"] || (_b["baz"] = result.foo.baz); +(_c = c.foo)["baz"] ?? (_c["baz"] = result.foo.baz); +(_d = a.foo.bar()).baz && (_d.baz = result.foo.bar().baz); +(_e = b.foo.bar()).baz || (_e.baz = result.foo.bar().baz); +(_f = c.foo.bar()).baz ?? (_f.baz = result.foo.bar().baz); diff --git a/tests/baselines/reference/logicalAssignment3(target=es2015).js b/tests/baselines/reference/logicalAssignment3(target=es2015).js index 47f0a210412e1..8a171ab043c8f 100644 --- a/tests/baselines/reference/logicalAssignment3(target=es2015).js +++ b/tests/baselines/reference/logicalAssignment3(target=es2015).js @@ -17,7 +17,6 @@ declare const c: A; //// [logicalAssignment3.js] "use strict"; var _a; -var _b, _c, _d; -(_b = a).baz && (_b.baz = result.baz); -(_c = b).baz || (_c.baz = result.baz); -(_a = (_d = c).baz) !== null && _a !== void 0 ? _a : (_d.baz = result.baz); +a.baz && (a.baz = result.baz); +b.baz || (b.baz = result.baz); +(_a = c.baz) !== null && _a !== void 0 ? _a : (c.baz = result.baz); diff --git a/tests/baselines/reference/logicalAssignment3(target=es2020).js b/tests/baselines/reference/logicalAssignment3(target=es2020).js index 57060aea11685..98660201f169e 100644 --- a/tests/baselines/reference/logicalAssignment3(target=es2020).js +++ b/tests/baselines/reference/logicalAssignment3(target=es2020).js @@ -16,7 +16,6 @@ declare const c: A; //// [logicalAssignment3.js] "use strict"; -var _a, _b, _c; -(_a = a).baz && (_a.baz = result.baz); -(_b = b).baz || (_b.baz = result.baz); -(_c = c).baz ?? (_c.baz = result.baz); +a.baz && (a.baz = result.baz); +b.baz || (b.baz = result.baz); +c.baz ?? (c.baz = result.baz); diff --git a/tests/baselines/reference/logicalAssignment9.js b/tests/baselines/reference/logicalAssignment9.js index 88f006d3722b7..97a10da3e65fb 100644 --- a/tests/baselines/reference/logicalAssignment9.js +++ b/tests/baselines/reference/logicalAssignment9.js @@ -8,6 +8,5 @@ x.a &&= false; //// [logicalAssignment9.js] "use strict"; var _a; -var _b, _c; -(_a = (_b = x).a) !== null && _a !== void 0 ? _a : (_b.a = true); -(_c = x).a && (_c.a = false); +(_a = x.a) !== null && _a !== void 0 ? _a : (x.a = true); +x.a && (x.a = false); From 7e41c2f219d4b093dc0e74185900f9851b074cb8 Mon Sep 17 00:00:00 2001 From: kingwl Date: Sat, 20 Jun 2020 15:36:18 +0800 Subject: [PATCH 3/3] Add more tests --- .../logicalAssignment10(target=es2015).js | 15 ++++++++++++--- ...logicalAssignment10(target=es2015).symbols | 13 +++++++++++++ .../logicalAssignment10(target=es2015).types | 19 +++++++++++++++++++ .../logicalAssignment10(target=es2020).js | 11 ++++++++++- ...logicalAssignment10(target=es2020).symbols | 13 +++++++++++++ .../logicalAssignment10(target=es2020).types | 19 +++++++++++++++++++ .../logicalAssignment10(target=esnext).js | 9 +++++++++ ...logicalAssignment10(target=esnext).symbols | 13 +++++++++++++ .../logicalAssignment10(target=esnext).types | 19 +++++++++++++++++++ .../logicalAssignment/logicalAssignment10.ts | 5 +++++ 10 files changed, 132 insertions(+), 4 deletions(-) diff --git a/tests/baselines/reference/logicalAssignment10(target=es2015).js b/tests/baselines/reference/logicalAssignment10(target=es2015).js index c3a32c172d8bf..b002f9baae97b 100644 --- a/tests/baselines/reference/logicalAssignment10(target=es2015).js +++ b/tests/baselines/reference/logicalAssignment10(target=es2015).js @@ -5,15 +5,24 @@ function incr() { return ++count; } +const oobj = { + obj +} + obj[incr()] ??= incr(); +oobj["obj"][incr()] ??= incr(); //// [logicalAssignment10.js] -var _a; -var _b; +var _a, _b; +var _c, _d, _e; var count = 0; var obj = {}; function incr() { return ++count; } -(_a = obj[_b = incr()]) !== null && _a !== void 0 ? _a : (obj[_b] = incr()); +const oobj = { + obj +}; +(_a = obj[_c = incr()]) !== null && _a !== void 0 ? _a : (obj[_c] = incr()); +(_b = (_d = oobj["obj"])[_e = incr()]) !== null && _b !== void 0 ? _b : (_d[_e] = incr()); diff --git a/tests/baselines/reference/logicalAssignment10(target=es2015).symbols b/tests/baselines/reference/logicalAssignment10(target=es2015).symbols index 7cab406774317..d9a4e30998b71 100644 --- a/tests/baselines/reference/logicalAssignment10(target=es2015).symbols +++ b/tests/baselines/reference/logicalAssignment10(target=es2015).symbols @@ -12,8 +12,21 @@ function incr() { >count : Symbol(count, Decl(logicalAssignment10.ts, 0, 3)) } +const oobj = { +>oobj : Symbol(oobj, Decl(logicalAssignment10.ts, 6, 5)) + + obj +>obj : Symbol(obj, Decl(logicalAssignment10.ts, 6, 14)) +} + obj[incr()] ??= incr(); >obj : Symbol(obj, Decl(logicalAssignment10.ts, 1, 3)) >incr : Symbol(incr, Decl(logicalAssignment10.ts, 1, 13)) >incr : Symbol(incr, Decl(logicalAssignment10.ts, 1, 13)) +oobj["obj"][incr()] ??= incr(); +>oobj : Symbol(oobj, Decl(logicalAssignment10.ts, 6, 5)) +>"obj" : Symbol(obj, Decl(logicalAssignment10.ts, 6, 14)) +>incr : Symbol(incr, Decl(logicalAssignment10.ts, 1, 13)) +>incr : Symbol(incr, Decl(logicalAssignment10.ts, 1, 13)) + diff --git a/tests/baselines/reference/logicalAssignment10(target=es2015).types b/tests/baselines/reference/logicalAssignment10(target=es2015).types index b5b6d81ef01ff..d62c3c671087f 100644 --- a/tests/baselines/reference/logicalAssignment10(target=es2015).types +++ b/tests/baselines/reference/logicalAssignment10(target=es2015).types @@ -15,6 +15,14 @@ function incr() { >count : number } +const oobj = { +>oobj : { obj: {}; } +>{ obj} : { obj: {}; } + + obj +>obj : {} +} + obj[incr()] ??= incr(); >obj[incr()] ??= incr() : any >obj[incr()] : error @@ -24,3 +32,14 @@ obj[incr()] ??= incr(); >incr() : number >incr : () => number +oobj["obj"][incr()] ??= incr(); +>oobj["obj"][incr()] ??= incr() : any +>oobj["obj"][incr()] : error +>oobj["obj"] : {} +>oobj : { obj: {}; } +>"obj" : "obj" +>incr() : number +>incr : () => number +>incr() : number +>incr : () => number + diff --git a/tests/baselines/reference/logicalAssignment10(target=es2020).js b/tests/baselines/reference/logicalAssignment10(target=es2020).js index 6b44e532182ae..773d395100262 100644 --- a/tests/baselines/reference/logicalAssignment10(target=es2020).js +++ b/tests/baselines/reference/logicalAssignment10(target=es2020).js @@ -5,14 +5,23 @@ function incr() { return ++count; } +const oobj = { + obj +} + obj[incr()] ??= incr(); +oobj["obj"][incr()] ??= incr(); //// [logicalAssignment10.js] -var _a; +var _a, _b, _c; var count = 0; var obj = {}; function incr() { return ++count; } +const oobj = { + obj +}; obj[_a = incr()] ?? (obj[_a] = incr()); +(_b = oobj["obj"])[_c = incr()] ?? (_b[_c] = incr()); diff --git a/tests/baselines/reference/logicalAssignment10(target=es2020).symbols b/tests/baselines/reference/logicalAssignment10(target=es2020).symbols index 7cab406774317..d9a4e30998b71 100644 --- a/tests/baselines/reference/logicalAssignment10(target=es2020).symbols +++ b/tests/baselines/reference/logicalAssignment10(target=es2020).symbols @@ -12,8 +12,21 @@ function incr() { >count : Symbol(count, Decl(logicalAssignment10.ts, 0, 3)) } +const oobj = { +>oobj : Symbol(oobj, Decl(logicalAssignment10.ts, 6, 5)) + + obj +>obj : Symbol(obj, Decl(logicalAssignment10.ts, 6, 14)) +} + obj[incr()] ??= incr(); >obj : Symbol(obj, Decl(logicalAssignment10.ts, 1, 3)) >incr : Symbol(incr, Decl(logicalAssignment10.ts, 1, 13)) >incr : Symbol(incr, Decl(logicalAssignment10.ts, 1, 13)) +oobj["obj"][incr()] ??= incr(); +>oobj : Symbol(oobj, Decl(logicalAssignment10.ts, 6, 5)) +>"obj" : Symbol(obj, Decl(logicalAssignment10.ts, 6, 14)) +>incr : Symbol(incr, Decl(logicalAssignment10.ts, 1, 13)) +>incr : Symbol(incr, Decl(logicalAssignment10.ts, 1, 13)) + diff --git a/tests/baselines/reference/logicalAssignment10(target=es2020).types b/tests/baselines/reference/logicalAssignment10(target=es2020).types index b5b6d81ef01ff..d62c3c671087f 100644 --- a/tests/baselines/reference/logicalAssignment10(target=es2020).types +++ b/tests/baselines/reference/logicalAssignment10(target=es2020).types @@ -15,6 +15,14 @@ function incr() { >count : number } +const oobj = { +>oobj : { obj: {}; } +>{ obj} : { obj: {}; } + + obj +>obj : {} +} + obj[incr()] ??= incr(); >obj[incr()] ??= incr() : any >obj[incr()] : error @@ -24,3 +32,14 @@ obj[incr()] ??= incr(); >incr() : number >incr : () => number +oobj["obj"][incr()] ??= incr(); +>oobj["obj"][incr()] ??= incr() : any +>oobj["obj"][incr()] : error +>oobj["obj"] : {} +>oobj : { obj: {}; } +>"obj" : "obj" +>incr() : number +>incr : () => number +>incr() : number +>incr : () => number + diff --git a/tests/baselines/reference/logicalAssignment10(target=esnext).js b/tests/baselines/reference/logicalAssignment10(target=esnext).js index 6f583319f76e3..40b2ed7c09556 100644 --- a/tests/baselines/reference/logicalAssignment10(target=esnext).js +++ b/tests/baselines/reference/logicalAssignment10(target=esnext).js @@ -5,7 +5,12 @@ function incr() { return ++count; } +const oobj = { + obj +} + obj[incr()] ??= incr(); +oobj["obj"][incr()] ??= incr(); //// [logicalAssignment10.js] @@ -14,4 +19,8 @@ var obj = {}; function incr() { return ++count; } +const oobj = { + obj +}; obj[incr()] ??= incr(); +oobj["obj"][incr()] ??= incr(); diff --git a/tests/baselines/reference/logicalAssignment10(target=esnext).symbols b/tests/baselines/reference/logicalAssignment10(target=esnext).symbols index 7cab406774317..d9a4e30998b71 100644 --- a/tests/baselines/reference/logicalAssignment10(target=esnext).symbols +++ b/tests/baselines/reference/logicalAssignment10(target=esnext).symbols @@ -12,8 +12,21 @@ function incr() { >count : Symbol(count, Decl(logicalAssignment10.ts, 0, 3)) } +const oobj = { +>oobj : Symbol(oobj, Decl(logicalAssignment10.ts, 6, 5)) + + obj +>obj : Symbol(obj, Decl(logicalAssignment10.ts, 6, 14)) +} + obj[incr()] ??= incr(); >obj : Symbol(obj, Decl(logicalAssignment10.ts, 1, 3)) >incr : Symbol(incr, Decl(logicalAssignment10.ts, 1, 13)) >incr : Symbol(incr, Decl(logicalAssignment10.ts, 1, 13)) +oobj["obj"][incr()] ??= incr(); +>oobj : Symbol(oobj, Decl(logicalAssignment10.ts, 6, 5)) +>"obj" : Symbol(obj, Decl(logicalAssignment10.ts, 6, 14)) +>incr : Symbol(incr, Decl(logicalAssignment10.ts, 1, 13)) +>incr : Symbol(incr, Decl(logicalAssignment10.ts, 1, 13)) + diff --git a/tests/baselines/reference/logicalAssignment10(target=esnext).types b/tests/baselines/reference/logicalAssignment10(target=esnext).types index b5b6d81ef01ff..d62c3c671087f 100644 --- a/tests/baselines/reference/logicalAssignment10(target=esnext).types +++ b/tests/baselines/reference/logicalAssignment10(target=esnext).types @@ -15,6 +15,14 @@ function incr() { >count : number } +const oobj = { +>oobj : { obj: {}; } +>{ obj} : { obj: {}; } + + obj +>obj : {} +} + obj[incr()] ??= incr(); >obj[incr()] ??= incr() : any >obj[incr()] : error @@ -24,3 +32,14 @@ obj[incr()] ??= incr(); >incr() : number >incr : () => number +oobj["obj"][incr()] ??= incr(); +>oobj["obj"][incr()] ??= incr() : any +>oobj["obj"][incr()] : error +>oobj["obj"] : {} +>oobj : { obj: {}; } +>"obj" : "obj" +>incr() : number +>incr : () => number +>incr() : number +>incr : () => number + diff --git a/tests/cases/conformance/esnext/logicalAssignment/logicalAssignment10.ts b/tests/cases/conformance/esnext/logicalAssignment/logicalAssignment10.ts index cf827a129f9bc..11c98cea77860 100644 --- a/tests/cases/conformance/esnext/logicalAssignment/logicalAssignment10.ts +++ b/tests/cases/conformance/esnext/logicalAssignment/logicalAssignment10.ts @@ -6,4 +6,9 @@ function incr() { return ++count; } +const oobj = { + obj +} + obj[incr()] ??= incr(); +oobj["obj"][incr()] ??= incr();