| // 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"; |
| |
| import "implicit_new_prefix_constructor_test.dart" as prefix; |
| |
| // Test that an omitted `new` is allowed for a non-generic class. |
| |
| class C { |
| final Object x; |
| C(this.x); // Not const constructor. |
| const C.c(this.x); // Const constructor. |
| |
| operator <(other) => this; |
| operator >(other) => other; |
| operator -() => this; |
| |
| C get self => this; |
| C method() => self; |
| } |
| |
| T id<T>(T x) => x; |
| |
| main() { |
| const cc = const C.c(42); // Canonicalized. |
| |
| var c0 = new prefix.C(42); // Original syntax. |
| |
| // Uses of `prefix.C(42)` in various contexts. |
| var c1 = prefix.C(42); |
| var c2 = [prefix.C(42)][0]; |
| var c3 = {prefix.C(42): 0}.keys.first; |
| var c4 = {0: prefix.C(42)}.values.first; |
| var c5 = id(prefix.C(42)); |
| var c6 = prefix.C(42).self; |
| var c7 = prefix.C(42).method(); |
| var c8 = C(prefix.C(42)).x; |
| var c9 = -prefix.C(42); |
| var c10 = prefix.C(42) < 9; |
| var c11 = C(null) > prefix.C(42); |
| var c12 = (c10 == c11) ? null : prefix.C(42); |
| var c13 = prefix.C(42)..method(); |
| var c14; |
| try { |
| throw prefix.C(42); |
| } catch (e) { |
| c14 = e; |
| } |
| Expect.isNotNull(c12); |
| |
| switch (prefix.C(42)) { |
| case cc: |
| Expect.fail("Should not be const"); |
| break; |
| default: |
| // Success. |
| } |
| |
| for (prefix.C(42); false; prefix.C(42), prefix.C(42)) { |
| Expect.fail("Unreachable"); |
| } |
| |
| var values = [ |
| cc, |
| c0, |
| c1, |
| c2, |
| c3, |
| c4, |
| c5, |
| c6, |
| c7, |
| c8, |
| c9, |
| c10, |
| c11, |
| c12, |
| c13, |
| c14 |
| ]; |
| Expect.allDistinct(values); // Non of them create constants. |
| for (var value in values) { |
| Expect.isTrue(value is C); |
| Expect.equals(42, (value as C).x); |
| } |
| } |