• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/*
2 * Copyright (c) 2025 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16// Object destructuring
17let a = 5, b = 10, c = 15, d = 20, s = 'foo';
18let rest, rest2;
19interface GeneratedObjectLiteralInterface_2 {
20    a: number;
21    b: number;
22    s: string;
23}
24let GeneratedDestructObj_1: GeneratedObjectLiteralInterface_2 = { a: 100, b: 200, s: 'bar' };
25a = GeneratedDestructObj_1.a;
26b = GeneratedDestructObj_1.b;
27s = GeneratedDestructObj_1.s;
28 // NOT OK
29({ a, b, s } = {}); // NOT OK, not fixable
30({ a, ...rest } = { a: 1, b: 2 }); // NOT OK
31interface GeneratedObjectLiteralInterface_3 {
32    c: number;
33    d: string;
34}
35interface GeneratedObjectLiteralInterface_6 {
36    a: number;
37    b: GeneratedObjectLiteralInterface_3;
38}
39let GeneratedDestructObj_2: GeneratedObjectLiteralInterface_6 = { a: 1, b: ({ c: 3, d: 'baz' } as GeneratedObjectLiteralInterface_3) };
40a = GeneratedDestructObj_2.a;
41let GeneratedDestructObj_7 = GeneratedDestructObj_2.b;
42c = GeneratedDestructObj_7.c;
43s = GeneratedDestructObj_7.d;
44
45 // NOT OK
46({ a, b: { ...rest } } = { a: 1, b: { c: 3, d: 'bah' }}); // NOT OK
47
48interface GeneratedObjectLiteralInterface_1 {
49    a: number;
50    b: number;
51}
52function getObject() {
53  return ({ a: 1, b: 2 } as GeneratedObjectLiteralInterface_1);
54}
55let GeneratedDestructObj_3 = getObject();
56a = GeneratedDestructObj_3.a;
57b = GeneratedDestructObj_3.b;
58 // NOT OK
59
60// Array destructuring
61let GeneratedDestructArray_1 = [10, 20, 30];
62a = GeneratedDestructArray_1[0];
63b = GeneratedDestructArray_1[1];
64c = GeneratedDestructArray_1[2];
65
66[a, b, c] = [];
67let GeneratedDestructArray_2 = [[1, 2], [3, 4], [5, 6]];
68a1 = GeneratedDestructArray_2[0][0];
69a2 = GeneratedDestructArray_2[0][1];
70
71b1 = GeneratedDestructArray_2[1][0];
72b2 = GeneratedDestructArray_2[1][1];
73
74c1 = GeneratedDestructArray_2[2][0];
75c2 = GeneratedDestructArray_2[2][1];
76
77
78let GeneratedDestructArray_3 = [b, a];
79a = GeneratedDestructArray_3[0];
80b = GeneratedDestructArray_3[1];
81
82[a, b, ...rest] = [10, 20, 30, 40, 50]; // NOT OK
83[a, b, [c, d]] = [10, 20, [300, 400], 50];
84[a, b, [c, ...rest]] = [10, 20, [30, 40, 50]]; // NOT OK
85
86let tuple: [number, string, number] = [1, '2', 3];
87[a, , b] = tuple;
88[a, ...rest] = tuple; // NOT OK
89
90const getArray = (): number[] => [1, 2, 3];
91let GeneratedDestructArray_4 = getArray();
92a = GeneratedDestructArray_4[0];
93b = GeneratedDestructArray_4[1];
94
95
96const set: Set<number> = new Set([1, 2, 3, 4]);
97[a, b, c] = set; // NOT OK
98
99const map: Map<number, number> = new Map();
100[[a, b], [c, d]] = map; // NOT OK
101
102// Mixed destructuring
103interface GeneratedTypeLiteralInterface_1 {
104    e: number;
105}
106let e: number, f: number, x: GeneratedTypeLiteralInterface_1, g;
107[a, b, [x, { f }]] = [1, 2, [{ e: 20 }, { f: 5 }]]; // NOT OK
108[a, b, {e, e: f, ...g}] = [1, 2, {e: 10}]; // NOT OK
109[a, b, ...{length}] = [1, 2, {e: 10}]; // NOT OK
110
111interface GeneratedObjectLiteralInterface_4 {
112    a: number;
113    b: number[];
114}
115let GeneratedDestructObj_4: GeneratedObjectLiteralInterface_4 = { a: 1, b: [2, 3] };
116a = GeneratedDestructObj_4.a;
117let GeneratedDestructArray_5 = GeneratedDestructObj_4.b;
118c = GeneratedDestructArray_5[0];
119d = GeneratedDestructArray_5[1];
120
121 // NOT OK
122interface GeneratedObjectLiteralInterface_5 {
123    s: string;
124    c: number[];
125}
126interface GeneratedObjectLiteralInterface_7 {
127    a: number;
128    b: GeneratedObjectLiteralInterface_5;
129}
130let GeneratedDestructObj_5: GeneratedObjectLiteralInterface_7 = { a: 10, b: ({ s: 'foo', c: [30, 40] } as GeneratedObjectLiteralInterface_5) };
131a = GeneratedDestructObj_5.a;
132let GeneratedDestructObj_8 = GeneratedDestructObj_5.b;
133s = GeneratedDestructObj_8.s;
134let GeneratedDestructArray_6 = GeneratedDestructObj_8.c;
135d = GeneratedDestructArray_6[0];
136f = GeneratedDestructArray_6[1];
137
138
139 // NOT OK
140
141// test for default value
142({ a, b = 7, s } = { a: 100, b: 200, s: 'bar' }); // NOT OK
143({ a, b: { c = 6, d: s } } = { a: 1, b: { c: 3, d: 'baz' }}); // NOT OK
144({ a, b : [c, d = 8] } = { a: 1, b: [2, 3] }); // NOT OK
145({
146  a,
147  b: {
148    s,
149    c: [d = 9, f],
150  },
151} = { a: 10, b: { s: 'foo', c: [30, 40] } }); // NOT OK
152
153
154// test for new Expression
155class C {
156  public a: number = 10;
157  public b: number = 10;
158  public s: string = "0000";
159}
160
161let GeneratedDestructObj_6 = new C();
162a = GeneratedDestructObj_6.a;
163b = GeneratedDestructObj_6.b;
164s = GeneratedDestructObj_6.s;
165 // NOT OK
166
167