• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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