| // 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. | |
| import "package:expect/expect.dart"; | |
| // Test that constructor invocations are constant | |
| // when evaluated in a const context. | |
| class C { | |
| final Object x; | |
| const C(this.x); | |
| // Static const. | |
| static const staticConst = C(42); | |
| } | |
| // Top-level const. | |
| const topConst = C(42); | |
| main() { | |
| const c0 = const C(42); // Explicit const. | |
| // RHS of const local variable. | |
| const c1 = C(42); | |
| // Inside const expression. | |
| var c2 = (const [C(42)])[0]; // List element. | |
| var c3 = (const {C(42): 0}).keys.first; // Map key. | |
| var c4 = (const {0: C(42)}).values.first; // Map value. | |
| var c5 = (const C(C(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 parenthesized const expression. | |
| switch (c0) { | |
| case const (C(42)): | |
| break; | |
| default: | |
| Expect.fail("Didn't match constant"); | |
| } | |
| // Annotation argument. | |
| // (Cannot check that it's const, just that it's accepted). | |
| @C(C(42)) | |
| var foo = null; | |
| foo; // avoid "unused" hints. | |
| } |