blob: 608b3d58f5258adf908a474a5b6b2c7d78537856 [file] [log] [blame] [edit]
// Copyright (c) 2025, 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 '../static_type_helper.dart';
class A {} // Distance from the top type: 2 (Object? -> Object -> A).
class B1 {} // Distance from the top type: 2.
class B2 extends B1 {} // Distance from the top type: 3.
mixin M1 {} // Distance from the top type: 2.
mixin M2 implements B2 {} // Distance from the top type: 4.
mixin M3 {} // Distance from the top type: 2.
// The following class hierarchy is synthesized:
//
// - Object.
// - Distance from the top type: 1.
// - A extends Object.
// - Distance from the top type: 2.
// - _C&A&M1 extends A implements M1 (anonymous mixin application).
// - Distance from the top type: 3.
// - _C&A&M1&M2 extends _C&A&M1 implements M2 (anonymous).
// - Distance from the top type: 5.
// - _Note that M2 is of distance 4 from the top type._
// - C extends _C&A&M1&M2 implements M3 (named mixin application).
// - Distance from the top type: 6.
class C1 = A with M1, M2, M3;
class C2 extends C1 {} // Distance from the top type: 7.
class D1 {} // Distance from the top type: 2.
class D2 extends D1 {} // Distance from the top type: 3.
class D3 extends D2 {} // Distance from the top type: 4.
class D4 extends D3 {} // Distance from the top type: 5.
class D5 extends D4 {} // Distance from the top type: 6.
class D6 extends D5 {} // Distance from the top type: 7.
class E extends C2 implements D6 {}
class F extends C2 implements D6 {}
test(bool b, E e, F f) {
// Both E and F have two immediate supertypes, C2 and D6, of equal distance 7
// from the top type. The UP algorithm for interface types rejects both of
// them and tries the types closer to the top. The next two types in the
// supertype chain are C1 and D5, which are of equals distance 6 from the top
// type. Going higher up in the supertype chains, the anonymous mixin
// application _C&A&M1&M2 is compared against D4, but anonymous mixin
// applications are ignored as potential candidates for the outcome of UP, so
// D4 will be chosen.
var ef = b ? e : f;
ef.expectStaticType<Exactly<D4>>();
}
main() {}