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

// This test contains a test case for each condition that can lead to the front
// end's `NullableMethodCallError`, for which we wish to report "why not
// promoted" context information.

class C {
  int? i;
  void Function()? f;
}

extension on int {
  get propertyOnNonNullInt => null;
  void methodOnNonNullInt() {}
}

extension on int? {
  get propertyOnNullableInt => null;
  void methodOnNullableInt() {}
}

property_get_of_variable(int? i, int? j) {
  if (i == null) return;
  /*cfe.update: explicitWrite*/ /*analyzer.explicitWrite*/ i = j;
  i. /*notPromoted(explicitWrite)*/ isEven;
}

extension_property_get_of_variable(int? i, int? j) {
  if (i == null) return;
  /*cfe.update: explicitWrite*/ /*analyzer.explicitWrite*/ i = j;
  i.propertyOnNullableInt;
  i.
      /*cfe.invoke: notPromoted(explicitWrite)*/
      /*analyzer.notPromoted(explicitWrite)*/
      propertyOnNonNullInt;
}

property_get_of_expression(C c) {
  if (c.i == null) return;
  c.i. /*notPromoted(propertyNotPromoted(member:C.i))*/ isEven;
}

extension_property_get_of_expression(C c) {
  if (c.i == null) return;
  c.i.propertyOnNullableInt;
  c
      .i
      .
      /*cfe.invoke: notPromoted(propertyNotPromoted(member:C.i))*/
      /*analyzer.notPromoted(propertyNotPromoted(member:C.i))*/
      propertyOnNonNullInt;
}

method_invocation(C c) {
  if (c.i == null) return;
  c.i
      .
      /*cfe.invoke: notPromoted(propertyNotPromoted(member:C.i))*/
      /*analyzer.notPromoted(propertyNotPromoted(member:C.i))*/
      abs();
}

extension_method_invocation(C c) {
  if (c.i == null) return;
  c.i.methodOnNullableInt();
  c.i
      .
      /*cfe.invoke: notPromoted(propertyNotPromoted(member:C.i))*/
      /*analyzer.notPromoted(propertyNotPromoted(member:C.i))*/
      methodOnNonNullInt();
}

call_invocation(C c) {
  if (c.f == null) return;
  c.f
      .
      /*cfe.invoke: notPromoted(propertyNotPromoted(member:C.f))*/
      /*analyzer.notPromoted(propertyNotPromoted(member:C.f))*/
      call();
}
