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

// Verify that if an `await` expression appears in a syntactic postion that
// doesn't impose a context on it, it supplies a context of `FutureOr<_>` to its
// operand, rather than `_` (which was the behavior prior to fixing
// https://github.com/dart-lang/language/issues/3648).

// Contexts of `FutureOr<_>` and `_` are difficult to distinguish. This test
// distinguishes them by awaiting the expression `((null as Future<B>?) ??
// (Future.value(C())..expectStaticType<Exactly<Future<C>>>()))`, where `C` is a
// class that extends `B`.
//
// This works because, if it is analyzed in context `Future<_>`, then:
// - The RHS of `??` is analyzed in context `Future<_>`.
// - Therefore downwards inference doesn't impose any constraint on the type
//   parameter of `Future.value(C())`.
// - Therefore `Future.value(C())` gets its type parameter from upwards
//   inference.
// - So it receives a type parameter of `C`.
// - So the static type of `Future.value(C())` is `Future<C>`.
//
// Whereas if it is analyzed in context `_`, then:
// - The static type of the LHS of `??` is used as the context for the RHS.
//   That is, the RHS is analyzed in context `Future<B>?`.
// - Therefore downwards inference constraints the type parameter of
//   `Future.value(C())` to `B`.
// - So the static type of `Future.value(C())` is `Future<B>`.

import '../static_type_helper.dart';

class B {
  var prop;
  void method() {}
}

class C extends B {}

main() async {
  // Initializer part of a C-style for loop
  for (await ((null as Future<B>?) ??
          (Future.value(C())..expectStaticType<Exactly<Future<C>>>()));
      false;) {}

  // Updater part of a C-style for loop
  for (var i = 0;
      i < 1;
      i++,
      await ((null as Future<B>?) ??
          (Future.value(C())..expectStaticType<Exactly<Future<C>>>()))) {}

  // Target of a property set
  (await ((null as Future<B>?) ??
          (Future.value(C())..expectStaticType<Exactly<Future<C>>>())))
      .prop = 0;

  // Target of a property get
  (await ((null as Future<B>?) ??
          (Future.value(C())..expectStaticType<Exactly<Future<C>>>())))
      .prop;

  // Assert statement message
  try {
    assert(
        false,
        await ((null as Future<B>?) ??
            (Future.value(C())..expectStaticType<Exactly<Future<C>>>())));
  } on AssertionError {}

  // Expression statement
  await ((null as Future<B>?) ??
      (Future.value(C())..expectStaticType<Exactly<Future<C>>>()));

  // Interpolation expression
  "${await ((null as Future<B>?) ?? (Future.value(C())..expectStaticType<Exactly<Future<C>>>()))}";

  // Target of a method invocation
  (await ((null as Future<B>?) ??
          (Future.value(C())..expectStaticType<Exactly<Future<C>>>())))
      .method();
}
