13af6ab5fSopenharmony_ci/* 23af6ab5fSopenharmony_ci * Copyright (c) 2022-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_ciimport { 173af6ab5fSopenharmony_ci OhosLibC, 183af6ab5fSopenharmony_ci OhosLibI, 193af6ab5fSopenharmony_ci OhosLibIC, 203af6ab5fSopenharmony_ci OhosLibII, 213af6ab5fSopenharmony_ci OhosLibCC, 223af6ab5fSopenharmony_ci OhosLibCI 233af6ab5fSopenharmony_ci} from './oh_modules/ohos_lib' 243af6ab5fSopenharmony_ci 253af6ab5fSopenharmony_ciimport { 263af6ab5fSopenharmony_ci DynLibC, 273af6ab5fSopenharmony_ci DynLibI, 283af6ab5fSopenharmony_ci DynLibIC, 293af6ab5fSopenharmony_ci DynLibII, 303af6ab5fSopenharmony_ci DynLibCC, 313af6ab5fSopenharmony_ci DynLibCI 323af6ab5fSopenharmony_ci} from './dynamic_lib' 333af6ab5fSopenharmony_ci 343af6ab5fSopenharmony_ciimport type { lang } from './@arkts.lang'; 353af6ab5fSopenharmony_ci 363af6ab5fSopenharmony_ciclass A { 373af6ab5fSopenharmony_ci getName(): string { return 'A'; } 383af6ab5fSopenharmony_ci getType(): string { return 'class'; } 393af6ab5fSopenharmony_ci} 403af6ab5fSopenharmony_ciclass B { 413af6ab5fSopenharmony_ci getName(): string { return 'B'; } 423af6ab5fSopenharmony_ci getType(): string { return 'type'; } 433af6ab5fSopenharmony_ci} 443af6ab5fSopenharmony_cifunction foo(a1: A, ...a2: A[]): void { 453af6ab5fSopenharmony_ci} 463af6ab5fSopenharmony_cifoo(new B, new A, new B); 473af6ab5fSopenharmony_ci 483af6ab5fSopenharmony_cilet a = new A; 493af6ab5fSopenharmony_cia = new B; 503af6ab5fSopenharmony_ci 513af6ab5fSopenharmony_cilet b: B = new A; 523af6ab5fSopenharmony_ci 533af6ab5fSopenharmony_cifunction bar(bArr: B[]): void { 543af6ab5fSopenharmony_ci bArr[0] = new A; 553af6ab5fSopenharmony_ci} 563af6ab5fSopenharmony_ci 573af6ab5fSopenharmony_cilet name = (new B as A).getName(); 583af6ab5fSopenharmony_ci 593af6ab5fSopenharmony_ciclass C extends B { 603af6ab5fSopenharmony_ci getBase(): string { return 'B'; } 613af6ab5fSopenharmony_ci} 623af6ab5fSopenharmony_ci 633af6ab5fSopenharmony_cifunction goo(): B { 643af6ab5fSopenharmony_ci return new B; 653af6ab5fSopenharmony_ci} 663af6ab5fSopenharmony_cilet cl: C = goo() as C; 673af6ab5fSopenharmony_ci 683af6ab5fSopenharmony_cifunction zoo(b: B): void { 693af6ab5fSopenharmony_ci} 703af6ab5fSopenharmony_cizoo(cl as B); 713af6ab5fSopenharmony_ci 723af6ab5fSopenharmony_ciclass IdentLibC {} 733af6ab5fSopenharmony_ciinterface IdentLibI {} 743af6ab5fSopenharmony_ciinterface IdentLibII extends IdentLibI {} 753af6ab5fSopenharmony_ciclass IdentLibCC extends IdentLibC {} 763af6ab5fSopenharmony_ciclass IdentLibCI implements IdentLibI {} 773af6ab5fSopenharmony_ci 783af6ab5fSopenharmony_cifunction fC(a: IdentLibC) {} 793af6ab5fSopenharmony_cifunction fI(a: IdentLibI) {} 803af6ab5fSopenharmony_ci 813af6ab5fSopenharmony_cifunction fDC(a: DynLibC) {} 823af6ab5fSopenharmony_cifunction fDI(a: DynLibI) {} 833af6ab5fSopenharmony_ci 843af6ab5fSopenharmony_cifunction fOC(a: OhosLibC) {} 853af6ab5fSopenharmony_cifunction fOI(a: OhosLibI) {} 863af6ab5fSopenharmony_ci 873af6ab5fSopenharmony_ciconst c: IdentLibC = {}; 883af6ab5fSopenharmony_ciconst i: IdentLibI = {}; 893af6ab5fSopenharmony_ciconst ci: IdentLibCI = {}; 903af6ab5fSopenharmony_ciconst cc: IdentLibCC = {}; 913af6ab5fSopenharmony_ciconst ii: IdentLibII = {}; 923af6ab5fSopenharmony_ci 933af6ab5fSopenharmony_ciconst dc: DynLibC = {}; 943af6ab5fSopenharmony_ciconst di: DynLibI = {}; 953af6ab5fSopenharmony_ciconst dci: DynLibCI = {}; 963af6ab5fSopenharmony_ciconst dcc: DynLibCC = {}; 973af6ab5fSopenharmony_ciconst dii: DynLibII = {}; 983af6ab5fSopenharmony_ciconst dic: DynLibIC = {}; 993af6ab5fSopenharmony_ci 1003af6ab5fSopenharmony_ciconst oc: OhosLibC = {}; 1013af6ab5fSopenharmony_ciconst oi: OhosLibI = {}; 1023af6ab5fSopenharmony_ciconst oci: OhosLibCI = {}; 1033af6ab5fSopenharmony_ciconst occ: OhosLibCC = {}; 1043af6ab5fSopenharmony_ciconst oii: OhosLibII = {}; 1053af6ab5fSopenharmony_ciconst oic: OhosLibIC = {}; 1063af6ab5fSopenharmony_ci 1073af6ab5fSopenharmony_cifC(c); // OK 1083af6ab5fSopenharmony_cifC(i); // ERR, no inheritance relation 1093af6ab5fSopenharmony_cifC(ci); // ERR, no inheritance relation 1103af6ab5fSopenharmony_cifC(cc); // OK 1113af6ab5fSopenharmony_cifC(ii); // ERR, no inheritance relation 1123af6ab5fSopenharmony_cifI(c); // ERR, no inheritance relation 1133af6ab5fSopenharmony_cifI(i); // OK 1143af6ab5fSopenharmony_cifI(ci); // OK 1153af6ab5fSopenharmony_cifI(cc); // ERR, no inheritance relation 1163af6ab5fSopenharmony_cifI(ii); // OK 1173af6ab5fSopenharmony_cifDC(c); // OK, assignment to dynamic 1183af6ab5fSopenharmony_cifDC(i); // OK, assignment to dynamic 1193af6ab5fSopenharmony_cifDC(ci); // OK, assignment to dynamic 1203af6ab5fSopenharmony_cifDC(cc); // OK, assignment to dynamic 1213af6ab5fSopenharmony_cifDC(ii); // OK, assignment to dynamic 1223af6ab5fSopenharmony_cifDI(c); // OK, assignment to dynamic 1233af6ab5fSopenharmony_cifDI(i); // OK, assignment to dynamic 1243af6ab5fSopenharmony_cifDI(ci); // OK, assignment to dynamic 1253af6ab5fSopenharmony_cifDI(cc); // OK, assignment to dynamic 1263af6ab5fSopenharmony_cifDI(ii); // OK, assignment to dynamic 1273af6ab5fSopenharmony_cifOC(c); // OK, assignment to dynamic 1283af6ab5fSopenharmony_cifOC(i); // OK, assignment to dynamic 1293af6ab5fSopenharmony_cifOC(ci); // OK, assignment to dynamic 1303af6ab5fSopenharmony_cifOC(cc); // OK, assignment to dynamic 1313af6ab5fSopenharmony_cifOC(ii); // OK, assignment to dynamic 1323af6ab5fSopenharmony_cifOI(c); // OK, assignment to dynamic 1333af6ab5fSopenharmony_cifOI(i); // OK, assignment to dynamic 1343af6ab5fSopenharmony_cifOI(ci); // OK, assignment to dynamic 1353af6ab5fSopenharmony_cifOI(cc); // OK, assignment to dynamic 1363af6ab5fSopenharmony_cifOI(ii); // OK, assignment to dynamic 1373af6ab5fSopenharmony_ci 1383af6ab5fSopenharmony_cifC(dc); // ERR, no inheritance relation 1393af6ab5fSopenharmony_cifC(di); // ERR, no inheritance relation 1403af6ab5fSopenharmony_cifC(dci); // ERR, no inheritance relation 1413af6ab5fSopenharmony_cifC(dcc); // ERR, no inheritance relation 1423af6ab5fSopenharmony_cifC(dii); // ERR, no inheritance relation 1433af6ab5fSopenharmony_cifC(dic); // ERR, no inheritance relation 1443af6ab5fSopenharmony_cifI(dc); // ERR, no inheritance relation 1453af6ab5fSopenharmony_cifI(di); // ERR, no inheritance relation 1463af6ab5fSopenharmony_cifI(dci); // ERR, no inheritance relation 1473af6ab5fSopenharmony_cifI(dcc); // ERR, no inheritance relation 1483af6ab5fSopenharmony_cifI(dii); // ERR, no inheritance relation 1493af6ab5fSopenharmony_cifI(dic); // ERR, no inheritance relation 1503af6ab5fSopenharmony_cifDC(dc); // OK, assignment to dynamic 1513af6ab5fSopenharmony_cifDC(di); // OK, assignment to dynamic 1523af6ab5fSopenharmony_cifDC(dci); // OK, assignment to dynamic 1533af6ab5fSopenharmony_cifDC(dcc); // OK, assignment to dynamic 1543af6ab5fSopenharmony_cifDC(dii); // OK, assignment to dynamic 1553af6ab5fSopenharmony_cifDC(dic); // OK, assignment to dynamic 1563af6ab5fSopenharmony_cifDI(dc); // OK, assignment to dynamic 1573af6ab5fSopenharmony_cifDI(di); // OK, assignment to dynamic 1583af6ab5fSopenharmony_cifDI(dci); // OK, assignment to dynamic 1593af6ab5fSopenharmony_cifDI(dcc); // OK, assignment to dynamic 1603af6ab5fSopenharmony_cifDI(dii); // OK, assignment to dynamic 1613af6ab5fSopenharmony_cifDI(dic); // OK, assignment to dynamic 1623af6ab5fSopenharmony_cifOC(dc); // OK, assignment to dynamic 1633af6ab5fSopenharmony_cifOC(di); // OK, assignment to dynamic 1643af6ab5fSopenharmony_cifOC(dci); // OK, assignment to dynamic 1653af6ab5fSopenharmony_cifOC(dcc); // OK, assignment to dynamic 1663af6ab5fSopenharmony_cifOC(dii); // OK, assignment to dynamic 1673af6ab5fSopenharmony_cifOC(dic); // OK, assignment to dynamic 1683af6ab5fSopenharmony_cifOI(dc); // OK, assignment to dynamic 1693af6ab5fSopenharmony_cifOI(di); // OK, assignment to dynamic 1703af6ab5fSopenharmony_cifOI(dci); // OK, assignment to dynamic 1713af6ab5fSopenharmony_cifOI(dcc); // OK, assignment to dynamic 1723af6ab5fSopenharmony_cifOI(dii); // OK, assignment to dynamic 1733af6ab5fSopenharmony_cifOI(dic); // OK, assignment to dynamic 1743af6ab5fSopenharmony_ci 1753af6ab5fSopenharmony_cifC(oc); // ERR, no inheritance relation 1763af6ab5fSopenharmony_cifC(oi); // ERR, no inheritance relation 1773af6ab5fSopenharmony_cifC(oci); // ERR, no inheritance relation 1783af6ab5fSopenharmony_cifC(occ); // ERR, no inheritance relation 1793af6ab5fSopenharmony_cifC(oii); // ERR, no inheritance relation 1803af6ab5fSopenharmony_cifC(oic); // ERR, no inheritance relation 1813af6ab5fSopenharmony_cifI(oc); // ERR, no inheritance relation 1823af6ab5fSopenharmony_cifI(oi); // ERR, no inheritance relation 1833af6ab5fSopenharmony_cifI(oci); // ERR, no inheritance relation 1843af6ab5fSopenharmony_cifI(occ); // ERR, no inheritance relation 1853af6ab5fSopenharmony_cifI(oii); // ERR, no inheritance relation 1863af6ab5fSopenharmony_cifI(oic); // ERR, no inheritance relation 1873af6ab5fSopenharmony_cifDC(oc); // OK, assignment to dynamic 1883af6ab5fSopenharmony_cifDC(oi); // OK, assignment to dynamic 1893af6ab5fSopenharmony_cifDC(oci); // OK, assignment to dynamic 1903af6ab5fSopenharmony_cifDC(occ); // OK, assignment to dynamic 1913af6ab5fSopenharmony_cifDC(oii); // OK, assignment to dynamic 1923af6ab5fSopenharmony_cifDC(oic); // OK, assignment to dynamic 1933af6ab5fSopenharmony_cifDI(oc); // OK, assignment to dynamic 1943af6ab5fSopenharmony_cifDI(oi); // OK, assignment to dynamic 1953af6ab5fSopenharmony_cifDI(oci); // OK, assignment to dynamic 1963af6ab5fSopenharmony_cifDI(occ); // OK, assignment to dynamic 1973af6ab5fSopenharmony_cifDI(oii); // OK, assignment to dynamic 1983af6ab5fSopenharmony_cifDI(oic); // OK, assignment to dynamic 1993af6ab5fSopenharmony_cifOC(oc); // OK, assignment to dynamic 2003af6ab5fSopenharmony_cifOC(oi); // OK, assignment to dynamic 2013af6ab5fSopenharmony_cifOC(oci); // OK, assignment to dynamic 2023af6ab5fSopenharmony_cifOC(occ); // OK, assignment to dynamic 2033af6ab5fSopenharmony_cifOC(oii); // OK, assignment to dynamic 2043af6ab5fSopenharmony_cifOC(oic); // OK, assignment to dynamic 2053af6ab5fSopenharmony_cifOI(oc); // OK, assignment to dynamic 2063af6ab5fSopenharmony_cifOI(oi); // OK, assignment to dynamic 2073af6ab5fSopenharmony_cifOI(oci); // OK, assignment to dynamic 2083af6ab5fSopenharmony_cifOI(occ); // OK, assignment to dynamic 2093af6ab5fSopenharmony_cifOI(oii); // OK, assignment to dynamic 2103af6ab5fSopenharmony_cifOI(oic); // OK, assignment to dynamic 2113af6ab5fSopenharmony_ci 2123af6ab5fSopenharmony_ci// Structural typing is now relaxed for 'as' expression, all cases are OK 2133af6ab5fSopenharmony_cic as IdentLibC; 2143af6ab5fSopenharmony_cii as IdentLibC; 2153af6ab5fSopenharmony_cici as IdentLibC; 2163af6ab5fSopenharmony_cicc as IdentLibC; 2173af6ab5fSopenharmony_ciii as IdentLibC; 2183af6ab5fSopenharmony_cic as IdentLibI; 2193af6ab5fSopenharmony_cii as IdentLibI; 2203af6ab5fSopenharmony_cici as IdentLibI; 2213af6ab5fSopenharmony_cicc as IdentLibI; 2223af6ab5fSopenharmony_ciii as IdentLibI; 2233af6ab5fSopenharmony_cic as DynLibC; 2243af6ab5fSopenharmony_cii as DynLibC; 2253af6ab5fSopenharmony_cici as DynLibC; 2263af6ab5fSopenharmony_cicc as DynLibC; 2273af6ab5fSopenharmony_ciii as DynLibC; 2283af6ab5fSopenharmony_cic as DynLibI; 2293af6ab5fSopenharmony_cii as DynLibI; 2303af6ab5fSopenharmony_cici as DynLibI; 2313af6ab5fSopenharmony_cicc as DynLibI; 2323af6ab5fSopenharmony_ciii as DynLibI; 2333af6ab5fSopenharmony_cic as OhosLibC; 2343af6ab5fSopenharmony_cii as OhosLibC; 2353af6ab5fSopenharmony_cici as OhosLibC; 2363af6ab5fSopenharmony_cicc as OhosLibC; 2373af6ab5fSopenharmony_ciii as OhosLibC; 2383af6ab5fSopenharmony_cic as OhosLibI; 2393af6ab5fSopenharmony_cii as OhosLibI; 2403af6ab5fSopenharmony_cici as OhosLibI; 2413af6ab5fSopenharmony_cicc as OhosLibI; 2423af6ab5fSopenharmony_ciii as OhosLibI; 2433af6ab5fSopenharmony_ci 2443af6ab5fSopenharmony_cidc as IdentLibC; 2453af6ab5fSopenharmony_cidi as IdentLibC; 2463af6ab5fSopenharmony_cidci as IdentLibC; 2473af6ab5fSopenharmony_cidcc as IdentLibC; 2483af6ab5fSopenharmony_cidii as IdentLibC; 2493af6ab5fSopenharmony_cidic as IdentLibC; 2503af6ab5fSopenharmony_cidc as IdentLibI; 2513af6ab5fSopenharmony_cidi as IdentLibI; 2523af6ab5fSopenharmony_cidci as IdentLibI; 2533af6ab5fSopenharmony_cidcc as IdentLibI; 2543af6ab5fSopenharmony_cidii as IdentLibI; 2553af6ab5fSopenharmony_cidic as IdentLibI; 2563af6ab5fSopenharmony_cidc as DynLibC; 2573af6ab5fSopenharmony_cidi as DynLibC; 2583af6ab5fSopenharmony_cidci as DynLibC; 2593af6ab5fSopenharmony_cidcc as DynLibC; 2603af6ab5fSopenharmony_cidii as DynLibC; 2613af6ab5fSopenharmony_cidic as DynLibC; 2623af6ab5fSopenharmony_cidc as DynLibI; 2633af6ab5fSopenharmony_cidi as DynLibI; 2643af6ab5fSopenharmony_cidci as DynLibI; 2653af6ab5fSopenharmony_cidcc as DynLibI; 2663af6ab5fSopenharmony_cidii as DynLibI; 2673af6ab5fSopenharmony_cidic as DynLibI; 2683af6ab5fSopenharmony_cidc as OhosLibC; 2693af6ab5fSopenharmony_cidi as OhosLibC; 2703af6ab5fSopenharmony_cidci as OhosLibC; 2713af6ab5fSopenharmony_cidcc as OhosLibC; 2723af6ab5fSopenharmony_cidii as OhosLibC; 2733af6ab5fSopenharmony_cidic as OhosLibC; 2743af6ab5fSopenharmony_cidc as OhosLibI; 2753af6ab5fSopenharmony_cidi as OhosLibI; 2763af6ab5fSopenharmony_cidci as OhosLibI; 2773af6ab5fSopenharmony_cidcc as OhosLibI; 2783af6ab5fSopenharmony_cidii as OhosLibI; 2793af6ab5fSopenharmony_cidic as OhosLibI; 2803af6ab5fSopenharmony_ci 2813af6ab5fSopenharmony_cioc as IdentLibC; 2823af6ab5fSopenharmony_cioi as IdentLibC; 2833af6ab5fSopenharmony_cioci as IdentLibC; 2843af6ab5fSopenharmony_ciocc as IdentLibC; 2853af6ab5fSopenharmony_cioii as IdentLibC; 2863af6ab5fSopenharmony_cioic as IdentLibC; 2873af6ab5fSopenharmony_cioc as IdentLibI; 2883af6ab5fSopenharmony_cioi as IdentLibI; 2893af6ab5fSopenharmony_cioci as IdentLibI; 2903af6ab5fSopenharmony_ciocc as IdentLibI; 2913af6ab5fSopenharmony_cioii as IdentLibI; 2923af6ab5fSopenharmony_cioic as IdentLibI; 2933af6ab5fSopenharmony_cioc as DynLibC; 2943af6ab5fSopenharmony_cioi as DynLibC; 2953af6ab5fSopenharmony_cioci as DynLibC; 2963af6ab5fSopenharmony_ciocc as DynLibC; 2973af6ab5fSopenharmony_cioii as DynLibC; 2983af6ab5fSopenharmony_cioic as DynLibC; 2993af6ab5fSopenharmony_cioc as DynLibI; 3003af6ab5fSopenharmony_cioi as DynLibI; 3013af6ab5fSopenharmony_cioci as DynLibI; 3023af6ab5fSopenharmony_ciocc as DynLibI; 3033af6ab5fSopenharmony_cioii as DynLibI; 3043af6ab5fSopenharmony_cioic as DynLibI; 3053af6ab5fSopenharmony_cioc as OhosLibC; 3063af6ab5fSopenharmony_cioi as OhosLibC; 3073af6ab5fSopenharmony_cioci as OhosLibC; 3083af6ab5fSopenharmony_ciocc as OhosLibC; 3093af6ab5fSopenharmony_cioii as OhosLibC; 3103af6ab5fSopenharmony_cioic as OhosLibC; 3113af6ab5fSopenharmony_cioc as OhosLibI; 3123af6ab5fSopenharmony_cioi as OhosLibI; 3133af6ab5fSopenharmony_cioci as OhosLibI; 3143af6ab5fSopenharmony_ciocc as OhosLibI; 3153af6ab5fSopenharmony_cioii as OhosLibI; 3163af6ab5fSopenharmony_cioic as OhosLibI; 3173af6ab5fSopenharmony_ci 3183af6ab5fSopenharmony_ciclass Ct { 3193af6ab5fSopenharmony_ci a: number = 1 3203af6ab5fSopenharmony_ci b: string = "" 3213af6ab5fSopenharmony_ci} 3223af6ab5fSopenharmony_ci 3233af6ab5fSopenharmony_ciinterface I { 3243af6ab5fSopenharmony_ci a: number 3253af6ab5fSopenharmony_ci} 3263af6ab5fSopenharmony_ci 3273af6ab5fSopenharmony_ciclass Cz { 3283af6ab5fSopenharmony_ci x: Ct | null = new Ct(); 3293af6ab5fSopenharmony_ci y: I = this.x as I 3303af6ab5fSopenharmony_ci} 3313af6ab5fSopenharmony_ci 3323af6ab5fSopenharmony_cilet x: Ct | null = new Ct(); 3333af6ab5fSopenharmony_cilet y: I = x as I 3343af6ab5fSopenharmony_ci 3353af6ab5fSopenharmony_ciclass X {} 3363af6ab5fSopenharmony_ciclass Y {} 3373af6ab5fSopenharmony_ciclass Z {} 3383af6ab5fSopenharmony_ciclass W extends X {} 3393af6ab5fSopenharmony_ci 3403af6ab5fSopenharmony_cifunction union(x: X, xy: X | Y, xz: X | Z, xyz: X | Y | Z, w: W, xw: X | W, zw: Z | W) { 3413af6ab5fSopenharmony_ci x = xy; // ERR, 'X | Y' assigned to 'X' 3423af6ab5fSopenharmony_ci xy = x; // OK 3433af6ab5fSopenharmony_ci 3443af6ab5fSopenharmony_ci xy = xz; // ERR, 'X | Z' assigned to 'X | Y' 3453af6ab5fSopenharmony_ci xz = xy; // ERR, 'X | Y' assigned to 'X | Z' 3463af6ab5fSopenharmony_ci 3473af6ab5fSopenharmony_ci xyz = xz; // OK 3483af6ab5fSopenharmony_ci xz = xyz; // ERR, 'X | Y | Z' assigned to 'X | Z' 3493af6ab5fSopenharmony_ci 3503af6ab5fSopenharmony_ci x = w; // OK 3513af6ab5fSopenharmony_ci w = x; // ERR, 'X' assigned to 'W' 3523af6ab5fSopenharmony_ci 3533af6ab5fSopenharmony_ci x = xw; // OK 3543af6ab5fSopenharmony_ci xw = x; // OK 3553af6ab5fSopenharmony_ci 3563af6ab5fSopenharmony_ci xw = zw; // ERR, 'Z | W' assigned to 'X | W' 3573af6ab5fSopenharmony_ci zw = xw; // ERR, 'X | W' assigned to 'Z | W' 3583af6ab5fSopenharmony_ci 3593af6ab5fSopenharmony_ci xz = zw; // OK 3603af6ab5fSopenharmony_ci zw = xz; // ERR, 'X | Z' assigned to 'Z | W' 3613af6ab5fSopenharmony_ci} 3623af6ab5fSopenharmony_ci 3633af6ab5fSopenharmony_ciclass C0 {} 3643af6ab5fSopenharmony_ciclass C1 {} 3653af6ab5fSopenharmony_ciclass C2<T> {} 3663af6ab5fSopenharmony_ci 3673af6ab5fSopenharmony_citype U1 = number | string | boolean; 3683af6ab5fSopenharmony_citype U2 = number[] | string[] | boolean[]; 3693af6ab5fSopenharmony_citype U3 = C1 | C2<number> | C2<string>; 3703af6ab5fSopenharmony_citype U4 = C1[] | C2<number>[] | C2<string>[]; 3713af6ab5fSopenharmony_ci 3723af6ab5fSopenharmony_cifunction testUnionStructuralIdentityNegative(u1: U1, u2: U2, u3: U3, u4: U4) { 3733af6ab5fSopenharmony_ci // no CTE expected 3743af6ab5fSopenharmony_ci u1 as number; 3753af6ab5fSopenharmony_ci u1 as string; 3763af6ab5fSopenharmony_ci u1 as boolean; 3773af6ab5fSopenharmony_ci 3783af6ab5fSopenharmony_ci u1 as number | string; 3793af6ab5fSopenharmony_ci u1 as number | boolean; 3803af6ab5fSopenharmony_ci u1 as string | boolean; 3813af6ab5fSopenharmony_ci 3823af6ab5fSopenharmony_ci u1 as number | string | boolean; 3833af6ab5fSopenharmony_ci u1 as boolean | number | string; 3843af6ab5fSopenharmony_ci u1 as U1; 3853af6ab5fSopenharmony_ci 3863af6ab5fSopenharmony_ci // no CTE expected 3873af6ab5fSopenharmony_ci u2 as number[]; 3883af6ab5fSopenharmony_ci u2 as string[]; 3893af6ab5fSopenharmony_ci u2 as boolean[]; 3903af6ab5fSopenharmony_ci 3913af6ab5fSopenharmony_ci u2 as number[] | string[]; 3923af6ab5fSopenharmony_ci u2 as number[] | boolean[]; 3933af6ab5fSopenharmony_ci u2 as string[] | boolean[]; 3943af6ab5fSopenharmony_ci 3953af6ab5fSopenharmony_ci u2 as number[] | string[] | boolean[]; 3963af6ab5fSopenharmony_ci u2 as boolean[] | number[] | string[]; 3973af6ab5fSopenharmony_ci u2 as U2; 3983af6ab5fSopenharmony_ci 3993af6ab5fSopenharmony_ci // no CTE expected 4003af6ab5fSopenharmony_ci u3 as C1; 4013af6ab5fSopenharmony_ci u3 as C2<number>; 4023af6ab5fSopenharmony_ci u3 as C2<string>; 4033af6ab5fSopenharmony_ci 4043af6ab5fSopenharmony_ci u3 as C1 | C2<number>; 4053af6ab5fSopenharmony_ci u3 as C1 | C2<string>; 4063af6ab5fSopenharmony_ci u3 as C2<number> | C2<string>; 4073af6ab5fSopenharmony_ci 4083af6ab5fSopenharmony_ci u3 as C1 | C2<number> | C2<string>; 4093af6ab5fSopenharmony_ci u3 as C2<string> | C2<number> | C1; 4103af6ab5fSopenharmony_ci u3 as U3; 4113af6ab5fSopenharmony_ci 4123af6ab5fSopenharmony_ci // no CTE expected 4133af6ab5fSopenharmony_ci u4 as C1[]; 4143af6ab5fSopenharmony_ci u4 as C2<number>[]; 4153af6ab5fSopenharmony_ci u4 as C2<string>[]; 4163af6ab5fSopenharmony_ci 4173af6ab5fSopenharmony_ci u4 as C1[] | C2<number>[]; 4183af6ab5fSopenharmony_ci u4 as C1[] | C2<string>[]; 4193af6ab5fSopenharmony_ci u4 as C2<number>[] | C2<string>[]; 4203af6ab5fSopenharmony_ci 4213af6ab5fSopenharmony_ci u4 as C1[] | C2<number>[] | C2<string>[]; 4223af6ab5fSopenharmony_ci u4 as C2<string>[] | C2<number>[] | C1[]; 4233af6ab5fSopenharmony_ci u4 as U4; 4243af6ab5fSopenharmony_ci} 4253af6ab5fSopenharmony_ci 4263af6ab5fSopenharmony_cifunction testUnionStructuralIdentityPositive(u1: U1, u2: U2, u3: U3, u4: U4) { 4273af6ab5fSopenharmony_ci u1 as Number; 4283af6ab5fSopenharmony_ci u1 as String; 4293af6ab5fSopenharmony_ci u1 as Boolean; 4303af6ab5fSopenharmony_ci 4313af6ab5fSopenharmony_ci u1 as Number | String; 4323af6ab5fSopenharmony_ci u1 as Number | Boolean; 4333af6ab5fSopenharmony_ci u1 as String | Boolean; 4343af6ab5fSopenharmony_ci 4353af6ab5fSopenharmony_ci u1 as Number | String | Boolean; 4363af6ab5fSopenharmony_ci u1 as Boolean | Number | String; 4373af6ab5fSopenharmony_ci u1 as U1 | U2; 4383af6ab5fSopenharmony_ci 4393af6ab5fSopenharmony_ci u2 as Number[]; 4403af6ab5fSopenharmony_ci u2 as String[]; 4413af6ab5fSopenharmony_ci u2 as Boolean[]; 4423af6ab5fSopenharmony_ci 4433af6ab5fSopenharmony_ci u2 as Number[] | String[]; 4443af6ab5fSopenharmony_ci u2 as Number[] | Boolean[]; 4453af6ab5fSopenharmony_ci u2 as String[] | Boolean[]; 4463af6ab5fSopenharmony_ci 4473af6ab5fSopenharmony_ci u2 as Number[] | String[] | Boolean[]; 4483af6ab5fSopenharmony_ci u2 as Boolean[] | Number[] | String[]; 4493af6ab5fSopenharmony_ci u2 as U2 | U1; 4503af6ab5fSopenharmony_ci 4513af6ab5fSopenharmony_ci u3 as C1 | C0; 4523af6ab5fSopenharmony_ci u3 as C2<boolean>; 4533af6ab5fSopenharmony_ci u3 as C2<C1>; 4543af6ab5fSopenharmony_ci 4553af6ab5fSopenharmony_ci u3 as C1 | C2<number> | C2<string> | C0; 4563af6ab5fSopenharmony_ci u3 as C1 | C2<string> | number; 4573af6ab5fSopenharmony_ci u3 as C2<number> | C2<string> | C2<boolean>; 4583af6ab5fSopenharmony_ci 4593af6ab5fSopenharmony_ci u3 as C1 | C2<number> | C2<boolean>; 4603af6ab5fSopenharmony_ci u3 as C2<string> | C2<number> | C0; 4613af6ab5fSopenharmony_ci u3 as U3 | U4; 4623af6ab5fSopenharmony_ci 4633af6ab5fSopenharmony_ci u3 as C1[] | C0[]; 4643af6ab5fSopenharmony_ci u3 as C2<boolean>[]; 4653af6ab5fSopenharmony_ci u3 as C2<C1>[]; 4663af6ab5fSopenharmony_ci 4673af6ab5fSopenharmony_ci u3 as C1[] | C2<number>[] | C2<string>[] | C0[]; 4683af6ab5fSopenharmony_ci u3 as C1[] | C2<string>[] | undefined[]; 4693af6ab5fSopenharmony_ci u3 as C2<number>[] | C2<string>[] | C2<boolean>[]; 4703af6ab5fSopenharmony_ci 4713af6ab5fSopenharmony_ci u3 as C1[] | C2<number>[] | C2<string>[]; 4723af6ab5fSopenharmony_ci u3 as C2<string>[] | C2<number>[] | C0[]; 4733af6ab5fSopenharmony_ci u3 as U3 | U4; 4743af6ab5fSopenharmony_ci} 4753af6ab5fSopenharmony_ci 4763af6ab5fSopenharmony_ci 4773af6ab5fSopenharmony_ci/** 4783af6ab5fSopenharmony_ci * Add the Sendable exception to the [arks-no-struct_typing] rule. 4793af6ab5fSopenharmony_ci */ 4803af6ab5fSopenharmony_ci@Sendable 4813af6ab5fSopenharmony_ciclass TC1 implements lang.ISendable { 4823af6ab5fSopenharmony_ci name:string = 'tc1'; 4833af6ab5fSopenharmony_ci} 4843af6ab5fSopenharmony_ci 4853af6ab5fSopenharmony_ci@Sendable 4863af6ab5fSopenharmony_ciclass TC2 { 4873af6ab5fSopenharmony_ci name:string = 'tc2'; 4883af6ab5fSopenharmony_ci} 4893af6ab5fSopenharmony_ci 4903af6ab5fSopenharmony_ciclass TC3 { 4913af6ab5fSopenharmony_ci name:string = 'tc3'; 4923af6ab5fSopenharmony_ci} 4933af6ab5fSopenharmony_ciconst t1 = new TC1(); 4943af6ab5fSopenharmony_ciconst t2 = new TC2(); 4953af6ab5fSopenharmony_ciconst t3 = new TC3(); 4963af6ab5fSopenharmony_ci 4973af6ab5fSopenharmony_ci 4983af6ab5fSopenharmony_ci// Appears on SyntaxKind.VariableDeclaration node 4993af6ab5fSopenharmony_ciconst a1: lang.ISendable = t1; // OK 5003af6ab5fSopenharmony_ciconst a2: lang.ISendable = t2; // OK , Sendable can be thought of as implement ISendable 5013af6ab5fSopenharmony_ciconst a3: lang.ISendable = t2 as lang.ISendable; // OK 5023af6ab5fSopenharmony_ciconst a4: lang.ISendable = t3; // ERROR 5033af6ab5fSopenharmony_ciconst a5: lang.ISendable = t3 as lang.ISendable; // ERROR 5043af6ab5fSopenharmony_ci 5053af6ab5fSopenharmony_ci 5063af6ab5fSopenharmony_ci// Appears on SyntaxKind.BinaryExpression node 5073af6ab5fSopenharmony_cilet b1:lang.ISendable; 5083af6ab5fSopenharmony_cib1 = t1; // OK 5093af6ab5fSopenharmony_cib1 = t2; // OK , Sendable can be thought of as implement ISendable 5103af6ab5fSopenharmony_cib1 = t2 as lang.ISendable; // OK 5113af6ab5fSopenharmony_cib1 = t3; // ERROR 5123af6ab5fSopenharmony_cib1 = t3 as lang.ISendable; // ERROR 5133af6ab5fSopenharmony_ci 5143af6ab5fSopenharmony_ci 5153af6ab5fSopenharmony_ci// Appears on SyntaxKind.CallExpression node 5163af6ab5fSopenharmony_cifunction cf(value: lang.ISendable):void {} 5173af6ab5fSopenharmony_cicf(t1); // OK 5183af6ab5fSopenharmony_cicf(t2); // OK , Sendable can be thought of as implement ISendable 5193af6ab5fSopenharmony_cicf(t2 as lang.ISendable); // OK 5203af6ab5fSopenharmony_cicf(t3); // ERROR 5213af6ab5fSopenharmony_cicf(t3 as lang.ISendable); // ERROR 5223af6ab5fSopenharmony_ci 5233af6ab5fSopenharmony_cifunction cfT<T>(value: T):void {} 5243af6ab5fSopenharmony_cicfT<lang.ISendable>(t1); // OK 5253af6ab5fSopenharmony_cicfT<lang.ISendable>(t2); // OK , Sendable can be thought of as implement ISendable 5263af6ab5fSopenharmony_cicfT<lang.ISendable>(t2 as lang.ISendable); // OK 5273af6ab5fSopenharmony_cicfT<lang.ISendable>(t3); // ERROR 5283af6ab5fSopenharmony_cicfT<lang.ISendable>(t3 as lang.ISendable); // ERROR 5293af6ab5fSopenharmony_ci 5303af6ab5fSopenharmony_ci 5313af6ab5fSopenharmony_ci// Appears on SyntaxKind.handleNewExpression node 5323af6ab5fSopenharmony_ciclass DC1 { 5333af6ab5fSopenharmony_ci name:string; 5343af6ab5fSopenharmony_ci 5353af6ab5fSopenharmony_ci constructor(value:lang.ISendable) { 5363af6ab5fSopenharmony_ci this.name = value.name; 5373af6ab5fSopenharmony_ci } 5383af6ab5fSopenharmony_ci} 5393af6ab5fSopenharmony_cinew DC1(t1); // OK 5403af6ab5fSopenharmony_cinew DC1(t2); // OK , Sendable can be thought of as implement ISendable 5413af6ab5fSopenharmony_cinew DC1(t2 as lang.ISendable); // OK 5423af6ab5fSopenharmony_cinew DC1(t3); // ERROR 5433af6ab5fSopenharmony_cinew DC1(t3 as lang.ISendable); // ERROR 5443af6ab5fSopenharmony_ci 5453af6ab5fSopenharmony_ci 5463af6ab5fSopenharmony_ci// Appears on SyntaxKind.ObjectLiteralExpression/SyntaxKind.ArrayLiteralExpression node 5473af6ab5fSopenharmony_ciinterface EI1 { 5483af6ab5fSopenharmony_ci sendable: lang.ISendable; 5493af6ab5fSopenharmony_ci} 5503af6ab5fSopenharmony_ciconst e1: EI1 = { sendable:t1 }; // OK 5513af6ab5fSopenharmony_ciconst e2: EI1 = { sendable:t2 }; // OK , Sendable can be thought of as implement ISendable, avoid [arkts-no-untyped-obj-literals] rule 5523af6ab5fSopenharmony_ciconst e3: EI1 = { sendable:t2 as lang.ISendable }; // OK 5533af6ab5fSopenharmony_ciconst e4: EI1 = { sendable:t3 }; // ERROR 5543af6ab5fSopenharmony_ciconst e5: EI1 = { sendable:t3 as lang.ISendable }; // ERROR 5553af6ab5fSopenharmony_ciconst e1s: EI1[] = [{ sendable:t1 }]; // OK 5563af6ab5fSopenharmony_ciconst e2s: EI1[] = [{ sendable:t2 }]; // OK , Sendable can be thought of as implement ISendable. avoid [arkts-no-untyped-obj-literals] rule 5573af6ab5fSopenharmony_ciconst e3s: EI1[] = [{ sendable:t2 as lang.ISendable }]; // OK 5583af6ab5fSopenharmony_ciconst e4s: EI1[] = [{ sendable:t3 }]; // ERROR 5593af6ab5fSopenharmony_ciconst e5s: EI1[] = [{ sendable:t3 as lang.ISendable }]; // ERROR 5603af6ab5fSopenharmony_ci 5613af6ab5fSopenharmony_ci// // Appears on SyntaxKind.PropertyDeclaration node 5623af6ab5fSopenharmony_ci// PropertyDeclaration does not do [arkts-no-structural-typing] check 5633af6ab5fSopenharmony_ci// export class FC1 { 5643af6ab5fSopenharmony_ci// prop1: lang.ISendable = t1; // OK 5653af6ab5fSopenharmony_ci// prop2: lang.ISendable = t2; // OK 5663af6ab5fSopenharmony_ci// prop3: lang.ISendable = t3; // OK 5673af6ab5fSopenharmony_ci// } 5683af6ab5fSopenharmony_ci 5693af6ab5fSopenharmony_ci 5703af6ab5fSopenharmony_ci// union 5713af6ab5fSopenharmony_ciclass GC1 { } 5723af6ab5fSopenharmony_cifunction ff1(value: lang.ISendable):void {} 5733af6ab5fSopenharmony_cifunction ff2(value: lang.ISendable | GC1):void {} 5743af6ab5fSopenharmony_cifunction ff3(value: TC1 | TC2): void { ff1(value); } // OK , Sendable can be thought of as implement ISendable 5753af6ab5fSopenharmony_cifunction ff4(value: TC1 | TC3): void { ff1(value); } // ERROR 5763af6ab5fSopenharmony_cifunction ff5(value: TC1): void { ff2(value); } // OK 5773af6ab5fSopenharmony_cifunction ff6(value: TC2): void { ff2(value); } // OK , Sendable can be thought of as implement ISendable 5783af6ab5fSopenharmony_cifunction ff7(value: TC3): void { ff2(value); } // ERROR 5793af6ab5fSopenharmony_cifunction ff8(value: TC1 | TC2): void { ff2(value); } // OK , Sendable can be thought of as implement ISendable 5803af6ab5fSopenharmony_cifunction ff9(value: TC1 | TC3): void { ff2(value); } // ERROR 5813af6ab5fSopenharmony_ci 582