// 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 An extension application is an expression of the form E(expr) or
/// E<typeArgs>(expr) where E denotes an extension declaration (that is, E a
/// simple or qualified identifier which refers to the extension declaration).
///
/// An extension application is subject to static type inference. If E is an
/// extension declared as extension E<X...> on T {...}, then the type inference
/// for an extension application is done exactly the same as it would be for the
/// same syntax considered as a constructor invocation on a class declared as:
///
///  class E<X...> {
///    final T $target;
///    E(this.$target);
///  }
/// with no context type for the constructor invocation.
///
/// @description Check that an extension application is subject to static type
/// inference
/// @author sgrekhov@unipro.ru



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

class A {
  String name = "My name is A";
}

class C extends A {
  String name = "My name is C";
}

extension ExtendedA on A {
  String checkme() => this.name;
}

extension ExtendedC on C {
  String checkme() => this.name;
}

main() {
  A a = A();
  C c = C();
  dynamic ac = new C();
  Expect.equals("My name is A", ExtendedA(a).checkme());
  Expect.equals("My name is C", ExtendedC(c).checkme());
  Expect.equals("My name is C", ExtendedC(ac).checkme());
}
