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