1/* 2 * Copyright (c) 2023-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// Untyped object literals 17class GeneratedObjectLiteralClass_1 { 18 m() { console.log(1.0); } // Error, fixable 19} 20 21let method = new GeneratedObjectLiteralClass_1(); 22 23class GeneratedObjectLiteralClass_2 { 24 get property() { return 2.0; } // Error, fixable 25} 26 27let getMethod = new GeneratedObjectLiteralClass_2(); 28 29class GeneratedObjectLiteralClass_3 { 30 set property(value: number) { 31 console.log(value); 32 } 33} 34 35let setMethod = new GeneratedObjectLiteralClass_3(); 36 37let x: number = 1.0, y = '2', z = true; 38 39interface GeneratedObjectLiteralInterface_1 { 40 x: number; 41 y: string; 42 z: boolean; 43} 44let shorthand: GeneratedObjectLiteralInterface_1 = { 45 x: x, // Error, fixable 46 y: y, // Error, fixable 47 z: z // Error, fixable 48}; 49 50let spread = { 51 ...shorthand // Error, not fixable 52}; 53 54class GeneratedObjectLiteralClass_4 { 55 a: string; 56 b: number; 57 c: number[]; 58 x: number; 59 y: string; 60 constructor(init: GeneratedObjectLiteralInitInterface_4) { 61 this.a = init.a; 62 this.b = init.b; 63 this.c = init.c; 64 this.x = init.x; 65 this.y = init.y; 66 } 67 method() { 68 console.log(42.0); 69 } 70 get property() { 71 return 0.0; 72 } 73 set property(value: number) { 74 if (value < 0.0) { 75 throw new Error('Bad value'); 76 } 77 } 78} 79 80interface GeneratedObjectLiteralInitInterface_4 { 81 a: string; 82 b: number; 83 c: number[]; 84 x: number; 85 y: string; 86} 87 88let mixed = new GeneratedObjectLiteralClass_4({ 89 a: "foo", 90 b: 42.0, 91 c: [1.0, 2.0, 3.0], 92 x: x, 93 y: y 94}); 95 96let x2: number = 1.0, y2: number = 2.0, z2: number = 3.0; 97let mixedBad = { // Not fixable 98 a: 1.0, 99 b: 2.0, 100 x2: x2, // Error, fixable 101 y2: y2, // Error, fixable 102 z2: z2, // Error, fixable 103 m() {}, 104 ...shorthand // Error, not fixable 105} 106 107// Typed object literals 108interface I { 109 m(): void; 110} 111class GeneratedObjectLiteralClass_5 implements I { 112 m() { 113 console.log(100.0); 114 } 115} 116 117let i: I = new GeneratedObjectLiteralClass_5(); 118 119class C { 120 m(): void { 121 console.log(200.0); 122 } 123} 124class GeneratedObjectLiteralClass_6 extends C { 125 m(): void { 126 console.log(300.0); 127 } 128} 129 130let c: C = new GeneratedObjectLiteralClass_6(); 131 132function foo(c: C) {} 133class GeneratedObjectLiteralClass_7 extends C { 134 m() { console.log(300.0); } // Fixable 135} 136 137foo(new GeneratedObjectLiteralClass_7()); 138 139class C2 { 140 x2: number = 10.0; 141 y2: number = 20.0; 142 z2: number = 30.0; 143 144 m() {} 145} 146class GeneratedObjectLiteralClass_8 extends C2 { 147 x2: number; 148 y2: number; 149 z2: number; 150 constructor(init: GeneratedObjectLiteralInitInterface_1) { 151 super(); 152 this.x2 = init.x2; 153 this.y2 = init.y2; 154 this.z2 = init.z2; 155 } 156 m() { console.log(1.0); } // Fixable 157} 158 159interface GeneratedObjectLiteralInitInterface_1 { 160 x2: number; 161 y2: number; 162 z2: number; 163} 164 165let c2: C2 = new GeneratedObjectLiteralClass_8({ 166 x2: x2, 167 y2: y2, 168 z2: z2 169}); 170 171let c22: C2 = { 172 x2: x2, // Fixable 173 y2: y2, // Fixable 174 z2: z2, // Fixable 175 m() { console.log(1.0); }, // Not fixable, object has spread property 176 ...shorthand // Not fixable 177}; 178 179class C3 { 180 x2: number = 10.0; 181 y2: number = 20.0; 182 z2: number = 30.0; 183 184 m() {} 185 186 constructor(a: number) {} 187} 188let c3: C3 = { 189 x2: x2, // Fixable 190 y2: y2, // Fixable 191 z2: z2, // Fixable 192 m() { console.log(1.0); } // Not fixable, class type has constructor with parameters 193}; 194 195function capturesFromLocalScope() { 196 let a: number = 1.0, b: number = 2.0; 197 let captureLocalVal = { 198 m() { // Not fixable, captures local values 'a' and 'b' 199 console.log(a, b); 200 } 201 }; 202 203 let captureLocalVal2: C = { 204 m(): void { // Not fixable, captures local values 'a' and 'b' 205 console.log(a, b); 206 } 207 }; 208 209 interface LocalType { 210 a: number; 211 b: string; 212} 213 let localTypeVar: LocalType = { a: 1.0, b: '2' }; 214 let captureLocalType = { 215 m() { // Not fixable, captures value of type `LocalType` declared in local scope 216 console.log(localTypeVar); 217 } 218 }; 219 let captureLocalType2 = { 220 m(x: LocalType) { // Not fixable, `x` references type `LocalType` declared in local scope 221 console.log(x); 222 } 223 }; 224 225 class LocalClass { x: number = 1.0 }; 226 let captureLocalType3 = { 227 m() { // Not fixable, references type `LocalClass` declared in local scope 228 console.log(new LocalClass()); 229 } 230 }; 231} 232 233// Method overriding field 234class C4 { 235 a: number = 0.0; 236 b() {}; 237} 238let c4: C4 = { // Not fixable, overrides class method with property of functional type 239 a: 1.0, 240 b: () => {} 241}; 242 243class C5 { 244 a: number = 0.0; 245 b: () => void; 246} 247let c5: C5 = { // Not fixable, overrides class property with method 248 a: 1.0, 249 b() {} 250}; 251 252interface I2 { 253 a: number; 254 b(): void; 255} 256let i2: I2 = { // Not fixable, implements method as functional-type property 257 a: 1.0, 258 b: () => {} 259}; 260 261interface I3 { 262 a: number; 263 b: () => void; 264} 265let ii: I3 = { // Not fixable, implements functional-type property as a method 266 a: 1.0, 267 b() {} 268}; 269 270// Inheritance 271class Base { 272 constructor() {} 273} 274class Derived extends Base { 275 m() {} 276} 277class GeneratedObjectLiteralClass_9 extends Derived { 278 m() { console.log(2.0); } 279} 280 281let b: Derived = new GeneratedObjectLiteralClass_9(); 282 283class Base2 { 284 constructor(a: number) {} 285} 286class Derived2 extends Base2 { 287 m() {} 288} 289let b2: Derived2 = { // Not fixable, derived class inherits a constructor with parameters from base class 290 m() { console.log(2.0); } 291}; 292 293class Base3 { 294 constructor(a: number) {} 295} 296class Derived3 extends Base3 { 297 m() {} 298 299 constructor() { 300 super(1.0); 301 } 302} 303class GeneratedObjectLiteralClass_10 extends Derived3 { 304 m() { console.log(2.0); } 305} 306 307let b3: Derived3 = new GeneratedObjectLiteralClass_10(); 308 309interface I4 { 310 map: Map<string, string>; 311} 312let map:Map<string,string> = new Map<string,string>(); 313let i4: I4 = {map: map}; 314 315class C6 { 316 map1: Map<string, string> = new Map<string,string>(); 317} 318 319let map1:Map<string,string> = new Map<string,string>(); 320let c6: C6 = {map1: map1}; 321 322// Namespace typed object literals 323namespace X { 324 export class C { 325 m() { 326 console.log("C - 1"); 327 } 328 } 329 330 export interface I { 331 m(a: number, b: string): void; 332 } 333} 334 335class GeneratedObjectLiteralClass_11 extends X.C { 336 m() { 337 console.log("C - 2"); 338 } 339} 340 341class GeneratedObjectLiteralClass_12 implements X.I { 342 m(): void { 343 console.log("I"); 344 } 345} 346 347function test() { 348 let c: X.C = new GeneratedObjectLiteralClass_11() 349 350 let i: X.I = new GeneratedObjectLiteralClass_12() 351} 352 353class FooBarBaz { 354 foo?: Map<string, Object> 355 bar?: string 356} 357 358function baz(fooBar: Map<string, Object>) { 359 baz2({fooBar}); 360} 361 362function baz2(fooBarBaz: FooBarBaz) { 363} 364