1/* 2 * Copyright (c) 2024-2025 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16class A {} 17class B extends A {} 18class Gen<T> {} 19type tmp = (A | null) | null | null; 20type tmp2 = A | null; 21type A_alias = A; 22type NullableA_alias = (A_alias | null) | null; 23 24function main(): void { 25 nullableType(); 26 nullableTypeAlias(); 27 nullableLambda(); 28} 29 30function nullableType(): void { 31 let a : Object | null = null; 32 let b : Object | null = new Object(); 33 let c : Object | null | null = b; 34 let d : (((Object) | null) | null) | null = numericNullableType(); 35 let f : A | null = null; 36 let g : tmp | null = f; 37 let g2 : tmp2 = null; 38 a = f; 39 b = g; 40 g = new A(); 41 42 let generic : Gen<A | null> | null = new Gen<A | null>; 43 44 let h : Char | null = nullableArgsAndReturn(7, g); 45 assertEQ(h, c'C') 46 47 let gt1 : Gen<A | null> | null = nullableGenArgAndReturn(generic); 48 assertEQ(gt1, generic) 49 50 let gt2 = new Gen2<A_alias>(); 51 let gt2_g = gt2.foo(g); 52 53 assertEQ(gt2_g, g) 54 55 let f_g = foo_gen<tmp>(g); 56 57 assertEQ(f_g, g) 58 59 let arr = new long[1024]; 60 a = arr; 61 let narr : int[] | null = null; 62 a = narr; 63} 64 65function nullableArrayType(): void { 66 let arron : (Object | null)[] | null = [1, 2, null]; 67 arron = null; 68} 69 70function nullableTypeAlias(): void { 71 let o : Object; 72 o = new Object(); 73 o = new A(); 74 o = new A_alias(); 75 o = new B(); 76 77 let on : Object | null; 78 on = null; 79 on = new Object(); 80 on = new A(); 81 on = new A_alias(); 82 on = new NullableA_alias(); 83 on = new B(); 84 on = o; 85 86 let an : A | null; 87 an = null; 88 an = new A(); 89 an = new A_alias(); 90 an = new NullableA_alias(); 91 an = new B(); 92 on = an; 93 94 let na : NullableA_alias; 95 na = null; 96 na = new A(); 97 na = new A_alias(); 98 na = new NullableA_alias(); 99 na = new B(); 100 na = an; 101 on = na; 102 103 let bn : B | null; 104 bn = null; 105 bn = new B(); 106 on = bn; 107 an = bn; 108 na = bn; 109} 110 111// example from an older version of the spec 112function numericNullableType(): Object | null { 113 let a: int = 5; 114 let x: Int | null = 5 + a; 115 assertEQ(x, 10) 116 117 let y: Long | null = null; 118 assertEQ(y, null) 119 120 return null; 121} 122 123function nullableArgsAndReturn(arg1 : Int | null | null, args2 : (tmp | null) | null) : Char | null | null { 124 return c'C'; 125} 126 127function nullableGenArgAndReturn(arg : (Gen<A | null>) | null) : Gen<tmp | null> | null { 128 return arg; 129} 130 131class Gen2<T extends A> { 132 private t : T | null = null; 133 public foo(t : T | null) : T | null { 134 this.t = t; 135 136 return this.t; 137 } 138} 139 140function foo_gen<T extends A>(arg : T | null) : T | null { 141 return arg; 142} 143 144function nullableLambda() : void { 145 let y: int = 1; 146 let x: (y : int) => Int | null = (y : int): Int | null => { return null; }; 147 x(y); 148} 149 150function similarParam(a : A) : int { 151 return 1; 152} 153 154function similarParam(a : A | null) : int { 155 return 2; 156} 157