• 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
17interface GeneratedObjectLiteralInterface_2 {
18    a: number;
19    b: number;
20    c: string;
21}
22let GeneratedDestructObj_1: GeneratedObjectLiteralInterface_2 = { a: 100, b: 200, c: 'bar' };
23let a = GeneratedDestructObj_1.a;
24let b = GeneratedDestructObj_1.b;
25let c = GeneratedDestructObj_1.c;
26 // NOT OK
27let { a2, ...rest2 } = { a2: 1, b2: 2 }; // NOT OK
28interface GeneratedObjectLiteralInterface_3 {
29    c3: number;
30    d3: string;
31}
32interface GeneratedObjectLiteralInterface_6 {
33    a3: number;
34    b3: GeneratedObjectLiteralInterface_3;
35}
36let GeneratedDestructObj_2: GeneratedObjectLiteralInterface_6 = { a3: 1, b3: ({ c3: 3, d3: 'baz' } as GeneratedObjectLiteralInterface_3)};
37let a3 = GeneratedDestructObj_2.a3;
38let GeneratedDestructObj_7 = GeneratedDestructObj_2.b3;
39let c3 = GeneratedDestructObj_7.c3;
40let e3 = GeneratedDestructObj_7.d3;
41
42 // NOT OK
43let { a4, b4: { ...rest4 } } = { a4: 1, b4: { c4: 3, d4: 'bah' }}; // NOT OK
44
45let { a, b, c } = {}; // NOT OK, not fixable
46
47interface GeneratedObjectLiteralInterface_1 {
48    a5: number;
49    b5: number;
50}
51function getObject() {
52  return ({ a5: 1, b5: 2 } as GeneratedObjectLiteralInterface_1);
53}
54let GeneratedDestructObj_3 = getObject();
55let a5 = GeneratedDestructObj_3.a5;
56let b5 = GeneratedDestructObj_3.b5;
57 // NOT OK
58
59// Array destructuring
60const GeneratedDestructArray_1 = [10, 20, 30];
61const a6 = GeneratedDestructArray_1[0];
62const b6 = GeneratedDestructArray_1[1];
63const c6 = GeneratedDestructArray_1[2];
64
65const [a7, b7, ...rest7] = [10, 20, 30, 40, 50]; // NOT OK
66const [a8, b8, [c8, e8]] = [10, 20, [300, 400], 50];
67const [a9, b9, [c9, ...rest9]] = [10, 20, [30, 40, 50]]; // NOT OK
68
69const GeneratedDestructArray_2 = [[1, 2], [3, 4], [5, 6]];
70const a1 = GeneratedDestructArray_2[0][0];
71const a2 = GeneratedDestructArray_2[0][1];
72
73const b1 = GeneratedDestructArray_2[1][0];
74const b2 = GeneratedDestructArray_2[1][1];
75
76const c1 = GeneratedDestructArray_2[2][0];
77const c2 = GeneratedDestructArray_2[2][1];
78
79
80const GeneratedDestructArray_3 = [[1, 2, 3], [3, 4, 5], [5, 6, 7]];
81const a1 = GeneratedDestructArray_3[0][0];
82const a2 = GeneratedDestructArray_3[0][1];
83const a3 = GeneratedDestructArray_3[0][2];
84
85const b1 = GeneratedDestructArray_3[1][0];
86const b2 = GeneratedDestructArray_3[1][1];
87const b3 = GeneratedDestructArray_3[1][2];
88
89const c1 = GeneratedDestructArray_3[2][0];
90const c2 = GeneratedDestructArray_3[2][1];
91const c3 = GeneratedDestructArray_3[2][2];
92
93
94
95let tuple: [number, string, number] = [1, '2', 3];
96let [a10, , b10] = tuple;
97let [a11, ...rest11] = tuple; // NOT OK
98
99const getArray = (): number[] => [1, 2, 3];
100let GeneratedDestructArray_4 = getArray();
101let a12 = GeneratedDestructArray_4[0];
102let b12 = GeneratedDestructArray_4[1];
103
104
105const set: Set<number> = new Set([1, 2, 3, 4]);
106let [a13, b13, c13] = set; // NOT OK
107
108const map: Map<number, number> = new Map();
109let [[a14, b14], [c14, d14]] = map; // NOT OK
110
111// Mixed destructuring
112let [a15, b15, [x15, { f15 }]] = [1, 2, [{ e15: 20 }, { f15: 5 }]]; // NOT OK
113let [a16, b16, {e16, e16: f16, ...g16}] = [1, 2, {e16: 10}]; // NOT OK
114{ let [a17, b17, ...{length}] = [1, 2, 3, 4]; } // NOT OK
115
116interface GeneratedObjectLiteralInterface_4 {
117    a18: number;
118    b18: number[];
119}
120let GeneratedDestructObj_4: GeneratedObjectLiteralInterface_4 = { a18: 1, b18: [2, 3] };
121let a18 = GeneratedDestructObj_4.a18;
122let GeneratedDestructArray_5 = GeneratedDestructObj_4.b18;
123let c18 = GeneratedDestructArray_5[0];
124let d18 = GeneratedDestructArray_5[1];
125
126 // NOT OK
127interface GeneratedObjectLiteralInterface_5 {
128    c19: string;
129    d19: number[];
130}
131interface GeneratedObjectLiteralInterface_7 {
132    a19: number;
133    b19: GeneratedObjectLiteralInterface_5;
134}
135let GeneratedDestructObj_5: GeneratedObjectLiteralInterface_7 = { a19: 10, b19: ({ c19: 'foo', d19: [30, 40] } as GeneratedObjectLiteralInterface_5) };
136let a19 = GeneratedDestructObj_5.a19;
137let GeneratedDestructObj_8 = GeneratedDestructObj_5.b19;
138let c19 = GeneratedDestructObj_8.c19;
139let GeneratedDestructArray_6 = GeneratedDestructObj_8.d19;
140let e19 = GeneratedDestructArray_6[0];
141let f19 = GeneratedDestructArray_6[1];
142
143
144 // NOT OK
145
146// test for default value
147let { a, b, c = 9 } = { a: 100, b: 200, c: 'bar' }; // NOT OK
148let { a3, b3: { c3 = 10, d3: e3 } } = { a3: 1, b3: { c3: 3, d3: 'baz' }}; // NOT OK
149let { a5, b5 = 7 } = getObject(); // NOT OK
150let { a18, b18: [c18 = 66, d18] } = { a18: 1, b18: [2, 3] }; // NOT OK
151let {
152  a19,
153  b19: {
154    c19,
155    d19: [e19, f19 = 9],
156  },
157} = { a19: 10, b19: { c19: 'foo', d19: [30, 40] } }; // NOT OK
158
159// test for new Expression
160class C {
161  public a: number = 10;
162  public b: number = 10;
163  public s: string = "0000";
164}
165
166let GeneratedDestructObj_6 = new C();
167let a = GeneratedDestructObj_6.a;
168let b = GeneratedDestructObj_6.b;
169let s = GeneratedDestructObj_6.s;
170 // NOT OK