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