// 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.

/// @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);
}
