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