// Copyright (c) 2019, 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

/// @assertion If two or more extensions apply to the same member access, or if a
/// member of the receiver type takes precedence over an extension method, or if
/// the extension is imported with a prefix, then it is possible to force an
/// extension member invocation:
///
///   MyList(object).quickSort();
///
/// or if you don't want the type argument to the extension to be inferred:
///
///   MyList<String>(object).quickSort();
///
/// or if you imported the extension with a prefix to avoid name collision:
///
/// prefix.MyList<String>(object).quickSort();
///
/// The syntax looks like a constructor invocation, but it does not create a new
/// object.
///
/// If [object.quickSort()] would invoke an extension method of [MyList] if
/// [MyList] was the only extension in scope, then [MyList(object).quickSort()]
/// will invoke the exact same method in the same way.
///
/// @description Check that if several extensions can be applied to the same
/// member access, it's possible to force an extension member invocation if a
/// member of the receiver type takes precedence over an extension method
/// @author iarkh@unipro.ru

import "../../Utils/expect.dart";

class C<T> {}

class X {}
class Y extends X {}
class Z extends Y {}

extension Ext<T> on C<T> {
  dynamic get getType => T;
}


main() {
  C c = C();
  C<X> x = C<X>();
  C<Y> y = C<Y>();
  C<Z> z = C<Z>();

  Expect.equals(dynamic, Ext(c).getType);

  Expect.equals(X, Ext(x).getType);
  Expect.equals(Object, Ext<Object>(x).getType);
  Expect.equals(X, Ext<X>(x).getType);

  Expect.equals(Y, Ext(y).getType);
  Expect.equals(Object, Ext<Object>(y).getType);
  Expect.equals(X, Ext<X>(y).getType);
  Expect.equals(Y, Ext<Y>(y).getType);

  Expect.equals(Z, Ext(z).getType);
  Expect.equals(Object, Ext<Object>(z).getType);
  Expect.equals(X, Ext<X>(z).getType);
  Expect.equals(Y, Ext<Y>(z).getType);
  Expect.equals(Z, Ext<Z>(z).getType);
}
