// Copyright (c) 2021, 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 When inferring the super-constructor invocation, s, targeting the
/// super constructor D, we include the implicit super-parameters from the
/// constructor parameter list:
///
/// The super-constructor invocation s infers a super-constructor invocation s’
/// such that
/// ...
/// For each super parameter p in C, in source order, where p has parameter name
/// n, (inferred or declared) type T, associated super-constructor parameter q,
/// and where S is the type of the parameter q:
///
/// Let xn be an identifier for then name n. As an expression, xn denotes the
/// final variable introduced into the initializer list scope by p.
/// Then s’ has an argument following the previously mentioned arguments:
/// xn if p is positional, or
/// xn: xn if q is named.
///
/// @description Check that super-constructor invocation has correct parameters
/// @author sgrekhov@unipro.ru

// SharedOptions=--enable-experiment=super-parameters

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

class S<T> {
  S(num n, {T? t}) {
    Expect.equals(1, n);
    Expect.equals("42", t);
  }
  S.named(T t, {num n = 0}) {
    Expect.equals(1, n);
    Expect.equals("42", t);
  }
}

class C<T> extends S<T> {
  C.constr1(super.n, String s, {super.t});
  C.constr2(int i, super.n, String s, {super.t}) : super();
  C.constr3(int i, super.t, String s, {super.n}) : super.named();
}

main() {
  C.constr1(1, "Lily was here", t: "42");
  C.constr2(1, 1, "Lily was here", t: "42");
  C.constr3(1, "42", "Lily was here", n: 1);
}
