| // Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| // @dart = 2.9 |
| |
| import "package:expect/expect.dart"; |
| |
| // Test that list literals are constant when evaluated in a const context. |
| |
| class C { |
| final Object x; |
| const C(this.x); |
| |
| // Static const. |
| static const staticConst = <int>[42]; |
| } |
| |
| // Top-level const. |
| const topConst = <int>[42]; |
| |
| main() { |
| const c0 = const <int>[42]; // Explicit const. |
| |
| // RHS of const local variable. |
| const c1 = <int>[42]; |
| |
| // Inside const expression. |
| var c2 = (const [ |
| <int>[42] |
| ])[0]; // List element. |
| var c3 = (const { |
| <int>[42]: 0 |
| }) |
| .keys |
| .first; // Map key. |
| var c4 = (const { |
| 0: <int>[42] |
| }) |
| .values |
| .first; // Map value. |
| var c5 = (const C(<int>[42])).x; // Constructor argument. |
| |
| Expect.identical(c0, c1); |
| Expect.identical(c0, c2); |
| Expect.identical(c0, c3); |
| Expect.identical(c0, c4); |
| Expect.identical(c0, c5); |
| Expect.identical(c0, C.staticConst); |
| Expect.identical(c0, topConst); |
| |
| // Switch case expression. |
| switch (c0) { |
| case <int>[42]: |
| break; |
| default: |
| Expect.fail("Didn't match constant"); |
| } |
| |
| // Annotation argument. |
| // (Cannot check that it's const, just that it's accepted). |
| @C(<int>[42]) |
| var foo = null; |
| foo; // avoid "unused" hints. |
| } |