// Copyright (c) 2015, 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 semantics of the ?. operator when it appears on the LHS of an
// assignment.

import "package:expect/expect.dart";
import "conditional_access_helper.dart" as h;

bad() {
  Expect.fail('Should not be executed');
}

class B {}

class C extends B {
  num v;
  C(this.v);
  static late int staticInt;
}

class D {
  E v;
  D(this.v);
  static late E staticE;
}

class E {
  G operator +(int i) => new I();
}

class F {}

class G extends E implements F {}

class H {}

class I extends G implements H {}

C? nullC() => null;

main() {
  // e1?.v = e2 is equivalent to ((x) => x == null ? null : x.v = e2)(e1).
  Expect.equals(null, nullC()?.v = bad());
  {
    C? c = new C(1) as dynamic;
    Expect.equals(2, c?.v = 2);
    Expect.equals(2, c!.v);
  }

  // C?.v = e2 is equivalent to C.v = e2.
  C.staticInt = 1;
  Expect.equals(2, C?.staticInt = 2);
  //               ^
  // [cfe] The class 'C' cannot be null.
  //                ^^
  // [analyzer] STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR
  Expect.equals(2, C.staticInt);

  h.C.staticInt = 1;
  Expect.equals(2, h.C?.staticInt = 2);
  //                 ^
  // [cfe] The class 'C' cannot be null.
  //                  ^^
  // [analyzer] STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR
  Expect.equals(2, h.C.staticInt);

  // The static type of e1?.v = e2 is the static type of e2.
  {
    D? d = new D(new E()) as dynamic;
    G g = new G();
    F? f = (d?.v = g);
    Expect.identical(f, g);
  }

  {
    D.staticE = new E();
    G g = new G();
    F? f = (D?.staticE = g);
    //      ^
    // [cfe] The class 'D' cannot be null.
    //       ^^
    // [analyzer] STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR
    Expect.identical(f, g);
  }

  h.D.staticE = new h.E();
  h.G g = new h.G();
  h.F? f = (h.D?.staticE = g);
  //          ^
  // [cfe] The class 'D' cannot be null.
  //           ^^
  // [analyzer] STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR
  Expect.identical(f, g);

  // Exactly the same errors that would be caused by e1.v = e2 are
  // also generated in the case of e1?.v = e2.

  // e1?.v op= e2 is equivalent to ((x) => x?.v = x.v op e2)(e1).
  Expect.equals(null, nullC()?.v += bad());
  {
    C? c = new C(1) as dynamic;
    Expect.equals(3, c?.v += 2);
    Expect.equals(3, c!.v);
  }

  // C?.v op= e2 is equivalent to C.v op= e2.
  C.staticInt = 1;
  Expect.equals(3, C?.staticInt += 2);
  //               ^
  // [cfe] The class 'C' cannot be null.
  //                ^^
  // [analyzer] STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR
  Expect.equals(3, C?.staticInt);
  //               ^
  // [cfe] The class 'C' cannot be null.
  //                ^^
  // [analyzer] STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR

  // The static type of e1?.v op= e2 is the static type of e1.v op e2.
  {
    D? d = new D(new E()) as dynamic;
    F? f = (d?.v += 1);
    Expect.identical(d!.v, f);
  }

  {
    D.staticE = new E();
    F? f = (D?.staticE += 1);
    //      ^
    // [cfe] The class 'D' cannot be null.
    //       ^^
    // [analyzer] STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR
    Expect.identical(D.staticE, f);
  }

  {
    h.D.staticE = new h.E();
    h.F? f = (h.D?.staticE += 1);
    //          ^
    // [cfe] The class 'D' cannot be null.
    //           ^^
    // [analyzer] STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR
    Expect.identical(h.D.staticE, f);
  }
}
