/* * Copyright (c) 2024 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ @Sendable class SC1 {}; class NC1 {}; @Sendable class SC2 {}; class NC2 {}; @Sendable class SCT1 {}; class NCT1 {}; @Sendable class SCT2 {}; class NCT2 {}; const sc1:SC1 = new SC1(); const nc1:NC1 = new NC1(); const sc2:SC2 = new SC2(); const nc2:NC2 = new NC2(); const sct1:SCT1 = new SCT1(); const nct1:NCT1 = new NCT1(); const sct2:SCT2 = new SCT2(); const nct2:NCT2 = new NCT2(); type TSS = SCT1 | SCT2; type TSN = SCT1 | NCT1; let a1: SC1 = new NC1(); // ERROR a1 = new NC1();// ERROR function handle(p: SC1):void{}; handle(new NC1());// ERROR class Main1 { constructor(param:SC1) {}; } new Main1(new NC1());// ERROR interface IProxy {map: SC1;}; const proxy: IProxy = {map: new NC1()};// ERROR const proxies: IProxy[] = [{map: new NC1()}];// ERROR let b1: SC1 = new SC1(); // OK let b2: SC1 = new NC1(); // ERROR let b3: SCT1 = new SCT1(); // OK let b4: SCT1 = new NCT1(); // ERROR let b5: SC1 | NC1 = new SC1(); // OK let b6: SC1 | NC1 = new SC2(); // ERROR let b7: SC1 | NC1 = new NC1(); // OK let b8: SC1 | NC1 = new NC2(); // ERROR let b9: SC1 | NC1 = 1 ? new SC1() : new NC1(); // OK let b10: SC1 | NC1 = 1 ? new SC1() : new NC2(); // ERROR let b11: SC1 | NC1 = 1 ? new SC2() : new NC1(); // ERROR let b12: SC1 | NC1 = 1 ? new SC2() : new NC2(); // ERROR let b13: TSS = new SCT1(); // OK let b14: TSS = new SCT2(); // OK let b15: TSS = new NCT1(); // ERROR let b16: TSS = new NCT2(); // ERROR let b17: TSS = 1 ? new SCT1() : new NCT1(); // ERROR let b18: TSS = 1 ? new SCT1() : new NCT2(); // ERROR let b19: TSS = 1 ? new SCT2() : new NCT1(); // ERROR let b20: TSS = 1 ? new SCT2() : new NCT2(); // ERROR // For compatibility, if both sendable, no strict check let b21: SCT1 = new SCT2();// OK let b22: TSN = new SCT1(); // OK let b23: TSN = new SCT2(); // OK let b24: TSN = new NCT1(); // OK let b25: TSN = new NCT2(); // OK let b26: TSN = 1 ? new SCT1() : new NCT1(); // OK let b27: TSN = 1 ? new SCT1() : new NCT2(); // OK let b28: TSN = 1 ? new SCT2() : new NCT1(); // OK let b29: TSN = 1 ? new SCT2() : new NCT2(); // OK // add check in PropertyDeclaration class Main { p1: SC1 = new SC1(); // OK p2: SC1 = new NC1(); // ERROR p3: SCT1 = new SCT1(); // OK p4: SCT1 = new NCT1(); // ERROR p5: SC1 | NC1 = new SC1(); // OK p6: SC1 | NC1 = new SC2(); // OK p7: SC1 | NC1 = new NC1(); // OK p8: SC1 | NC1 = new NC2(); // OK p9: SC1 | NC1 = 1 ? new SC1() : new NC1(); // OK p10: SC1 | NC1 = 1 ? new SC1() : new NC2(); // OK p11: SC1 | NC1 = 1 ? new SC2() : new NC1(); // OK p12: SC1 | NC1 = 1 ? new SC2() : new NC2(); // OK p13: TSS = new SCT1(); // OK p14: TSS = new SCT2(); // OK p15: TSS = new NCT1(); // ERROR p16: TSS = new NCT2(); // ERROR p17: TSS = 1 ? new SCT1() : new NCT1(); // ERROR p18: TSS = 1 ? new SCT1() : new NCT2(); // ERROR p19: TSS = 1 ? new SCT2() : new NCT1(); // ERROR p20: TSS = 1 ? new SCT2() : new NCT2(); // ERROR } // add check in ArrayLiteralExpression const l1: [SC1] = [sc1]; // OK const l2: [SC1] = [nc1]; // ERROR const l3: SC1[] = [sc1]; // OK const l4: SC1[] = [nc1]; // ERROR const l5: SCT1[] = [sct1]; // OK const l6: SCT1[] = [nct1]; // ERROR const l7: (SC1 | NC1)[] = [ sc1, // OK sc2, // OK nc1, // OK nc2, // OK 1 ? sc1 : nc1, // OK 1 ? sc1 : nc2, // OK 1 ? sc2 : nc1, // OK 1 ? sc2 : nc2 // OK ]; const l8: TSS[] = [ sct1, // OK sct2, // OK nct1, // ERROR nct2, // ERROR 1 ? sct1 : nct1, // ERROR 1 ? sct1 : nct2, // ERROR 1 ? sct2 : nct1, // ERROR 1 ? sct2 : nct2 // ERROR ]; // add check in ReturnStatement function f1(): SC1 { if(1) return new NC1(); // ERROR return new SC1(); // OK } function f2(): SCT1 { if(1) return new NCT1(); // ERROR return new SCT1(); // OK } function f3():(SC1 | NC1) { if(1) return new SC1(); // OK if(1) return new SC2(); // OK if(1) return new NC1(); // OK if(1) return new NC2(); // OK if(1) return 1 ? new SC1() : new NC1(); // OK if(1) return 1 ? new SC1() : new NC2(); // OK if(1) return 1 ? new SC2() : new NC1(); // OK if(1) return 1 ? new SC2() : new NC2(); // OK return new SC1(); // OK } function f4():(TSS) { if(1) return new SCT1(); // OK if(1) return new SCT2(); // OK if(1) return new NCT1(); // ERROR if(1) return new NCT2(); // ERROR if(1) return 1 ? new SCT1() : new NCT1(); // ERROR if(1) return 1 ? new SCT1() : new NCT2(); // ERROR if(1) return 1 ? new SCT2() : new NCT1(); // ERROR if(1) return 1 ? new SCT2() : new NCT2(); // ERROR return new SCT1(); // OK }