Skip to content

Commit 3a903b8

Browse files
committed
fix(41653): convert arrow function to function expression that used as destructure initializer
1 parent d5779c7 commit 3a903b8

File tree

22 files changed

+617
-1
lines changed

22 files changed

+617
-1
lines changed

src/compiler/transformers/destructuring.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ namespace ts {
199199
bindingOrAssignmentElementContainsNonLiteralComputedName(node))) {
200200
// If the right-hand value of the assignment is also an assignment target then
201201
// we need to cache the right-hand value.
202-
initializer = ensureIdentifier(flattenContext, initializer, /*reuseIdentifierExpressions*/ false, initializer);
202+
initializer = ensureIdentifier(flattenContext, visitNode(initializer, flattenContext.visitor), /*reuseIdentifierExpressions*/ false, initializer);
203203
node = context.factory.updateVariableDeclaration(node, node.name, /*exclamationToken*/ undefined, /*type*/ undefined, initializer);
204204
}
205205
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
//// [destructuringObjectBindingPatternAndAssignment6.ts]
2+
const a = "a";
3+
const b = "b";
4+
5+
const { [a]: aVal, [b]: bVal } = (() => {
6+
return { [a]: 1, [b]: 1 };
7+
})();
8+
console.log(aVal, bVal);
9+
10+
11+
//// [destructuringObjectBindingPatternAndAssignment6.js]
12+
var a = "a";
13+
var b = "b";
14+
var _a = (function () {
15+
var _a;
16+
return _a = {}, _a[a] = 1, _a[b] = 1, _a;
17+
})(), _b = a, aVal = _a[_b], _c = b, bVal = _a[_c];
18+
console.log(aVal, bVal);
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
=== tests/cases/conformance/es6/destructuring/destructuringObjectBindingPatternAndAssignment6.ts ===
2+
const a = "a";
3+
>a : Symbol(a, Decl(destructuringObjectBindingPatternAndAssignment6.ts, 0, 5))
4+
5+
const b = "b";
6+
>b : Symbol(b, Decl(destructuringObjectBindingPatternAndAssignment6.ts, 1, 5))
7+
8+
const { [a]: aVal, [b]: bVal } = (() => {
9+
>a : Symbol(a, Decl(destructuringObjectBindingPatternAndAssignment6.ts, 0, 5))
10+
>aVal : Symbol(aVal, Decl(destructuringObjectBindingPatternAndAssignment6.ts, 3, 7))
11+
>b : Symbol(b, Decl(destructuringObjectBindingPatternAndAssignment6.ts, 1, 5))
12+
>bVal : Symbol(bVal, Decl(destructuringObjectBindingPatternAndAssignment6.ts, 3, 18))
13+
14+
return { [a]: 1, [b]: 1 };
15+
>[a] : Symbol([a], Decl(destructuringObjectBindingPatternAndAssignment6.ts, 4, 9))
16+
>a : Symbol(a, Decl(destructuringObjectBindingPatternAndAssignment6.ts, 0, 5))
17+
>[b] : Symbol([b], Decl(destructuringObjectBindingPatternAndAssignment6.ts, 4, 17))
18+
>b : Symbol(b, Decl(destructuringObjectBindingPatternAndAssignment6.ts, 1, 5))
19+
20+
})();
21+
console.log(aVal, bVal);
22+
>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --))
23+
>console : Symbol(console, Decl(lib.dom.d.ts, --, --))
24+
>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --))
25+
>aVal : Symbol(aVal, Decl(destructuringObjectBindingPatternAndAssignment6.ts, 3, 7))
26+
>bVal : Symbol(bVal, Decl(destructuringObjectBindingPatternAndAssignment6.ts, 3, 18))
27+
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
=== tests/cases/conformance/es6/destructuring/destructuringObjectBindingPatternAndAssignment6.ts ===
2+
const a = "a";
3+
>a : "a"
4+
>"a" : "a"
5+
6+
const b = "b";
7+
>b : "b"
8+
>"b" : "b"
9+
10+
const { [a]: aVal, [b]: bVal } = (() => {
11+
>a : "a"
12+
>aVal : number
13+
>b : "b"
14+
>bVal : number
15+
>(() => { return { [a]: 1, [b]: 1 };})() : { a: number; b: number; }
16+
>(() => { return { [a]: 1, [b]: 1 };}) : () => { a: number; b: number; }
17+
>() => { return { [a]: 1, [b]: 1 };} : () => { a: number; b: number; }
18+
19+
return { [a]: 1, [b]: 1 };
20+
>{ [a]: 1, [b]: 1 } : { a: number; b: number; }
21+
>[a] : number
22+
>a : "a"
23+
>1 : 1
24+
>[b] : number
25+
>b : "b"
26+
>1 : 1
27+
28+
})();
29+
console.log(aVal, bVal);
30+
>console.log(aVal, bVal) : void
31+
>console.log : (...data: any[]) => void
32+
>console : Console
33+
>log : (...data: any[]) => void
34+
>aVal : number
35+
>bVal : number
36+
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
//// [destructuringObjectBindingPatternAndAssignment6.ts]
2+
const a = "a";
3+
const b = "b";
4+
5+
const { [a]: aVal, [b]: bVal } = (() => {
6+
return { [a]: 1, [b]: 1 };
7+
})();
8+
console.log(aVal, bVal);
9+
10+
11+
//// [destructuringObjectBindingPatternAndAssignment6.js]
12+
const a = "a";
13+
const b = "b";
14+
const { [a]: aVal, [b]: bVal } = (() => {
15+
return { [a]: 1, [b]: 1 };
16+
})();
17+
console.log(aVal, bVal);
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
=== tests/cases/conformance/es6/destructuring/destructuringObjectBindingPatternAndAssignment6.ts ===
2+
const a = "a";
3+
>a : Symbol(a, Decl(destructuringObjectBindingPatternAndAssignment6.ts, 0, 5))
4+
5+
const b = "b";
6+
>b : Symbol(b, Decl(destructuringObjectBindingPatternAndAssignment6.ts, 1, 5))
7+
8+
const { [a]: aVal, [b]: bVal } = (() => {
9+
>a : Symbol(a, Decl(destructuringObjectBindingPatternAndAssignment6.ts, 0, 5))
10+
>aVal : Symbol(aVal, Decl(destructuringObjectBindingPatternAndAssignment6.ts, 3, 7))
11+
>b : Symbol(b, Decl(destructuringObjectBindingPatternAndAssignment6.ts, 1, 5))
12+
>bVal : Symbol(bVal, Decl(destructuringObjectBindingPatternAndAssignment6.ts, 3, 18))
13+
14+
return { [a]: 1, [b]: 1 };
15+
>[a] : Symbol([a], Decl(destructuringObjectBindingPatternAndAssignment6.ts, 4, 9))
16+
>a : Symbol(a, Decl(destructuringObjectBindingPatternAndAssignment6.ts, 0, 5))
17+
>[b] : Symbol([b], Decl(destructuringObjectBindingPatternAndAssignment6.ts, 4, 17))
18+
>b : Symbol(b, Decl(destructuringObjectBindingPatternAndAssignment6.ts, 1, 5))
19+
20+
})();
21+
console.log(aVal, bVal);
22+
>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --))
23+
>console : Symbol(console, Decl(lib.dom.d.ts, --, --))
24+
>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --))
25+
>aVal : Symbol(aVal, Decl(destructuringObjectBindingPatternAndAssignment6.ts, 3, 7))
26+
>bVal : Symbol(bVal, Decl(destructuringObjectBindingPatternAndAssignment6.ts, 3, 18))
27+
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
=== tests/cases/conformance/es6/destructuring/destructuringObjectBindingPatternAndAssignment6.ts ===
2+
const a = "a";
3+
>a : "a"
4+
>"a" : "a"
5+
6+
const b = "b";
7+
>b : "b"
8+
>"b" : "b"
9+
10+
const { [a]: aVal, [b]: bVal } = (() => {
11+
>a : "a"
12+
>aVal : number
13+
>b : "b"
14+
>bVal : number
15+
>(() => { return { [a]: 1, [b]: 1 };})() : { a: number; b: number; }
16+
>(() => { return { [a]: 1, [b]: 1 };}) : () => { a: number; b: number; }
17+
>() => { return { [a]: 1, [b]: 1 };} : () => { a: number; b: number; }
18+
19+
return { [a]: 1, [b]: 1 };
20+
>{ [a]: 1, [b]: 1 } : { a: number; b: number; }
21+
>[a] : number
22+
>a : "a"
23+
>1 : 1
24+
>[b] : number
25+
>b : "b"
26+
>1 : 1
27+
28+
})();
29+
console.log(aVal, bVal);
30+
>console.log(aVal, bVal) : void
31+
>console.log : (...data: any[]) => void
32+
>console : Console
33+
>log : (...data: any[]) => void
34+
>aVal : number
35+
>bVal : number
36+
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
//// [destructuringObjectBindingPatternAndAssignment7.ts]
2+
enum K {
3+
a = "a",
4+
b = "b"
5+
}
6+
const { [K.a]: aVal, [K.b]: bVal } = (() => {
7+
return { [K.a]: 1, [K.b]: 1 };
8+
})();
9+
console.log(aVal, bVal);
10+
11+
12+
//// [destructuringObjectBindingPatternAndAssignment7.js]
13+
var K;
14+
(function (K) {
15+
K["a"] = "a";
16+
K["b"] = "b";
17+
})(K || (K = {}));
18+
var _a = (function () {
19+
var _a;
20+
return _a = {}, _a[K.a] = 1, _a[K.b] = 1, _a;
21+
})(), _b = K.a, aVal = _a[_b], _c = K.b, bVal = _a[_c];
22+
console.log(aVal, bVal);
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
=== tests/cases/conformance/es6/destructuring/destructuringObjectBindingPatternAndAssignment7.ts ===
2+
enum K {
3+
>K : Symbol(K, Decl(destructuringObjectBindingPatternAndAssignment7.ts, 0, 0))
4+
5+
a = "a",
6+
>a : Symbol(K.a, Decl(destructuringObjectBindingPatternAndAssignment7.ts, 0, 8))
7+
8+
b = "b"
9+
>b : Symbol(K.b, Decl(destructuringObjectBindingPatternAndAssignment7.ts, 1, 12))
10+
}
11+
const { [K.a]: aVal, [K.b]: bVal } = (() => {
12+
>K.a : Symbol(K.a, Decl(destructuringObjectBindingPatternAndAssignment7.ts, 0, 8))
13+
>K : Symbol(K, Decl(destructuringObjectBindingPatternAndAssignment7.ts, 0, 0))
14+
>a : Symbol(K.a, Decl(destructuringObjectBindingPatternAndAssignment7.ts, 0, 8))
15+
>aVal : Symbol(aVal, Decl(destructuringObjectBindingPatternAndAssignment7.ts, 4, 7))
16+
>K.b : Symbol(K.b, Decl(destructuringObjectBindingPatternAndAssignment7.ts, 1, 12))
17+
>K : Symbol(K, Decl(destructuringObjectBindingPatternAndAssignment7.ts, 0, 0))
18+
>b : Symbol(K.b, Decl(destructuringObjectBindingPatternAndAssignment7.ts, 1, 12))
19+
>bVal : Symbol(bVal, Decl(destructuringObjectBindingPatternAndAssignment7.ts, 4, 20))
20+
21+
return { [K.a]: 1, [K.b]: 1 };
22+
>[K.a] : Symbol([K.a], Decl(destructuringObjectBindingPatternAndAssignment7.ts, 5, 9))
23+
>K.a : Symbol(K.a, Decl(destructuringObjectBindingPatternAndAssignment7.ts, 0, 8))
24+
>K : Symbol(K, Decl(destructuringObjectBindingPatternAndAssignment7.ts, 0, 0))
25+
>a : Symbol(K.a, Decl(destructuringObjectBindingPatternAndAssignment7.ts, 0, 8))
26+
>[K.b] : Symbol([K.b], Decl(destructuringObjectBindingPatternAndAssignment7.ts, 5, 19))
27+
>K.b : Symbol(K.b, Decl(destructuringObjectBindingPatternAndAssignment7.ts, 1, 12))
28+
>K : Symbol(K, Decl(destructuringObjectBindingPatternAndAssignment7.ts, 0, 0))
29+
>b : Symbol(K.b, Decl(destructuringObjectBindingPatternAndAssignment7.ts, 1, 12))
30+
31+
})();
32+
console.log(aVal, bVal);
33+
>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --))
34+
>console : Symbol(console, Decl(lib.dom.d.ts, --, --))
35+
>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --))
36+
>aVal : Symbol(aVal, Decl(destructuringObjectBindingPatternAndAssignment7.ts, 4, 7))
37+
>bVal : Symbol(bVal, Decl(destructuringObjectBindingPatternAndAssignment7.ts, 4, 20))
38+
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
=== tests/cases/conformance/es6/destructuring/destructuringObjectBindingPatternAndAssignment7.ts ===
2+
enum K {
3+
>K : K
4+
5+
a = "a",
6+
>a : K.a
7+
>"a" : "a"
8+
9+
b = "b"
10+
>b : K.b
11+
>"b" : "b"
12+
}
13+
const { [K.a]: aVal, [K.b]: bVal } = (() => {
14+
>K.a : K.a
15+
>K : typeof K
16+
>a : K.a
17+
>aVal : number
18+
>K.b : K.b
19+
>K : typeof K
20+
>b : K.b
21+
>bVal : number
22+
>(() => { return { [K.a]: 1, [K.b]: 1 };})() : { a: number; b: number; }
23+
>(() => { return { [K.a]: 1, [K.b]: 1 };}) : () => { a: number; b: number; }
24+
>() => { return { [K.a]: 1, [K.b]: 1 };} : () => { a: number; b: number; }
25+
26+
return { [K.a]: 1, [K.b]: 1 };
27+
>{ [K.a]: 1, [K.b]: 1 } : { a: number; b: number; }
28+
>[K.a] : number
29+
>K.a : K.a
30+
>K : typeof K
31+
>a : K.a
32+
>1 : 1
33+
>[K.b] : number
34+
>K.b : K.b
35+
>K : typeof K
36+
>b : K.b
37+
>1 : 1
38+
39+
})();
40+
console.log(aVal, bVal);
41+
>console.log(aVal, bVal) : void
42+
>console.log : (...data: any[]) => void
43+
>console : Console
44+
>log : (...data: any[]) => void
45+
>aVal : number
46+
>bVal : number
47+
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
//// [destructuringObjectBindingPatternAndAssignment7.ts]
2+
enum K {
3+
a = "a",
4+
b = "b"
5+
}
6+
const { [K.a]: aVal, [K.b]: bVal } = (() => {
7+
return { [K.a]: 1, [K.b]: 1 };
8+
})();
9+
console.log(aVal, bVal);
10+
11+
12+
//// [destructuringObjectBindingPatternAndAssignment7.js]
13+
var K;
14+
(function (K) {
15+
K["a"] = "a";
16+
K["b"] = "b";
17+
})(K || (K = {}));
18+
const { [K.a]: aVal, [K.b]: bVal } = (() => {
19+
return { [K.a]: 1, [K.b]: 1 };
20+
})();
21+
console.log(aVal, bVal);
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
=== tests/cases/conformance/es6/destructuring/destructuringObjectBindingPatternAndAssignment7.ts ===
2+
enum K {
3+
>K : Symbol(K, Decl(destructuringObjectBindingPatternAndAssignment7.ts, 0, 0))
4+
5+
a = "a",
6+
>a : Symbol(K.a, Decl(destructuringObjectBindingPatternAndAssignment7.ts, 0, 8))
7+
8+
b = "b"
9+
>b : Symbol(K.b, Decl(destructuringObjectBindingPatternAndAssignment7.ts, 1, 12))
10+
}
11+
const { [K.a]: aVal, [K.b]: bVal } = (() => {
12+
>K.a : Symbol(K.a, Decl(destructuringObjectBindingPatternAndAssignment7.ts, 0, 8))
13+
>K : Symbol(K, Decl(destructuringObjectBindingPatternAndAssignment7.ts, 0, 0))
14+
>a : Symbol(K.a, Decl(destructuringObjectBindingPatternAndAssignment7.ts, 0, 8))
15+
>aVal : Symbol(aVal, Decl(destructuringObjectBindingPatternAndAssignment7.ts, 4, 7))
16+
>K.b : Symbol(K.b, Decl(destructuringObjectBindingPatternAndAssignment7.ts, 1, 12))
17+
>K : Symbol(K, Decl(destructuringObjectBindingPatternAndAssignment7.ts, 0, 0))
18+
>b : Symbol(K.b, Decl(destructuringObjectBindingPatternAndAssignment7.ts, 1, 12))
19+
>bVal : Symbol(bVal, Decl(destructuringObjectBindingPatternAndAssignment7.ts, 4, 20))
20+
21+
return { [K.a]: 1, [K.b]: 1 };
22+
>[K.a] : Symbol([K.a], Decl(destructuringObjectBindingPatternAndAssignment7.ts, 5, 9))
23+
>K.a : Symbol(K.a, Decl(destructuringObjectBindingPatternAndAssignment7.ts, 0, 8))
24+
>K : Symbol(K, Decl(destructuringObjectBindingPatternAndAssignment7.ts, 0, 0))
25+
>a : Symbol(K.a, Decl(destructuringObjectBindingPatternAndAssignment7.ts, 0, 8))
26+
>[K.b] : Symbol([K.b], Decl(destructuringObjectBindingPatternAndAssignment7.ts, 5, 19))
27+
>K.b : Symbol(K.b, Decl(destructuringObjectBindingPatternAndAssignment7.ts, 1, 12))
28+
>K : Symbol(K, Decl(destructuringObjectBindingPatternAndAssignment7.ts, 0, 0))
29+
>b : Symbol(K.b, Decl(destructuringObjectBindingPatternAndAssignment7.ts, 1, 12))
30+
31+
})();
32+
console.log(aVal, bVal);
33+
>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --))
34+
>console : Symbol(console, Decl(lib.dom.d.ts, --, --))
35+
>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --))
36+
>aVal : Symbol(aVal, Decl(destructuringObjectBindingPatternAndAssignment7.ts, 4, 7))
37+
>bVal : Symbol(bVal, Decl(destructuringObjectBindingPatternAndAssignment7.ts, 4, 20))
38+
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
=== tests/cases/conformance/es6/destructuring/destructuringObjectBindingPatternAndAssignment7.ts ===
2+
enum K {
3+
>K : K
4+
5+
a = "a",
6+
>a : K.a
7+
>"a" : "a"
8+
9+
b = "b"
10+
>b : K.b
11+
>"b" : "b"
12+
}
13+
const { [K.a]: aVal, [K.b]: bVal } = (() => {
14+
>K.a : K.a
15+
>K : typeof K
16+
>a : K.a
17+
>aVal : number
18+
>K.b : K.b
19+
>K : typeof K
20+
>b : K.b
21+
>bVal : number
22+
>(() => { return { [K.a]: 1, [K.b]: 1 };})() : { a: number; b: number; }
23+
>(() => { return { [K.a]: 1, [K.b]: 1 };}) : () => { a: number; b: number; }
24+
>() => { return { [K.a]: 1, [K.b]: 1 };} : () => { a: number; b: number; }
25+
26+
return { [K.a]: 1, [K.b]: 1 };
27+
>{ [K.a]: 1, [K.b]: 1 } : { a: number; b: number; }
28+
>[K.a] : number
29+
>K.a : K.a
30+
>K : typeof K
31+
>a : K.a
32+
>1 : 1
33+
>[K.b] : number
34+
>K.b : K.b
35+
>K : typeof K
36+
>b : K.b
37+
>1 : 1
38+
39+
})();
40+
console.log(aVal, bVal);
41+
>console.log(aVal, bVal) : void
42+
>console.log : (...data: any[]) => void
43+
>console : Console
44+
>log : (...data: any[]) => void
45+
>aVal : number
46+
>bVal : number
47+

0 commit comments

Comments
 (0)