blob: 432870ff3e90de879b470dabf060f4bb9f88ed44 [file] [log] [blame] [edit]
// Copyright (c) 2024, 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.
/// @assertion If more than one extension applies to a specific member
/// invocation, then we resort to a heuristic to choose one of the extensions to
/// apply. If exactly one of them is "more specific" than all the others, that
/// one is chosen. Otherwise it is a compile-time error.
///
/// An extension with [on] type clause [T1] is more specific than another
/// extension with [on] type clause [T2] iff
///
/// 1. The latter extension is declared in a platform library, and the former
/// extension is not
/// 2. they are both declared in platform libraries or both declared in
/// non-platform libraries, and
/// 3. the instantiated type (the type after applying type inference from the
/// receiver) of [T1] is a subtype of the instantiated type of [T2] and
/// either
/// 4. not vice versa, or
/// 5. the instantiate-to-bounds type of [T1] is a subtype of the
/// instantiate-to-bounds type of [T2] and not vice versa.
///
/// @description Check that it does not give rise to an ambiguity error at the
/// call site if two extensions add static and instance methods with the same
/// name
/// @author sgrekhov22@gmail.com
/// @issue 55848
import '../../Utils/expect.dart';
class C {}
extension Ext1 on C {
static String foo() => "Ext1";
String baz() => "Ext1";
}
extension Ext2 on C {
String foo() => "Ext2";
static String baz() => "Ext2";
}
main() {
Expect.equals("Ext1", Ext1.foo());
Expect.equals("Ext1", C().baz());
Expect.equals("Ext2", C().foo());
Expect.equals("Ext2", Ext2.baz());
}