• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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