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// Following declarations are added to check that we don't generate new interfaces with names that already exist 17import GeneratedObjectLiteralInterface_4 from 'x'; 18import * as GeneratedObjectLiteralInterface_7 from 'x'; 19import { 20 GeneratedObjectLiteralInterface_8, 21 foo as GeneratedObjectLiteralInterface_9 22} from 'x'; 23interface GeneratedObjectLiteralInterface_11 {} 24class GeneratedObjectLiteralInterface_12 {} 25function GeneratedObjectLiteralInterface_15() {} 26 27class C<T> {} 28 29function foo(x): number { 30 return 1; 31} 32 33interface GeneratedObjectLiteralInterface_1 { 34} 35const o1: GeneratedObjectLiteralInterface_1 = {}; 36interface GeneratedObjectLiteralInterface_2 { 37 hello: string; 38} 39const o2: GeneratedObjectLiteralInterface_2 = { hello: "world" }; 40interface GeneratedObjectLiteralInterface_3 { 41 a: number; 42 b: number; 43} 44const o3!: GeneratedObjectLiteralInterface_3 = {a: 1, b: 2}; 45interface GeneratedObjectLiteralInterface_5 { 46 field: string; 47 field1: number; 48 field2: string; 49 field3: number; 50 field4: boolean; 51 field5: boolean; 52} 53const o4: GeneratedObjectLiteralInterface_5 = { 54 field: "hello", 55 field1: 2, 56 field2: "world", 57 field3: 4, 58 field4: true, 59 field5: false 60}; 61 62// Properties with various types. Nested object literals 63interface GeneratedObjectLiteralInterface_6 { 64} 65interface GeneratedObjectLiteralInterface_10 { 66 a: number; 67 b: string; 68} 69interface GeneratedObjectLiteralInterface_13 { 70 q: number; 71 w: number; 72} 73interface GeneratedObjectLiteralInterface_25 { 74 a: number; 75 b: string; 76 c: boolean; 77 d: C<number>; 78 e: GeneratedObjectLiteralInterface_6; 79 f: GeneratedObjectLiteralInterface_10; 80 g: GeneratedObjectLiteralInterface_13; 81} 82const o5: GeneratedObjectLiteralInterface_25 = { 83 a: 1, 84 b: '2', 85 c: true, 86 d: new C<number>(), 87 e: ({} as GeneratedObjectLiteralInterface_6), 88 f: ({ a: 1, b: '2' } as GeneratedObjectLiteralInterface_10), 89 g: ({ q: 10, 90 w: 20 } as GeneratedObjectLiteralInterface_13), 91}; 92interface GeneratedObjectLiteralInterface_14 { 93 q: number; 94 w: number; 95} 96interface GeneratedObjectLiteralInterface_16 { 97 q: number; 98 w: number; 99} 100interface GeneratedObjectLiteralInterface_21 { 101 a: number; 102 b: string; 103 c: GeneratedObjectLiteralInterface_14; 104 d: boolean; 105 e: GeneratedObjectLiteralInterface_16; 106} 107const o6: GeneratedObjectLiteralInterface_21 = { 108 a: 1, 109 b: '2', 110 c: ({ q: 10, w: 20 } as GeneratedObjectLiteralInterface_14), 111 d: true, 112 e: ({ q: 30, w: 40 } as GeneratedObjectLiteralInterface_16) 113}; 114 115// Object literals inside another expression 116interface GeneratedObjectLiteralInterface_17 { 117 a: number; 118 b: number; 119} 120interface GeneratedObjectLiteralInterface_18 { 121 a: number; 122 b: number; 123} 124const o7 = ({ a: 1, b: 2 } as GeneratedObjectLiteralInterface_17).a + ({ a: 3, b: 4 } as GeneratedObjectLiteralInterface_18).b; 125interface GeneratedObjectLiteralInterface_19 { 126 x: number; 127 y: number; 128} 129interface GeneratedObjectLiteralInterface_20 { 130 a: number; 131 b: number; 132 c: GeneratedObjectLiteralInterface_19; 133 d: number; 134} 135interface GeneratedObjectLiteralInterface_23 { 136 q: number; 137 w: number; 138} 139interface GeneratedObjectLiteralInterface_27 { 140 q: number; 141 w: number; 142} 143const o8: GeneratedObjectLiteralInterface_20 = { 144 a: 1, 145 b: 2, 146 c: ({ x: 1, y: 2 } as GeneratedObjectLiteralInterface_19), 147 d: foo(({ q: 1, w: 2 } as GeneratedObjectLiteralInterface_23).q + ({ q: 3, w: 4 } as GeneratedObjectLiteralInterface_27).w) 148}; 149 150// Object literals inside class declaration 151interface GeneratedObjectLiteralInterface_22 { 152 a: number; 153 b: number; 154} 155interface GeneratedObjectLiteralInterface_24 { 156 a: number; 157 b: number; 158} 159interface GeneratedObjectLiteralInterface_26 { 160 a: number; 161 b: number; 162} 163interface GeneratedObjectLiteralInterface_28 { 164 c: number; 165 d: number; 166} 167interface GeneratedObjectLiteralInterface_29 { 168 e: number; 169} 170interface GeneratedObjectLiteralInterface_32 { 171 f: number; 172 g: number; 173} 174interface GeneratedObjectLiteralInterface_34 { 175 a: number; 176 b: number; 177} 178interface GeneratedObjectLiteralInterface_36 { 179 c: number; 180 d: number; 181 e: number; 182} 183class D { 184 f1: GeneratedObjectLiteralInterface_22 = {a: 1, b: 2}; 185 f2?: GeneratedObjectLiteralInterface_24 = {a: 1, b: 2}; 186 f3!: GeneratedObjectLiteralInterface_26 = {a: 1, b: 2}; 187 f4 = ({ c: 3, d: 4 } as GeneratedObjectLiteralInterface_28); 188 f5 = ({ e: 5 } as GeneratedObjectLiteralInterface_29).e + ({ f: 6, g: 7 } as GeneratedObjectLiteralInterface_32).f; 189 190 m() { 191 let x: GeneratedObjectLiteralInterface_34 = {a:1, b:2}; 192 let y: GeneratedObjectLiteralInterface_36 = {c:1, d:2, e:3}; 193 } 194} 195 196// Object literals as function parameter initializer 197interface GeneratedObjectLiteralInterface_30 { 198 a: number; 199 b: number; 200} 201function funInit(p: GeneratedObjectLiteralInterface_30 = { a: 1, b: 2 }) {} 202function funInit2({a, b} = { a: 3, b: 4 }) {} // Not fixable, as in case of destructuring parameters, the contextual type of expression is implied by the binding pattern 203 204// Object literals inside function declaration 205interface GeneratedObjectLiteralInterface_31 { 206 a: number; 207 b: number; 208} 209interface GeneratedObjectLiteralInterface_33 { 210 c: number; 211 d: number; 212} 213interface GeneratedObjectLiteralInterface_35 { 214 e: number; 215 f: number; 216} 217interface GeneratedObjectLiteralInterface_37 { 218 g: number; 219 d: number; 220} 221interface GeneratedObjectLiteralInterface_38 { 222 q: number; 223 w: number; 224} 225interface GeneratedObjectLiteralInterface_39 { 226 q: number; 227 w: number; 228} 229function bar(): void { 230 let a: GeneratedObjectLiteralInterface_31 = {a: 1, b: 2}; 231 let b: GeneratedObjectLiteralInterface_33 = {c: 3, d: 4}; 232 233 if (a.b > b.c) { 234 let c: GeneratedObjectLiteralInterface_35 = {e: 5, f: 6}; 235 } 236 237 let d: GeneratedObjectLiteralInterface_37 = {g: 7, d: foo(({ q: 1, w: 2 } as GeneratedObjectLiteralInterface_38).q + ({ q: 3, w: 4 } as GeneratedObjectLiteralInterface_39).w)}; 238} 239 240const o9 = { 1: '1', '2': 2 }; // Not fixable, property name is string/numeric literal 241const o10 = { [3]: 3 }; // Not fixable, computed property value 242const o11 = { [o2.hello]: 'world' }; // Not fixable, computed property value 243 244const anyVal: any = 1; 245const o12 = { a: anyVal }; // Not fixable, type of property 'a' is not supported 246 247let val = 1; 248const o13 = { val }; // Fixable 249const o14 = { ...o1 }; // Not fixable, property is not 'key:value' pair 250class GeneratedObjectLiteralClass_1 { 251 m() { } 252} 253 254const o15 = new GeneratedObjectLiteralClass_1(); // Fixable 255 256const o16 = { // Not fixable, property 'c' is initialized with non-fixable nested object literal, and thus will always have unsupported type (object type literal) 257 a: 1, 258 b: '2', 259 c: { 260 q: 1, 261 w: 2, 262 e: anyVal // Not fixable, unsupported type 263 } 264} 265 266class X<K> {} 267class Y<Q extends X<Q>> {} 268function captureFromLocalScope<T>(t: T): void { 269 let v1 = {a: 1, b: '2', c: t}; // Not fixable, `c` references local type parameter `T` 270 let v2 = {a: 1, b: '2', c: new X<T>()}; // Not fixable, `c` references local type parameter `T` 271 let v3 = {a: 1, b: '2', c: new Y<X<T>>()}; // Not fixable, `c` references local type parameter `T` 272 273 interface LocalType { 274 a: number; 275 b: string; 276} 277 let localTypeVar: LocalType = {a:1, b:'2'}; 278 let v4 = { x: localTypeVar }; // Non-fixable, `x` references type `LocalType` declared in local scope 279 280 class LocalClass {x: number = 1}; 281 let v5 = { y: new LocalClass() }; // Non-fixable, `y` references type `LocalClass` declared in local scope 282 283 let v6 = { z: LocalClass }; // Non-fixable, `z` references type `LocalClass` declared in local scope 284} 285 286// Record object literals 287let rec1: Record<string, any> = { 288 "a": 1, 289 "b": 2, 290 "c": 3 291} 292 293let rec2: Record<string | number, any> = { 294 "foo": 1, 295 "bar": 2, 296 10: 'foo', 297 20: 'bar', 298 "baz": 3, 299 'daz': 4 300} 301 302let rec3: Record<string | number, any> = { // Not fixable 303 f1: 1, 304 f2: 2, 305 f3: 3, 306 [val]: 4 // Not fixable, key is a computed value 307} 308 309interface NullableRecord { 310 params?: Record<string, string>; 311} 312let rec4: NullableRecord = { 313 params: { 314 "key": '1', 315 "message": '2' 316 } 317};