Skip to content

Commit 47e3fed

Browse files
authored
Fix object spread runtime semantics (microsoft#32514)
1 parent 70b7bd5 commit 47e3fed

25 files changed

+135
-81
lines changed

src/compiler/transformers/es2018.ts

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -229,14 +229,39 @@ namespace ts {
229229
if (node.transformFlags & TransformFlags.ContainsObjectRestOrSpread) {
230230
// spread elements emit like so:
231231
// non-spread elements are chunked together into object literals, and then all are passed to __assign:
232-
// { a, ...o, b } => __assign({a}, o, {b});
232+
// { a, ...o, b } => __assign(__assign({a}, o), {b});
233233
// If the first element is a spread element, then the first argument to __assign is {}:
234-
// { ...o, a, b, ...o2 } => __assign({}, o, {a, b}, o2)
234+
// { ...o, a, b, ...o2 } => __assign(__assign(__assign({}, o), {a, b}), o2)
235+
//
236+
// We cannot call __assign with more than two elements, since any element could cause side effects. For
237+
// example:
238+
// var k = { a: 1, b: 2 };
239+
// var o = { a: 3, ...k, b: k.a++ };
240+
// // expected: { a: 1, b: 1 }
241+
// If we translate the above to `__assign({ a: 3 }, k, { b: k.a++ })`, the `k.a++` will evaluate before
242+
// `k` is spread and we end up with `{ a: 2, b: 1 }`.
243+
//
244+
// This also occurs for spread elements, not just property assignments:
245+
// var k = { a: 1, get b() { l = { z: 9 }; return 2; } };
246+
// var l = { c: 3 };
247+
// var o = { ...k, ...l };
248+
// // expected: { a: 1, b: 2, z: 9 }
249+
// If we translate the above to `__assign({}, k, l)`, the `l` will evaluate before `k` is spread and we
250+
// end up with `{ a: 1, b: 2, c: 3 }`
235251
const objects = chunkObjectLiteralElements(node.properties);
236252
if (objects.length && objects[0].kind !== SyntaxKind.ObjectLiteralExpression) {
237253
objects.unshift(createObjectLiteral());
238254
}
239-
return createAssignHelper(context, objects);
255+
let expression: Expression = objects[0];
256+
if (objects.length > 1) {
257+
for (let i = 1; i < objects.length; i++) {
258+
expression = createAssignHelper(context, [expression, objects[i]]);
259+
}
260+
return expression;
261+
}
262+
else {
263+
return createAssignHelper(context, objects);
264+
}
240265
}
241266
return visitEachChild(node, visitor, context);
242267
}

src/testRunner/tsconfig.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@
7474
"unittests/evaluation/asyncArrow.ts",
7575
"unittests/evaluation/asyncGenerator.ts",
7676
"unittests/evaluation/forAwaitOf.ts",
77+
"unittests/evaluation/objectRest.ts",
7778
"unittests/services/cancellableLanguageServiceOperations.ts",
7879
"unittests/services/colorization.ts",
7980
"unittests/services/convertToAsyncFunction.ts",
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
describe("unittests:: evaluation:: objectRest", () => {
2+
// https://github.com/microsoft/TypeScript/issues/31469
3+
it("side effects in property assignment", async () => {
4+
const result = evaluator.evaluateTypeScript(`
5+
const k = { a: 1, b: 2 };
6+
const o = { a: 3, ...k, b: k.a++ };
7+
export const output = o;
8+
`);
9+
assert.deepEqual(result.output, { a: 1, b: 1 });
10+
});
11+
it("side effects in during spread", async () => {
12+
const result = evaluator.evaluateTypeScript(`
13+
const k = { a: 1, get b() { l = { c: 9 }; return 2; } };
14+
let l = { c: 3 };
15+
const o = { ...k, ...l };
16+
export const output = o;
17+
`);
18+
assert.deepEqual(result.output, { a: 1, b: 2, c: 9 });
19+
});
20+
it("trailing literal-valued object-literal", async () => {
21+
const result = evaluator.evaluateTypeScript(`
22+
const k = { a: 1 }
23+
const o = { ...k, ...{ b: 2 } };
24+
export const output = o;
25+
`);
26+
assert.deepEqual(result.output, { a: 1, b: 2 });
27+
});
28+
});

tests/baselines/reference/declarationsWithRecursiveInternalTypesProduceUniqueTypeParams.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ exports.testRecFun = function (parent) {
7373
return {
7474
result: parent,
7575
deeper: function (child) {
76-
return exports.testRecFun(__assign({}, parent, child));
76+
return exports.testRecFun(__assign(__assign({}, parent), child));
7777
}
7878
};
7979
};

tests/baselines/reference/excessPropertyCheckWithSpread.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,4 @@ var __assign = (this && this.__assign) || function () {
3030
return __assign.apply(this, arguments);
3131
};
3232
f(__assign({ a: 1 }, i));
33-
f(__assign({ a: 1 }, l, r));
33+
f(__assign(__assign({ a: 1 }, l), r));

tests/baselines/reference/genericIsNeverEmptyObject.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ var __rest = (this && this.__rest) || function (s, e) {
3737
};
3838
function test(obj) {
3939
var a = obj.a, rest = __rest(obj, ["a"]);
40-
return __assign({}, rest, { b: a });
40+
return __assign(__assign({}, rest), { b: a });
4141
}
4242
var o1 = { a: 'hello', x: 42 };
4343
var o2 = test(o1);

tests/baselines/reference/objectLiteralFreshnessWithSpread.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,4 @@ var __assign = (this && this.__assign) || function () {
1616
return __assign.apply(this, arguments);
1717
};
1818
var x = { b: 1, extra: 2 };
19-
var xx = __assign({ a: 1 }, x, { z: 3 }); // error for 'z', no error for 'extra'
19+
var xx = __assign(__assign({ a: 1 }, x), { z: 3 }); // error for 'z', no error for 'extra'

tests/baselines/reference/objectLiteralNormalization.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ a2 = { a: "def" };
8080
a2 = {};
8181
a2 = { a: "def", b: 20 }; // Error
8282
a2 = { a: 1 }; // Error
83-
var b2 = __assign({}, b1, { z: 55 });
83+
var b2 = __assign(__assign({}, b1), { z: 55 });
8484
var b3 = __assign({}, b2);
8585
var c1 = !true ? {} : opts;
8686
var c2 = !true ? opts : {};

tests/baselines/reference/objectRestForOf.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ for (let _b of array) {
3737
({ x: xx } = _b, rrestOff = __rest(_b, ["x"]));
3838
[xx, rrestOff];
3939
}
40-
for (const norest of array.map(a => (Object.assign({}, a, { x: 'a string' })))) {
40+
for (const norest of array.map(a => (Object.assign(Object.assign({}, a), { x: 'a string' })))) {
4141
[norest.x, norest.y];
4242
// x is now a string. who knows why.
4343
}

tests/baselines/reference/objectSpread.js

Lines changed: 38 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -171,45 +171,45 @@ var __assign = (this && this.__assign) || function () {
171171
var o = { a: 1, b: 'no' };
172172
var o2 = { b: 'yes', c: true };
173173
var swap = { a: 'yes', b: -1 };
174-
var addAfter = __assign({}, o, { c: false });
174+
var addAfter = __assign(__assign({}, o), { c: false });
175175
var addBefore = __assign({ c: false }, o);
176176
// Note: ignore still changes the order that properties are printed
177177
var ignore = __assign({ b: 'ignored' }, o);
178-
var override = __assign({}, o, { b: 'override' });
179-
var nested = __assign({}, __assign({ a: 3 }, { b: false, c: 'overriden' }), { c: 'whatever' });
180-
var combined = __assign({}, o, o2);
181-
var combinedBefore = __assign({ b: 'ok' }, o, o2);
182-
var combinedMid = __assign({}, o, { b: 'ok' }, o2);
183-
var combinedAfter = __assign({}, o, o2, { b: 'ok' });
184-
var combinedNested = __assign({}, __assign({ a: 4 }, { b: false, c: 'overriden' }), { d: 'actually new' }, { a: 5, d: 'maybe new' });
185-
var combinedNestedChangeType = __assign({}, __assign({ a: 1 }, { b: false, c: 'overriden' }), { c: -1 });
178+
var override = __assign(__assign({}, o), { b: 'override' });
179+
var nested = __assign(__assign({}, __assign({ a: 3 }, { b: false, c: 'overriden' })), { c: 'whatever' });
180+
var combined = __assign(__assign({}, o), o2);
181+
var combinedBefore = __assign(__assign({ b: 'ok' }, o), o2);
182+
var combinedMid = __assign(__assign(__assign({}, o), { b: 'ok' }), o2);
183+
var combinedAfter = __assign(__assign(__assign({}, o), o2), { b: 'ok' });
184+
var combinedNested = __assign(__assign(__assign({}, __assign({ a: 4 }, { b: false, c: 'overriden' })), { d: 'actually new' }), { a: 5, d: 'maybe new' });
185+
var combinedNestedChangeType = __assign(__assign({}, __assign({ a: 1 }, { b: false, c: 'overriden' })), { c: -1 });
186186
var propertyNested = { a: __assign({}, o) };
187187
// accessors don't copy the descriptor
188188
// (which means that readonly getters become read/write properties)
189189
var op = { get a() { return 6; } };
190-
var getter = __assign({}, op, { c: 7 });
190+
var getter = __assign(__assign({}, op), { c: 7 });
191191
getter.a = 12;
192192
// functions result in { }
193193
var spreadFunc = __assign({}, (function () { }));
194194
function from16326(header, authToken) {
195-
return __assign({}, this.header, header, authToken && { authToken: authToken });
195+
return __assign(__assign(__assign({}, this.header), header), authToken && { authToken: authToken });
196196
}
197197
// boolean && T results in Partial<T>
198198
function conditionalSpreadBoolean(b) {
199199
var o = { x: 12, y: 13 };
200-
o = __assign({}, o, b && { x: 14 });
200+
o = __assign(__assign({}, o), b && { x: 14 });
201201
var o2 = __assign({}, b && { x: 21 });
202202
return o;
203203
}
204204
function conditionalSpreadNumber(nt) {
205205
var o = { x: 15, y: 16 };
206-
o = __assign({}, o, nt && { x: nt });
206+
o = __assign(__assign({}, o), nt && { x: nt });
207207
var o2 = __assign({}, nt && { x: nt });
208208
return o;
209209
}
210210
function conditionalSpreadString(st) {
211211
var o = { x: 'hi', y: 17 };
212-
o = __assign({}, o, st && { x: st });
212+
o = __assign(__assign({}, o), st && { x: st });
213213
var o2 = __assign({}, st && { x: st });
214214
return o;
215215
}
@@ -227,52 +227,52 @@ var C = /** @class */ (function () {
227227
var c = new C();
228228
var spreadC = __assign({}, c);
229229
// own methods are enumerable
230-
var cplus = __assign({}, c, { plus: function () { return this.p + 1; } });
230+
var cplus = __assign(__assign({}, c), { plus: function () { return this.p + 1; } });
231231
cplus.plus();
232232
// new field's type conflicting with existing field is OK
233-
var changeTypeAfter = __assign({}, o, { a: 'wrong type?' });
233+
var changeTypeAfter = __assign(__assign({}, o), { a: 'wrong type?' });
234234
var changeTypeBefore = __assign({ a: 'wrong type?' }, o);
235-
var changeTypeBoth = __assign({}, o, swap);
235+
var changeTypeBoth = __assign(__assign({}, o), swap);
236236
// optional
237237
function container(definiteBoolean, definiteString, optionalString, optionalNumber) {
238238
var _a, _b, _c;
239-
var optionalUnionStops = __assign({}, definiteBoolean, definiteString, optionalNumber);
240-
var optionalUnionDuplicates = __assign({}, definiteBoolean, definiteString, optionalString, optionalNumber);
241-
var allOptional = __assign({}, optionalString, optionalNumber);
239+
var optionalUnionStops = __assign(__assign(__assign({}, definiteBoolean), definiteString), optionalNumber);
240+
var optionalUnionDuplicates = __assign(__assign(__assign(__assign({}, definiteBoolean), definiteString), optionalString), optionalNumber);
241+
var allOptional = __assign(__assign({}, optionalString), optionalNumber);
242242
// computed property
243-
var computedFirst = __assign((_a = {}, _a['before everything'] = 12, _a), o, { b: 'yes' });
244-
var computedMiddle = __assign({}, o, (_b = {}, _b['in the middle'] = 13, _b.b = 'maybe?', _b), o2);
245-
var computedAfter = __assign({}, o, (_c = { b: 'yeah' }, _c['at the end'] = 14, _c));
243+
var computedFirst = __assign(__assign((_a = {}, _a['before everything'] = 12, _a), o), { b: 'yes' });
244+
var computedMiddle = __assign(__assign(__assign({}, o), (_b = {}, _b['in the middle'] = 13, _b.b = 'maybe?', _b)), o2);
245+
var computedAfter = __assign(__assign({}, o), (_c = { b: 'yeah' }, _c['at the end'] = 14, _c));
246246
}
247247
// shortcut syntax
248248
var a = 12;
249-
var shortCutted = __assign({}, o, { a: a });
249+
var shortCutted = __assign(__assign({}, o), { a: a });
250250
// non primitive
251251
var spreadNonPrimitive = __assign({}, {});
252252
// generic spreads
253253
function f(t, u) {
254-
return __assign({}, t, u, { id: 'id' });
254+
return __assign(__assign(__assign({}, t), u), { id: 'id' });
255255
}
256256
var exclusive = f({ a: 1, b: 'yes' }, { c: 'no', d: false });
257257
var overlap = f({ a: 1 }, { a: 2, b: 'extra' });
258258
var overlapConflict = f({ a: 1 }, { a: 'mismatch' });
259259
var overwriteId = f({ a: 1, id: true }, { c: 1, d: 'no' });
260260
function genericSpread(t, u, v, w, obj) {
261261
var x01 = __assign({}, t);
262-
var x02 = __assign({}, t, t);
263-
var x03 = __assign({}, t, u);
264-
var x04 = __assign({}, u, t);
262+
var x02 = __assign(__assign({}, t), t);
263+
var x03 = __assign(__assign({}, t), u);
264+
var x04 = __assign(__assign({}, u), t);
265265
var x05 = __assign({ a: 5, b: 'hi' }, t);
266-
var x06 = __assign({}, t, { a: 5, b: 'hi' });
267-
var x07 = __assign({ a: 5, b: 'hi' }, t, { c: true }, obj);
268-
var x09 = __assign({ a: 5 }, t, { b: 'hi', c: true }, obj);
269-
var x10 = __assign({ a: 5 }, t, { b: 'hi' }, u, obj);
266+
var x06 = __assign(__assign({}, t), { a: 5, b: 'hi' });
267+
var x07 = __assign(__assign(__assign({ a: 5, b: 'hi' }, t), { c: true }), obj);
268+
var x09 = __assign(__assign(__assign({ a: 5 }, t), { b: 'hi', c: true }), obj);
269+
var x10 = __assign(__assign(__assign(__assign({ a: 5 }, t), { b: 'hi' }), u), obj);
270270
var x11 = __assign({}, v);
271-
var x12 = __assign({}, v, obj);
271+
var x12 = __assign(__assign({}, v), obj);
272272
var x13 = __assign({}, w);
273-
var x14 = __assign({}, w, obj);
274-
var x15 = __assign({}, t, v);
275-
var x16 = __assign({}, t, w);
276-
var x17 = __assign({}, t, w, obj);
277-
var x18 = __assign({}, t, v, w);
273+
var x14 = __assign(__assign({}, w), obj);
274+
var x15 = __assign(__assign({}, t), v);
275+
var x16 = __assign(__assign({}, t), w);
276+
var x17 = __assign(__assign(__assign({}, t), w), obj);
277+
var x18 = __assign(__assign(__assign({}, t), v), w);
278278
}

tests/baselines/reference/objectSpreadComputedProperty.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,5 +30,5 @@ function f() {
3030
var a = null;
3131
var o1 = __assign({}, (_a = {}, _a[n] = n, _a));
3232
var o2 = __assign({}, (_b = {}, _b[a] = n, _b));
33-
var o3 = __assign((_c = {}, _c[a] = n, _c), {}, (_d = {}, _d[n] = n, _d), {}, (_e = {}, _e[m] = m, _e));
33+
var o3 = __assign(__assign(__assign(__assign((_c = {}, _c[a] = n, _c), {}), (_d = {}, _d[n] = n, _d)), {}), (_e = {}, _e[m] = m, _e));
3434
}

tests/baselines/reference/objectSpreadIndexSignature.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,10 @@ var __assign = (this && this.__assign) || function () {
3030
};
3131
return __assign.apply(this, arguments);
3232
};
33-
var i = __assign({}, indexed1, { b: 11 });
33+
var i = __assign(__assign({}, indexed1), { b: 11 });
3434
// only indexed has indexer, so i[101]: any
3535
i[101];
36-
var ii = __assign({}, indexed1, indexed2);
36+
var ii = __assign(__assign({}, indexed1), indexed2);
3737
// both have indexer, so i[1001]: number | boolean
3838
ii[1001];
3939
indexed3 = __assign({}, b ? indexed3 : undefined);

tests/baselines/reference/objectSpreadNegative.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -85,20 +85,20 @@ var PublicX = /** @class */ (function () {
8585
}());
8686
var publicX;
8787
var privateOptionalX;
88-
var o2 = __assign({}, publicX, privateOptionalX);
88+
var o2 = __assign(__assign({}, publicX), privateOptionalX);
8989
var sn = o2.x; // error, x is private
9090
var optionalString;
9191
var optionalNumber;
92-
var allOptional = __assign({}, optionalString, optionalNumber);
92+
var allOptional = __assign(__assign({}, optionalString), optionalNumber);
9393
;
9494
;
9595
var spread = __assign({ b: true }, { s: "foo" });
9696
spread = { s: "foo" }; // error, missing 'b'
9797
var b = { b: false };
9898
spread = b; // error, missing 's'
9999
// literal repeats are not allowed, but spread repeats are fine
100-
var duplicated = __assign({ b: 'bad' }, o, { b: 'bad' }, o2, { b: 'bad' });
101-
var duplicatedSpread = __assign({}, o, o);
100+
var duplicated = __assign(__assign(__assign(__assign({ b: 'bad' }, o), { b: 'bad' }), o2), { b: 'bad' });
101+
var duplicatedSpread = __assign(__assign({}, o), o);
102102
// primitives are not allowed, except for falsy ones
103103
var spreadNum = __assign({}, 12);
104104
var spreadSum = __assign({}, 1 + 1);

tests/baselines/reference/objectSpreadNegativeParse.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,4 @@ var o7 = __assign({}, o ? : );
2121
var o8 = __assign({}, * o);
2222
var o9 = __assign({}, matchMedia()), _a = void 0;
2323
;
24-
var o10 = __assign({}, get, { x: function () { return 12; } });
24+
var o10 = __assign(__assign({}, get), { x: function () { return 12; } });

tests/baselines/reference/objectSpreadStrictNull.js

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -58,21 +58,21 @@ var __assign = (this && this.__assign) || function () {
5858
};
5959
function f(definiteBoolean, definiteString, optionalString, optionalNumber, undefinedString, undefinedNumber) {
6060
// optional
61-
var optionalUnionStops = __assign({}, definiteBoolean, definiteString, optionalNumber);
62-
var optionalUnionDuplicates = __assign({}, definiteBoolean, definiteString, optionalString, optionalNumber);
63-
var allOptional = __assign({}, optionalString, optionalNumber);
61+
var optionalUnionStops = __assign(__assign(__assign({}, definiteBoolean), definiteString), optionalNumber);
62+
var optionalUnionDuplicates = __assign(__assign(__assign(__assign({}, definiteBoolean), definiteString), optionalString), optionalNumber);
63+
var allOptional = __assign(__assign({}, optionalString), optionalNumber);
6464
// undefined
65-
var undefinedUnionStops = __assign({}, definiteBoolean, definiteString, undefinedNumber);
66-
var undefinedUnionDuplicates = __assign({}, definiteBoolean, definiteString, undefinedString, undefinedNumber);
67-
var allUndefined = __assign({}, undefinedString, undefinedNumber);
68-
var undefinedWithOptionalContinues = __assign({}, definiteBoolean, undefinedString, optionalNumber);
65+
var undefinedUnionStops = __assign(__assign(__assign({}, definiteBoolean), definiteString), undefinedNumber);
66+
var undefinedUnionDuplicates = __assign(__assign(__assign(__assign({}, definiteBoolean), definiteString), undefinedString), undefinedNumber);
67+
var allUndefined = __assign(__assign({}, undefinedString), undefinedNumber);
68+
var undefinedWithOptionalContinues = __assign(__assign(__assign({}, definiteBoolean), undefinedString), optionalNumber);
6969
}
7070
var m = { title: "The Matrix", yearReleased: 1999 };
7171
// should error here because title: undefined is not assignable to string
72-
var x = __assign({}, m, { title: undefined });
72+
var x = __assign(__assign({}, m), { title: undefined });
7373
function g(fields, partialFields, nearlyPartialFields) {
7474
// ok, undefined is stripped from optional properties when spread
75-
fields = __assign({}, fields, partialFields);
75+
fields = __assign(__assign({}, fields), partialFields);
7676
// error: not optional, undefined remains
77-
fields = __assign({}, fields, nearlyPartialFields);
77+
fields = __assign(__assign({}, fields), nearlyPartialFields);
7878
}

tests/baselines/reference/objectSpreadWithinMethodWithinObjectWithSpread.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,6 @@ var __assign = (this && this.__assign) || function () {
2424
return __assign.apply(this, arguments);
2525
};
2626
var obj = {};
27-
var a = __assign({}, obj, { prop: function () {
28-
return __assign({}, obj, { metadata: 213 });
27+
var a = __assign(__assign({}, obj), { prop: function () {
28+
return __assign(__assign({}, obj), { metadata: 213 });
2929
} });

tests/baselines/reference/spreadContextualTypedBindingPattern.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,4 @@ var __assign = (this && this.__assign) || function () {
2525
return __assign.apply(this, arguments);
2626
};
2727
// [ts] Initializer provides no value for this binding element and the binding element has no default value.
28-
var _a = __assign({}, bob, alice), naam = _a.naam, age = _a.age;
28+
var _a = __assign(__assign({}, bob), alice), naam = _a.naam, age = _a.age;

tests/baselines/reference/spreadIntersection.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,4 @@ var intersection;
2323
var o1;
2424
var o1 = __assign({}, intersection);
2525
var o2;
26-
var o2 = __assign({}, intersection, { c: false });
26+
var o2 = __assign(__assign({}, intersection), { c: false });

tests/baselines/reference/spreadNonPrimitive.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,4 @@ var __assign = (this && this.__assign) || function () {
1515
};
1616
return __assign.apply(this, arguments);
1717
};
18-
var x = __assign({ a: 1 }, o, { b: 2 });
18+
var x = __assign(__assign({ a: 1 }, o), { b: 2 });

tests/baselines/reference/spreadUnion.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,6 @@ var union;
2626
var o3;
2727
var o3 = __assign({}, union);
2828
var o4;
29-
var o4 = __assign({}, union, { a: false });
29+
var o4 = __assign(__assign({}, union), { a: false });
3030
var o5;
31-
var o5 = __assign({}, union, union);
31+
var o5 = __assign(__assign({}, union), union);

tests/baselines/reference/spreadUnion2.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,9 @@ var o1 = __assign({}, undefinedUnion);
3737
var o2;
3838
var o2 = __assign({}, nullUnion);
3939
var o3;
40-
var o3 = __assign({}, undefinedUnion, nullUnion);
41-
var o3 = __assign({}, nullUnion, undefinedUnion);
40+
var o3 = __assign(__assign({}, undefinedUnion), nullUnion);
41+
var o3 = __assign(__assign({}, nullUnion), undefinedUnion);
4242
var o4;
43-
var o4 = __assign({}, undefinedUnion, undefinedUnion);
43+
var o4 = __assign(__assign({}, undefinedUnion), undefinedUnion);
4444
var o5;
45-
var o5 = __assign({}, nullUnion, nullUnion);
45+
var o5 = __assign(__assign({}, nullUnion), nullUnion);

0 commit comments

Comments
 (0)