| 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 |