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_cifunction assert_n(v: Object | null | undefined) { assert(v === null); } 173af6ab5fSopenharmony_cifunction assert_u(v: Object | null | undefined) { assert(v === undefined); } 183af6ab5fSopenharmony_cifunction assert_o(v: Object | null | undefined) { assert(v !== null && v !== undefined); } 193af6ab5fSopenharmony_cifunction assert_npe(f: () => void) { 203af6ab5fSopenharmony_ci try { 213af6ab5fSopenharmony_ci f(); 223af6ab5fSopenharmony_ci } catch (e: NullPointerError) { 233af6ab5fSopenharmony_ci return; 243af6ab5fSopenharmony_ci } 253af6ab5fSopenharmony_ci assert false : "npe was not thrown"; 263af6ab5fSopenharmony_ci} 273af6ab5fSopenharmony_ci 283af6ab5fSopenharmony_ciclass Link { 293af6ab5fSopenharmony_ci m(): Link { return this; } 303af6ab5fSopenharmony_ci f: Link = this; 313af6ab5fSopenharmony_ci a: Link[] = [(this)]; 323af6ab5fSopenharmony_ci c: () => Link = () => this 333af6ab5fSopenharmony_ci 343af6ab5fSopenharmony_ci om(): Link | null { return this.m() } 353af6ab5fSopenharmony_ci of: Link | null = this.f; 363af6ab5fSopenharmony_ci oa: Link[] | null = this.a; 373af6ab5fSopenharmony_ci oc: (() => Link) | null = this.c; 383af6ab5fSopenharmony_ci 393af6ab5fSopenharmony_ci nm(): Link | null { return null } 403af6ab5fSopenharmony_ci nf: Link | null = null; 413af6ab5fSopenharmony_ci na: Link[] | null = null; 423af6ab5fSopenharmony_ci nc: (() => Link) | null = null; 433af6ab5fSopenharmony_ci 443af6ab5fSopenharmony_ci static noevalFlag = true; 453af6ab5fSopenharmony_ci noeval(): Link { if (Link.noevalFlag) { throw new Error("never evaluated"); } return this; } 463af6ab5fSopenharmony_ci} 473af6ab5fSopenharmony_ci 483af6ab5fSopenharmony_cifunction test1(l: Link | null, nl: Link | null) { 493af6ab5fSopenharmony_ci assert_o(l?.m()); 503af6ab5fSopenharmony_ci assert_o(l?.f); 513af6ab5fSopenharmony_ci assert_o(l?.a[0]); 523af6ab5fSopenharmony_ci assert_o(l?.c()); 533af6ab5fSopenharmony_ci assert_o(l?.of!.f); 543af6ab5fSopenharmony_ci 553af6ab5fSopenharmony_ci assert_u(nl?.m()); 563af6ab5fSopenharmony_ci assert_u(nl?.f); 573af6ab5fSopenharmony_ci assert_u(nl?.a[0]); 583af6ab5fSopenharmony_ci assert_u(nl?.c()); 593af6ab5fSopenharmony_ci assert_u(nl?.of!.f); 603af6ab5fSopenharmony_ci assert_u(nl?.nf!.f); 613af6ab5fSopenharmony_ci 623af6ab5fSopenharmony_ci nl?.m().noeval(); 633af6ab5fSopenharmony_ci nl?.f.noeval(); 643af6ab5fSopenharmony_ci nl?.a[0].noeval(); 653af6ab5fSopenharmony_ci nl?.c().noeval(); 663af6ab5fSopenharmony_ci nl?.of!.f.noeval(); 673af6ab5fSopenharmony_ci assert_npe(() => { nl?.of!.f! }); 683af6ab5fSopenharmony_ci} 693af6ab5fSopenharmony_ci 703af6ab5fSopenharmony_cifunction test2(l: Link | null, nl: Link | null) { 713af6ab5fSopenharmony_ci assert_o(l?.m().f.a[0].c()); 723af6ab5fSopenharmony_ci assert_o(l?.f.m().c().a[0]); 733af6ab5fSopenharmony_ci assert_o(l?.a[0].c().f.m()); 743af6ab5fSopenharmony_ci assert_o(l?.c().m().a[0].f); 753af6ab5fSopenharmony_ci assert_o(l?.c().m().of!.a[0].oc!().f); 763af6ab5fSopenharmony_ci 773af6ab5fSopenharmony_ci assert_u(nl?.m().f.a[0].c()); 783af6ab5fSopenharmony_ci assert_u(nl?.f.m().c().a[0]); 793af6ab5fSopenharmony_ci assert_u(nl?.a[0].c().f.m()); 803af6ab5fSopenharmony_ci assert_u(nl?.c().m().a[0].f); 813af6ab5fSopenharmony_ci assert_u(nl?.c().m().of!.a[0].oc!().f); 823af6ab5fSopenharmony_ci 833af6ab5fSopenharmony_ci nl?.m().f.a[0].c().noeval(); 843af6ab5fSopenharmony_ci nl?.f.m().c().a[0].noeval(); 853af6ab5fSopenharmony_ci nl?.a[0].c().f.m().noeval(); 863af6ab5fSopenharmony_ci nl?.c().m().a[0].f.noeval(); 873af6ab5fSopenharmony_ci nl?.c().m().of!.a[0].oc!().f.noeval(); 883af6ab5fSopenharmony_ci} 893af6ab5fSopenharmony_ci 903af6ab5fSopenharmony_cifunction test3(l: Link | null, nl: Link | null) { 913af6ab5fSopenharmony_ci assert_o(l?.om()?.of?.oa?.[0].oc?.()); 923af6ab5fSopenharmony_ci assert_o(l?.of?.om()?.oc?.().oa?.[0]); 933af6ab5fSopenharmony_ci assert_o(l?.oa?.[0]?.oc?.().of?.om()); 943af6ab5fSopenharmony_ci assert_o(l?.oc?.().om()?.oa?.[0].of); 953af6ab5fSopenharmony_ci assert_o(l?.oc?.().om()?.of!.oa?.[0].oc!().of); 963af6ab5fSopenharmony_ci 973af6ab5fSopenharmony_ci assert_u(nl?.om()?.of?.oa?.[0].oc?.()); 983af6ab5fSopenharmony_ci assert_u(nl?.of?.om()?.oc?.().oa?.[0]); 993af6ab5fSopenharmony_ci assert_u(nl?.oa?.[0]?.oc?.().of?.om()); 1003af6ab5fSopenharmony_ci assert_u(nl?.oc?.().om()?.oa?.[0].of); 1013af6ab5fSopenharmony_ci assert_u(nl?.oc!().om()?.of!.oa![0].oc!().of); 1023af6ab5fSopenharmony_ci 1033af6ab5fSopenharmony_ci nl?.om()?.of?.oa?.[0].oc?.().noeval(); 1043af6ab5fSopenharmony_ci nl?.of?.om()?.oc?.().oa?.[0].noeval(); 1053af6ab5fSopenharmony_ci nl?.oa?.[0]?.oc?.().of?.om()?.noeval(); 1063af6ab5fSopenharmony_ci nl?.oc?.().om()?.oa?.[0].of?.noeval(); 1073af6ab5fSopenharmony_ci nl?.oc?.().om()?.of!.oa?.[0].oc!().of?.noeval(); 1083af6ab5fSopenharmony_ci} 1093af6ab5fSopenharmony_ci 1103af6ab5fSopenharmony_cifunction test4(l: Link | null, nl: Link | null) { 1113af6ab5fSopenharmony_ci assert_npe(() => { nl?.of! }); 1123af6ab5fSopenharmony_ci nl?.of!.f; 1133af6ab5fSopenharmony_ci} 1143af6ab5fSopenharmony_ci 1153af6ab5fSopenharmony_cifunction test5(l: Link | null, nl: Link | null) { 1163af6ab5fSopenharmony_ci l?.f.a[0]?.f.c(); 1173af6ab5fSopenharmony_ci nl?.f.a[0]?.f.c().noeval(); 1183af6ab5fSopenharmony_ci assert_npe(() => { nl?.f.a[0]?.f.c()! }); 1193af6ab5fSopenharmony_ci assert_npe(() => { (nl?.f?.a)?.[0].f! }); 1203af6ab5fSopenharmony_ci assert_u(l?.f.a[0].nf?.a[0].noeval()?.m()); 1213af6ab5fSopenharmony_ci 1223af6ab5fSopenharmony_ci let u: Link | undefined = l?.f.oc?.().na?.[0].noeval().f?.oa?.[0]; 1233af6ab5fSopenharmony_ci} 1243af6ab5fSopenharmony_ci 1253af6ab5fSopenharmony_cifunction main() { 1263af6ab5fSopenharmony_ci test1(new Link(), null) 1273af6ab5fSopenharmony_ci test2(new Link(), null) 1283af6ab5fSopenharmony_ci test3(new Link(), null) 1293af6ab5fSopenharmony_ci test4(new Link(), null) 1303af6ab5fSopenharmony_ci test5(new Link(), null) 1313af6ab5fSopenharmony_ci} 132