| // 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 various invalid super-constraints for mixin declarations. |
| |
| abstract class UnaryNum { |
| num foo(num x); |
| } |
| |
| // Overides must still be valid, wrt. signatures and types. |
| |
| mixin M3 on UnaryNum { |
| // M3.foo is a valid override of UnaryNum.foo |
| num foo(num x) => super.foo(x) * 2; |
| } |
| |
| // Invalid signature override (overriding optional parameter with required). |
| class C3 implements UnaryNum { |
| // C3.foo is a valid override of UnaryNum.foo |
| num foo([num x]) => x ?? 17; |
| } |
| // M3.foo is not a valid override for C3.foo. |
| class A3 extends C3 // |
| with M3 //# 06: compile-time error |
| {} |
| |
| // Invalid type override (overriding `int` return with `num` return). |
| class C4 implements UnaryNum { |
| // C4.foo is a valid override of UnaryNum.foo |
| int foo(num x) => x.toInt(); |
| } |
| // M3.foo is not a valid override for C4.foo. |
| class A4 extends C4 // |
| with M3 //# 07: compile-time error |
| {} |
| |
| // It's not required to have an implementation of members which are not super- |
| // invoked, if the application class is abstract. |
| abstract class C5 { |
| num foo(num x); |
| num bar(num x); |
| } |
| mixin M5 on C5 { |
| num baz(num x) => super.foo(x); |
| } |
| abstract class C5Foo implements C5 { |
| num foo(num x) => x; |
| } |
| abstract class C5Bar implements C5 { |
| num bar(num x) => x; |
| } |
| |
| // Valid abstract class, super-invocation of foo hits implementation, |
| // even if bar is still abstract. |
| abstract class A5Foo = C5Foo with M5; |
| // Invalid since super-invocaton of foo does not hit concrete implementation. |
| abstract class _ = C5Bar with M5; //# 08: compile-time error |
| |
| class A5FooConcrete = A5Foo with C5Bar; |
| |
| main() { |
| Expect.equals(42, A5FooConcrete().baz(42)); |
| } |