| // Copyright (c) 2012, 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.7 |
| |
| import "package:expect/expect.dart"; |
| |
| /*class: A:needsArgs*/ |
| |
| class A<X, Y, Z> { |
| shift() => new A<Z, X, Y>(); |
| |
| swap() => new A<Z, Y, X>(); |
| |
| first() => new A<X, X, X>(); |
| |
| last() => new A<Z, Z, Z>(); |
| |
| wrap() => new A<A<X, X, X>, A<Y, Y, Y>, A<Z, Z, Z>>(); |
| } |
| |
| class B extends A<U, V, W> {} |
| |
| /*class: C:needsArgs*/ |
| |
| class C<T> extends A<U, T, W> {} |
| |
| /*class: D:needsArgs*/ |
| |
| class D<X, Y, Z> extends A<Y, Z, X> {} |
| |
| class U {} |
| |
| class V {} |
| |
| class W {} |
| |
| sameType(a, b) => Expect.equals(a.runtimeType, b.runtimeType); |
| |
| main() { |
| A a = new A<U, V, W>(); |
| sameType(new A<W, U, V>(), a.shift()); |
| sameType(new A<W, V, U>(), a.swap()); |
| sameType(new A<U, U, U>(), a.first()); |
| sameType(new A<W, W, W>(), a.last()); |
| sameType(new A<A<U, U, U>, A<V, V, V>, A<W, W, W>>(), a.wrap()); |
| B b = new B(); |
| sameType(new A<A<U, U, U>, A<V, V, V>, A<W, W, W>>(), b.wrap()); |
| C c = new C<V>(); |
| sameType(new A<A<U, U, U>, A<V, V, V>, A<W, W, W>>(), c.wrap()); |
| D d = new D<U, V, W>(); |
| sameType(new A<A<V, V, V>, A<W, W, W>, A<U, U, U>>(), d.wrap()); |
| } |