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