13af6ab5fSopenharmony_ci/*
23af6ab5fSopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd.
33af6ab5fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
43af6ab5fSopenharmony_ci * you may not use this file except in compliance with the License.
53af6ab5fSopenharmony_ci * You may obtain a copy of the License at
63af6ab5fSopenharmony_ci *
73af6ab5fSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0
83af6ab5fSopenharmony_ci *
93af6ab5fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
103af6ab5fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
113af6ab5fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
123af6ab5fSopenharmony_ci * See the License for the specific language governing permissions and
133af6ab5fSopenharmony_ci * limitations under the License.
143af6ab5fSopenharmony_ci */
153af6ab5fSopenharmony_ci
163af6ab5fSopenharmony_ci// Following declarations are added to check that we don't generate new interfaces with names that already exist
173af6ab5fSopenharmony_ciimport GeneratedObjectLiteralInterface_4 from 'x';
183af6ab5fSopenharmony_ciimport * as GeneratedObjectLiteralInterface_7 from 'x';
193af6ab5fSopenharmony_ciimport {
203af6ab5fSopenharmony_ci    GeneratedObjectLiteralInterface_8,
213af6ab5fSopenharmony_ci    foo as GeneratedObjectLiteralInterface_9
223af6ab5fSopenharmony_ci} from 'x';
233af6ab5fSopenharmony_ciinterface GeneratedObjectLiteralInterface_11 {} 
243af6ab5fSopenharmony_ciclass GeneratedObjectLiteralInterface_12 {}
253af6ab5fSopenharmony_cifunction GeneratedObjectLiteralInterface_15() {}
263af6ab5fSopenharmony_ci
273af6ab5fSopenharmony_ciclass C<T> {}
283af6ab5fSopenharmony_ci
293af6ab5fSopenharmony_cifunction foo(x): number {
303af6ab5fSopenharmony_ci    return 1;
313af6ab5fSopenharmony_ci}
323af6ab5fSopenharmony_ci
333af6ab5fSopenharmony_ciconst o1 = {};
343af6ab5fSopenharmony_ciconst o2 = { hello: "world" };
353af6ab5fSopenharmony_ciconst o3! = {a: 1, b: 2};
363af6ab5fSopenharmony_ciconst o4 = { 
373af6ab5fSopenharmony_ci    field: "hello",
383af6ab5fSopenharmony_ci    field1: 2,
393af6ab5fSopenharmony_ci    field2: "world",
403af6ab5fSopenharmony_ci    field3: 4,
413af6ab5fSopenharmony_ci    field4: true,
423af6ab5fSopenharmony_ci    field5: false
433af6ab5fSopenharmony_ci};
443af6ab5fSopenharmony_ci
453af6ab5fSopenharmony_ci// Properties with various types. Nested object literals
463af6ab5fSopenharmony_ciconst o5 = {
473af6ab5fSopenharmony_ci    a: 1,
483af6ab5fSopenharmony_ci    b: '2',
493af6ab5fSopenharmony_ci    c: true,
503af6ab5fSopenharmony_ci    d: new C<number>(),
513af6ab5fSopenharmony_ci    e: {},
523af6ab5fSopenharmony_ci    f: { a: 1, b: '2' },
533af6ab5fSopenharmony_ci    g: {
543af6ab5fSopenharmony_ci        q: 10,
553af6ab5fSopenharmony_ci        w: 20
563af6ab5fSopenharmony_ci    },
573af6ab5fSopenharmony_ci};
583af6ab5fSopenharmony_ciconst o6 = {
593af6ab5fSopenharmony_ci    a: 1,
603af6ab5fSopenharmony_ci    b: '2',
613af6ab5fSopenharmony_ci    c: { q: 10, w: 20 },
623af6ab5fSopenharmony_ci    d: true,
633af6ab5fSopenharmony_ci    e: { q: 30, w: 40 }
643af6ab5fSopenharmony_ci};
653af6ab5fSopenharmony_ci
663af6ab5fSopenharmony_ci// Object literals inside another expression
673af6ab5fSopenharmony_ciconst o7 = { a:1, b:2 }.a + { a:3, b:4 }.b;
683af6ab5fSopenharmony_ciconst o8 = {
693af6ab5fSopenharmony_ci    a: 1, 
703af6ab5fSopenharmony_ci    b: 2,
713af6ab5fSopenharmony_ci    c: ({x:1, y:2}),
723af6ab5fSopenharmony_ci    d: foo({q:1, w:2}.q + {q:3, w:4}.w)
733af6ab5fSopenharmony_ci};
743af6ab5fSopenharmony_ci
753af6ab5fSopenharmony_ci// Object literals inside class declaration
763af6ab5fSopenharmony_ciclass D {
773af6ab5fSopenharmony_ci    f1 = {a: 1, b: 2};
783af6ab5fSopenharmony_ci    f2? = {a: 1, b: 2};
793af6ab5fSopenharmony_ci    f3! = {a: 1, b: 2};
803af6ab5fSopenharmony_ci    f4 = ({c: 3, d: 4});
813af6ab5fSopenharmony_ci    f5 = {e: 5}.e + {f: 6, g: 7}.f;
823af6ab5fSopenharmony_ci
833af6ab5fSopenharmony_ci    m() {
843af6ab5fSopenharmony_ci        let x = {a:1, b:2};
853af6ab5fSopenharmony_ci        let y = {c:1, d:2, e:3};
863af6ab5fSopenharmony_ci    }
873af6ab5fSopenharmony_ci}
883af6ab5fSopenharmony_ci
893af6ab5fSopenharmony_ci// Object literals as function parameter initializer
903af6ab5fSopenharmony_cifunction funInit(p = { a: 1, b: 2 }) {}
913af6ab5fSopenharmony_cifunction 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
923af6ab5fSopenharmony_ci
933af6ab5fSopenharmony_ci// Object literals inside function declaration
943af6ab5fSopenharmony_cifunction bar(): void {
953af6ab5fSopenharmony_ci    let a = {a: 1, b: 2};
963af6ab5fSopenharmony_ci    let b = {c: 3, d: 4};
973af6ab5fSopenharmony_ci
983af6ab5fSopenharmony_ci    if (a.b > b.c) {
993af6ab5fSopenharmony_ci        let c = {e: 5, f: 6};
1003af6ab5fSopenharmony_ci    }
1013af6ab5fSopenharmony_ci
1023af6ab5fSopenharmony_ci    let d = {g: 7, d: foo({q:1,w:2}.q + {q:3,w:4}.w)};
1033af6ab5fSopenharmony_ci}
1043af6ab5fSopenharmony_ci
1053af6ab5fSopenharmony_ciconst o9 = { 1: '1', '2': 2 };
1063af6ab5fSopenharmony_ciconst o10 = { [3]: 3 }; // Not fixable, computed property value
1073af6ab5fSopenharmony_ciconst o11 = { [o2.hello]: 'world' }; // Not fixable, computed property value
1083af6ab5fSopenharmony_ci
1093af6ab5fSopenharmony_ciconst anyVal: any = 1;
1103af6ab5fSopenharmony_ciconst o12 = { a: anyVal }; // Not fixable, type of property 'a' is not supported
1113af6ab5fSopenharmony_ci
1123af6ab5fSopenharmony_cilet val = 1;
1133af6ab5fSopenharmony_ciconst o13 = { val }; // Not fixable, property is not 'key:value' pair
1143af6ab5fSopenharmony_ciconst o14 = { ...o1 }; // Not fixable, property is not 'key:value' pair
1153af6ab5fSopenharmony_ciconst o15 = { m() {} }; // Not fixable, property is not 'key:value' pair
1163af6ab5fSopenharmony_ci
1173af6ab5fSopenharmony_ciconst o16 = { // Not fixable, property 'c' is initialized with non-fixable nested object literal, and thus will always have unsupported type (object type literal)
1183af6ab5fSopenharmony_ci    a: 1,
1193af6ab5fSopenharmony_ci    b: '2',
1203af6ab5fSopenharmony_ci    c: {
1213af6ab5fSopenharmony_ci        q: 1,
1223af6ab5fSopenharmony_ci        w: 2,
1233af6ab5fSopenharmony_ci        e: anyVal // Not fixable, unsupported type
1243af6ab5fSopenharmony_ci    }
1253af6ab5fSopenharmony_ci}
1263af6ab5fSopenharmony_ci
1273af6ab5fSopenharmony_ciclass X<K> {}
1283af6ab5fSopenharmony_ciclass Y<Q extends X<Q>> {}
1293af6ab5fSopenharmony_cifunction captureFromLocalScope<T>(t: T): void {
1303af6ab5fSopenharmony_ci    let v1 = {a: 1, b: '2', c: t}; // Not fixable, `c` references local type parameter `T`
1313af6ab5fSopenharmony_ci    let v2 = {a: 1, b: '2', c: new X<T>()}; // Not fixable, `c` references local type parameter `T`
1323af6ab5fSopenharmony_ci    let v3 = {a: 1, b: '2', c: new Y<X<T>>()}; // Not fixable, `c` references local type parameter `T`
1333af6ab5fSopenharmony_ci  
1343af6ab5fSopenharmony_ci    type LocalType = {a: number, b: string};
1353af6ab5fSopenharmony_ci    let localTypeVar: LocalType = {a:1, b:'2'};
1363af6ab5fSopenharmony_ci    let v4 = { x: localTypeVar }; // Non-fixable, `x` references type `LocalType` declared in local scope
1373af6ab5fSopenharmony_ci  
1383af6ab5fSopenharmony_ci    class LocalClass {x: number = 1};
1393af6ab5fSopenharmony_ci    let v5 = { y: new LocalClass() }; // Non-fixable, `y` references type `LocalClass` declared in local scope
1403af6ab5fSopenharmony_ci  
1413af6ab5fSopenharmony_ci    let v6 = { z: LocalClass }; // Non-fixable, `z` references type `LocalClass` declared in local scope
1423af6ab5fSopenharmony_ci}
1433af6ab5fSopenharmony_ci
1443af6ab5fSopenharmony_ci// Record object literals
1453af6ab5fSopenharmony_cilet rec1: Record<string, any> = {
1463af6ab5fSopenharmony_ci    a: 1,
1473af6ab5fSopenharmony_ci    b: 2,
1483af6ab5fSopenharmony_ci    c: 3
1493af6ab5fSopenharmony_ci}
1503af6ab5fSopenharmony_ci
1513af6ab5fSopenharmony_cilet rec2: Record<string | number, any> = {
1523af6ab5fSopenharmony_ci    foo: 1,
1533af6ab5fSopenharmony_ci    bar: 2,
1543af6ab5fSopenharmony_ci    10: 'foo',
1553af6ab5fSopenharmony_ci    20: 'bar',
1563af6ab5fSopenharmony_ci    baz: 3,
1573af6ab5fSopenharmony_ci    'daz': 4
1583af6ab5fSopenharmony_ci}
1593af6ab5fSopenharmony_ci
1603af6ab5fSopenharmony_cilet rec3: Record<string | number, any> = { // Not fixable
1613af6ab5fSopenharmony_ci    f1: 1,
1623af6ab5fSopenharmony_ci    f2: 2,
1633af6ab5fSopenharmony_ci    f3: 3,
1643af6ab5fSopenharmony_ci    [val]: 4    // Not fixable, key is a computed value
1653af6ab5fSopenharmony_ci}
1663af6ab5fSopenharmony_ci
1673af6ab5fSopenharmony_ciinterface NullableRecord {
1683af6ab5fSopenharmony_ci    params?: Record<string, string>;
1693af6ab5fSopenharmony_ci}
1703af6ab5fSopenharmony_cilet rec4: NullableRecord = {
1713af6ab5fSopenharmony_ci    params: {
1723af6ab5fSopenharmony_ci        key: '1',
1733af6ab5fSopenharmony_ci        message: '2'
1743af6ab5fSopenharmony_ci    }
1753af6ab5fSopenharmony_ci};