Skip to content

Commit e50adc0

Browse files
authored
Merge pull request #12223 from Microsoft/fix-object-spread-rest-async-emit
Fix object spread+async emit
2 parents 1164df2 + fab1416 commit e50adc0

File tree

6 files changed

+147
-7
lines changed

6 files changed

+147
-7
lines changed

src/compiler/transformers/esnext.ts

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -92,11 +92,15 @@ namespace ts {
9292
// { a, ...o, b } => __assign({a}, o, {b});
9393
// If the first element is a spread element, then the first argument to __assign is {}:
9494
// { ...o, a, b, ...o2 } => __assign({}, o, {a, b}, o2)
95-
const objects = chunkObjectLiteralElements(node.properties);
96-
if (objects.length && objects[0].kind !== SyntaxKind.ObjectLiteralExpression) {
97-
objects.unshift(createObjectLiteral());
95+
if (forEach(node.properties, p => p.kind === SyntaxKind.SpreadAssignment)) {
96+
const objects = chunkObjectLiteralElements(node.properties);
97+
if (objects.length && objects[0].kind !== SyntaxKind.ObjectLiteralExpression) {
98+
objects.unshift(createObjectLiteral());
99+
}
100+
101+
return aggregateTransformFlags(createCall(createIdentifier("__assign"), undefined, objects));
98102
}
99-
return createCall(createIdentifier("__assign"), undefined, objects);
103+
return visitEachChild(node, visitor, context);
100104
}
101105

102106
/**
@@ -235,7 +239,7 @@ namespace ts {
235239
visitEachChild(node.body, visitor, context);
236240
const func = setOriginalNode(
237241
createArrowFunction(
238-
/*modifiers*/ undefined,
242+
node.modifiers,
239243
/*typeParameters*/ undefined,
240244
visitNodes(node.parameters, visitor, isParameter),
241245
/*type*/ undefined,
@@ -256,7 +260,7 @@ namespace ts {
256260
visitEachChild(node.body, visitor, context);
257261
return setOriginalNode(
258262
createFunctionExpression(
259-
/*modifiers*/ undefined,
263+
node.modifiers,
260264
node.asteriskToken,
261265
name,
262266
/*typeParameters*/ undefined,
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
//// [objectRest2.ts]
2+
// test for #12203
3+
declare function connectionFromArray(objects: number, args: any): {};
4+
function rootConnection(name: string) {
5+
return {
6+
resolve: async (context, args) => {
7+
const { objects } = await { objects: 12 };
8+
return {
9+
...connectionFromArray(objects, args)
10+
};
11+
}
12+
};
13+
}
14+
rootConnection('test');
15+
16+
17+
//// [objectRest2.js]
18+
var __assign = (this && this.__assign) || Object.assign || function(t) {
19+
for (var s, i = 1, n = arguments.length; i < n; i++) {
20+
s = arguments[i];
21+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
22+
t[p] = s[p];
23+
}
24+
return t;
25+
};
26+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
27+
return new (P || (P = Promise))(function (resolve, reject) {
28+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
29+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
30+
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
31+
step((generator = generator.apply(thisArg, _arguments)).next());
32+
});
33+
};
34+
function rootConnection(name) {
35+
return {
36+
resolve: (context, args) => __awaiter(this, void 0, void 0, function* () {
37+
const { objects } = yield { objects: 12 };
38+
return __assign({}, connectionFromArray(objects, args));
39+
})
40+
};
41+
}
42+
rootConnection('test');
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
=== tests/cases/conformance/types/rest/objectRest2.ts ===
2+
// test for #12203
3+
declare function connectionFromArray(objects: number, args: any): {};
4+
>connectionFromArray : Symbol(connectionFromArray, Decl(objectRest2.ts, 0, 0))
5+
>objects : Symbol(objects, Decl(objectRest2.ts, 1, 37))
6+
>args : Symbol(args, Decl(objectRest2.ts, 1, 53))
7+
8+
function rootConnection(name: string) {
9+
>rootConnection : Symbol(rootConnection, Decl(objectRest2.ts, 1, 69))
10+
>name : Symbol(name, Decl(objectRest2.ts, 2, 24))
11+
12+
return {
13+
resolve: async (context, args) => {
14+
>resolve : Symbol(resolve, Decl(objectRest2.ts, 3, 10))
15+
>context : Symbol(context, Decl(objectRest2.ts, 4, 20))
16+
>args : Symbol(args, Decl(objectRest2.ts, 4, 28))
17+
18+
const { objects } = await { objects: 12 };
19+
>objects : Symbol(objects, Decl(objectRest2.ts, 5, 15))
20+
>objects : Symbol(objects, Decl(objectRest2.ts, 5, 35))
21+
22+
return {
23+
...connectionFromArray(objects, args)
24+
>connectionFromArray : Symbol(connectionFromArray, Decl(objectRest2.ts, 0, 0))
25+
>objects : Symbol(objects, Decl(objectRest2.ts, 5, 15))
26+
>args : Symbol(args, Decl(objectRest2.ts, 4, 28))
27+
28+
};
29+
}
30+
};
31+
}
32+
rootConnection('test');
33+
>rootConnection : Symbol(rootConnection, Decl(objectRest2.ts, 1, 69))
34+
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
=== tests/cases/conformance/types/rest/objectRest2.ts ===
2+
// test for #12203
3+
declare function connectionFromArray(objects: number, args: any): {};
4+
>connectionFromArray : (objects: number, args: any) => {}
5+
>objects : number
6+
>args : any
7+
8+
function rootConnection(name: string) {
9+
>rootConnection : (name: string) => { resolve: (context: any, args: any) => Promise<{}>; }
10+
>name : string
11+
12+
return {
13+
>{ resolve: async (context, args) => { const { objects } = await { objects: 12 }; return { ...connectionFromArray(objects, args) }; } } : { resolve: (context: any, args: any) => Promise<{}>; }
14+
15+
resolve: async (context, args) => {
16+
>resolve : (context: any, args: any) => Promise<{}>
17+
>async (context, args) => { const { objects } = await { objects: 12 }; return { ...connectionFromArray(objects, args) }; } : (context: any, args: any) => Promise<{}>
18+
>context : any
19+
>args : any
20+
21+
const { objects } = await { objects: 12 };
22+
>objects : number
23+
>await { objects: 12 } : { objects: number; }
24+
>{ objects: 12 } : { objects: number; }
25+
>objects : number
26+
>12 : 12
27+
28+
return {
29+
>{ ...connectionFromArray(objects, args) } : {}
30+
31+
...connectionFromArray(objects, args)
32+
>connectionFromArray(objects, args) : {}
33+
>connectionFromArray : (objects: number, args: any) => {}
34+
>objects : number
35+
>args : any
36+
37+
};
38+
}
39+
};
40+
}
41+
rootConnection('test');
42+
>rootConnection('test') : { resolve: (context: any, args: any) => Promise<{}>; }
43+
>rootConnection : (name: string) => { resolve: (context: any, args: any) => Promise<{}>; }
44+
>'test' : "test"
45+

tests/baselines/reference/objectSpread.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ var combinedMid = __assign({}, o, { b: 'ok' }, o2);
105105
var combinedAfter = __assign({}, o, o2, { b: 'ok' });
106106
var combinedNested = __assign({}, __assign({ a: 4 }, { b: false, c: 'overriden' }), { d: 'actually new' }, { a: 5, d: 'maybe new' });
107107
var combinedNestedChangeType = __assign({}, __assign({ a: 1 }, { b: false, c: 'overriden' }), { c: -1 });
108-
var propertyNested = __assign({ a: __assign({}, o) });
108+
var propertyNested = { a: __assign({}, o) };
109109
// accessors don't copy the descriptor
110110
// (which means that readonly getters become read/write properties)
111111
var op = { get a() { return 6; } };
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
// @lib: es2015
2+
// @target: es2015
3+
// test for #12203
4+
declare function connectionFromArray(objects: number, args: any): {};
5+
function rootConnection(name: string) {
6+
return {
7+
resolve: async (context, args) => {
8+
const { objects } = await { objects: 12 };
9+
return {
10+
...connectionFromArray(objects, args)
11+
};
12+
}
13+
};
14+
}
15+
rootConnection('test');

0 commit comments

Comments
 (0)