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};