OLD | NEW |
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 // Verify semantics of the ??= operator, including order of operations, by | 5 // Verify semantics of the ??= operator, including order of operations, by |
6 // keeping track of the operations performed. | 6 // keeping track of the operations performed. |
7 | 7 |
8 import "package:expect/expect.dart"; | 8 import "package:expect/expect.dart"; |
9 import "if_null_assignment_helper.dart" as h; | 9 import "if_null_assignment_helper.dart" as h; |
10 | 10 |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
121 h.operations.add('$s[$index]=$value'); | 121 h.operations.add('$s[$index]=$value'); |
122 } | 122 } |
123 | 123 |
124 final finalOne = 1; | 124 final finalOne = 1; |
125 final finalNull = null; | 125 final finalNull = null; |
126 | 126 |
127 void instanceTest() { | 127 void instanceTest() { |
128 // v ??= e is equivalent to ((x) => x == null ? v = e : x)(v) | 128 // v ??= e is equivalent to ((x) => x == null ? v = e : x)(v) |
129 vGetValue = 1; check(1, () => v ??= bad(), ['$s.v']); //# 01: ok | 129 vGetValue = 1; check(1, () => v ??= bad(), ['$s.v']); //# 01: ok |
130 yGetValue = 1; check(1, () => v ??= y, ['$s.v', 'y', '$s.v=1']); //# 02: ok | 130 yGetValue = 1; check(1, () => v ??= y, ['$s.v', 'y', '$s.v=1']); //# 02: ok |
131 check(1, () => finalOne ??= bad(), []); //# 03: static type warning | 131 finalOne ??= null; //# 03: compile-time error |
132 yGetValue = 1; checkThrows(noMethod, () => finalNull ??= y, ['y']); //# 04:
static type warning | 132 yGetValue = 1; |
133 } | 133 } |
134 } | 134 } |
135 | 135 |
136 class D extends C { | 136 class D extends C { |
137 D(String s) : super(s); | 137 D(String s) : super(s); |
138 | 138 |
139 get v => bad(); | 139 get v => bad(); |
140 | 140 |
141 void set v(value) { | 141 void set v(value) { |
142 bad(); | 142 bad(); |
(...skipping 16 matching lines...) Expand all Loading... |
159 new C('c').instanceTest(); | 159 new C('c').instanceTest(); |
160 new D('d').derivedInstanceTest(); | 160 new D('d').derivedInstanceTest(); |
161 | 161 |
162 // v ??= e is equivalent to ((x) => x == null ? v = e : x)(v) | 162 // v ??= e is equivalent to ((x) => x == null ? v = e : x)(v) |
163 xGetValue = 1; check(1, () => x ??= bad(), ['x']); //# 07: ok | 163 xGetValue = 1; check(1, () => x ??= bad(), ['x']); //# 07: ok |
164 yGetValue = 1; check(1, () => x ??= y, ['x', 'y', 'x=1']); //# 08: ok | 164 yGetValue = 1; check(1, () => x ??= y, ['x', 'y', 'x=1']); //# 08: ok |
165 h.xGetValue = 1; check(1, () => h.x ??= bad(), ['h.x']); //# 09: ok | 165 h.xGetValue = 1; check(1, () => h.x ??= bad(), ['h.x']); //# 09: ok |
166 yGetValue = 1; check(1, () => h.x ??= y, ['h.x', 'y', 'h.x=1']); //# 10: ok | 166 yGetValue = 1; check(1, () => h.x ??= y, ['h.x', 'y', 'h.x=1']); //# 10: ok |
167 { var l = 1; check(1, () => l ??= bad(), []); } //# 11: ok | 167 { var l = 1; check(1, () => l ??= bad(), []); } //# 11: ok |
168 { var l; yGetValue = 1; check(1, () => l ??= y, ['y']); Expect.equals(1, l); }
//# 12: ok | 168 { var l; yGetValue = 1; check(1, () => l ??= y, ['y']); Expect.equals(1, l); }
//# 12: ok |
169 { final l = 1; check(1, () => l ??= bad(), []); } //# 13: static type warning | 169 { final l = 1; l ??= null; } //# 13: compile-time error |
170 { final l = null; yGetValue = 1; checkThrows(noMethod, () => l ??= y, ['y']);
} //# 14: static type warning | 170 C ??= null; //# 15: compile-time error |
171 check(C, () => C ??= bad(), []); //# 15: static type warning | |
172 h ??= null; //# 29: compile-time error | 171 h ??= null; //# 29: compile-time error |
173 h[0] ??= null; //# 30: compile-time error | 172 h[0] ??= null; //# 30: compile-time error |
174 | 173 |
175 // C.v ??= e is equivalent to ((x) => x == null ? C.v = e : x)(C.v) | 174 // C.v ??= e is equivalent to ((x) => x == null ? C.v = e : x)(C.v) |
176 C.xGetValue = 1; check(1, () => C.x ??= bad(), ['C.x']); //# 16: ok | 175 C.xGetValue = 1; check(1, () => C.x ??= bad(), ['C.x']); //# 16: ok |
177 yGetValue = 1; check(1, () => C.x ??= y, ['C.x', 'y', 'C.x=1']); //# 17: ok | 176 yGetValue = 1; check(1, () => C.x ??= y, ['C.x', 'y', 'C.x=1']); //# 17: ok |
178 h.C.xGetValue = 1; check(1, () => h.C.x ??= bad(), ['h.C.x']); //# 18: ok | 177 h.C.xGetValue = 1; check(1, () => h.C.x ??= bad(), ['h.C.x']); //# 18: ok |
179 yGetValue = 1; check(1, () => h.C.x ??= y, ['h.C.x', 'y', 'h.C.x=1']); //# 19:
ok | 178 yGetValue = 1; check(1, () => h.C.x ??= y, ['h.C.x', 'y', 'h.C.x=1']); //# 19:
ok |
180 | 179 |
181 // e1.v ??= e2 is equivalent to | 180 // e1.v ??= e2 is equivalent to |
(...skipping 24 matching lines...) Expand all Loading... |
206 // C?.v ??= e2 is equivalent to C.v ??= e2. | 205 // C?.v ??= e2 is equivalent to C.v ??= e2. |
207 C.xGetValue = 1; // //# 29: ok | 206 C.xGetValue = 1; // //# 29: ok |
208 check(1, () => C?.x ??= bad(), ['C.x']); //# 29: continued | 207 check(1, () => C?.x ??= bad(), ['C.x']); //# 29: continued |
209 h.C.xgetValue = 1; // //# 30: ok | 208 h.C.xgetValue = 1; // //# 30: ok |
210 check(1, () => h.c?.x ??= bad(), ['h.C.x']); //# 30: continued | 209 check(1, () => h.c?.x ??= bad(), ['h.C.x']); //# 30: continued |
211 yGetValue = 1; // //# 31: ok | 210 yGetValue = 1; // //# 31: ok |
212 check(1, () => C?.x ??= y, ['C.x', 'y', 'C.x=1']); //# 31: continued | 211 check(1, () => C?.x ??= y, ['C.x', 'y', 'C.x=1']); //# 31: continued |
213 yGetValue = 1; // //# 32: ok | 212 yGetValue = 1; // //# 32: ok |
214 check(1, () => h.C?.x ??= y, ['h.C.x', 'y', 'h.C.x=1']); //# 32: continued | 213 check(1, () => h.C?.x ??= y, ['h.C.x', 'y', 'h.C.x=1']); //# 32: continued |
215 } | 214 } |
OLD | NEW |