| // Copyright (c) 2023, 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. |
| |
| // Tests that a mixin's `on` clause is properly accounted for when determining |
| // whether field promotion should be inhibited due to a `noSuchMethod` |
| // forwarder. |
| |
| import "../static_type_helper.dart"; |
| |
| mixin M on C {} |
| |
| class C { |
| final int? _f1; |
| C(this._f1); |
| } |
| |
| class D implements M { |
| @override |
| noSuchMethod(_) => 0; |
| } |
| |
| class E extends C { |
| final int? _f2; |
| E(this._f2) : super(_f2); |
| } |
| |
| testOnClauseAffectsInterface(E e) { |
| // The presence of the clause `on C` in the declaration of `mixin M` means |
| // that `M` contains a getter named `_f1` in its interface. Consequently, |
| // class `D` will have a `noSuchMethod` forwarder for `_f1`, defeating |
| // promotion for `E._f1`. |
| if (e._f1 != null) { |
| e._f1.expectStaticType<Exactly<int?>>; |
| } |
| } |
| |
| testBasicPromotion(E e) { |
| // Since the above test checks that field promotion *fails*, if we've made a |
| // mistake causing field promotion to be completely disabled in this file, the |
| // test will continue to pass. So to verify that we haven't made such a |
| // mistake, verify that field promotion works under ordinary circumstances. |
| if (e._f2 != null) { |
| e._f2.expectStaticType<Exactly<int>>; |
| } |
| } |
| |
| main() { |
| for (var e in [E(null), E(0)]) { |
| testOnClauseAffectsInterface(e); |
| testBasicPromotion(e); |
| } |
| } |