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

/*element: main:[null]*/
main() {
  test1();
  test2();
  test3();
  test4();
  test5();
  test6();
  test7();
  test8();
  test9();
  test10();
  test11();
  test12();
  test13();
  test14();
  test15();
  test16();
  test17();
  test18();
  test19();
  test20();
  test21();
  test22();
  test23();
  test24();
  test25();
  test26();
  test27();
  test28();
  test29();
  test30();
}

/*element: A1.:[exact=A1]*/
class A1 {
  /*element: A1.f1:[null]*/
  int f1;
}

/*element: test1:[null]*/
test1() {
  new A1();
}

/*element: A2.:[exact=A2]*/
class A2 {
  /*element: A2.f2a:[null]*/
  int f2a;

  /*element: A2.f2b:[exact=JSUInt31]*/
  int f2b = 1;
}

/*element: test2:[null]*/
test2() {
  new A2();
}

class A3 {
  /*element: A3.f3a:[exact=JSUInt31]*/
  int f3a;

  /*element: A3.f3b:[null|exact=JSUInt31]*/
  int f3b;

  /*element: A3.:[exact=A3]*/
  A3() : f3a = 1;
}

/*element: test3:[null]*/
test3() {
  new A3(). /*update: [exact=A3]*/ f3b = 2;
}

class A4 {
  /*element: A4.f4a:Union([exact=JSString], [exact=JSUInt31])*/
  dynamic f4a;

  /*element: A4.f4b:Value([null|exact=JSString], value: "a")*/
  dynamic f4b;

  /*element: A4.:[exact=A4]*/
  A4() : f4a = 1;
}

/*element: test4:[null]*/
test4() {
  A4 a = new A4();
  a. /*update: [exact=A4]*/ f4a = "a";
  a. /*update: [exact=A4]*/ f4b = "a";
}

class A5 {
  /*element: A5.f5a:Union([exact=JSString], [exact=JSUInt31])*/
  dynamic f5a = 1;

  /*element: A5.f5b:Union([exact=JSString], [exact=JSUInt31])*/
  dynamic f5b = 1;

  /*element: A5.:[exact=A5]*/
  A5(/*[exact=JSBool]*/ x) {
    /*update: [exact=A5]*/ f5a = "1";
    if (x) {
      /*update: [exact=A5]*/ f5b = "1";
    } else {
      /*update: [exact=A5]*/ f5b = "2";
    }
  }
}

/*element: test5:[null]*/
test5() {
  new A5(true);
  new A5(false);
}

class A6 {
  /*element: A6.f6a:Union([exact=JSString], [exact=JSUInt31])*/
  dynamic f6a = 1;

  /*element: A6.f6b:Union([exact=JSExtendableArray], [exact=JSString], [exact=JSUInt31])*/
  dynamic f6b = 1;

  /*element: A6.:[exact=A6]*/
  A6(/*[exact=JSBool]*/ x) {
    /*update: [exact=A6]*/ f6a = "1";
    if (x) {
      /*update: [exact=A6]*/ f6b = "1";
    } else {
      /*update: [exact=A6]*/ f6b = "2";
    }
    if (x) {
      /*update: [exact=A6]*/ f6b = new List();
    } else {
      /*update: [exact=A6]*/ f6b = new List();
    }
  }
}

/*element: test6:[null]*/
test6() {
  new A6(true);
  new A6(false);
}

class A7 {
  /*element: A7.f7a:Union([exact=JSExtendableArray], [exact=JSString], [exact=JSUInt31])*/
  dynamic f7a = 1;

  /*element: A7.f7b:Union([exact=JSExtendableArray], [exact=JSString], [exact=JSUInt31])*/
  dynamic f7b = 1;

  /*element: A7.:[exact=A7]*/
  A7(/*[exact=JSBool]*/ x) {
    /*update: [exact=A7]*/ f7a = "1";
    if (x) {
      /*update: [exact=A7]*/ f7b = "1";
    } else {
      /*update: [exact=A7]*/ f7b = "2";
    }
    if (x) {
      /*update: [exact=A7]*/ f7a = new List();
      /*update: [exact=A7]*/ f7b = new List();
    } else {
      /*update: [exact=A7]*/ f7b = new List();
    }
  }
}

/*element: test7:[null]*/
test7() {
  new A7(true);
  new A7(false);
}

class A8 {
  /*element: A8.f8:Value([null|exact=JSString], value: "1")*/
  dynamic f8;

  /*element: A8.:[exact=A8]*/
  A8(/*[exact=JSBool]*/ x) {
    if (x) {
      /*update: [exact=A8]*/ f8 = "1";
    } else {}
  }
}

/*element: test8:[null]*/
test8() {
  new A8(true);
  new A8(false);
}

class A9 {
  /*element: A9.f9:Value([null|exact=JSString], value: "1")*/
  dynamic f9;

  /*element: A9.:[exact=A9]*/
  A9(/*[exact=JSBool]*/ x) {
    if (x) {
    } else {
      /*update: [exact=A9]*/ f9 = "1";
    }
  }
}

/*element: test9:[null]*/
test9() {
  new A9(true);
  new A9(false);
}

class A10 {
  /*element: A10.f10:[exact=JSUInt31]*/
  int f10;

  /*element: A10.:[exact=A10]*/
  A10() {
    /*update: [exact=A10]*/ f10 = 1;
  }
  /*element: A10.m10:[subclass=JSUInt32]*/
  m10() => /*[exact=A10]*/ f10 /*invoke: [exact=JSUInt31]*/ + 1;
}

/*element: f10:[null]*/
void f10(/*[null]*/ x) {
  x. /*update: [null]*/ f10 = "2";
}

/*element: test10:[null]*/
test10() {
  A10 a;
  f10(a);
  a = new A10();
  a. /*invoke: [exact=A10]*/ m10();
}

/*element: S11.:[exact=S11]*/
class S11 {
  /*element: S11.fs11:[exact=JSUInt31]*/
  int fs11 = 1;

  /*element: S11.ms11:[null]*/
  ms11() {
    /*update: [exact=A11]*/ fs11 = 1;
  }
}

/*element: A11.:[exact=A11]*/
class A11 extends S11 {
  /*element: A11.m11:[null]*/
  m11() {
    /*invoke: [exact=A11]*/ ms11();
  }
}

/*element: test11:[null]*/
test11() {
  A11 a = new A11();
  a. /*invoke: [exact=A11]*/ m11();
}

class S12 {
  /*element: S12.fs12:Union([exact=JSString], [exact=JSUInt31])*/
  dynamic fs12 = 1;

  /*element: S12.:[exact=S12]*/
  S12() {
    /*update: [exact=A12]*/ fs12 = "2";
  }
}

/*element: A12.:[exact=A12]*/
class A12 extends S12 {}

/*element: test12:[null]*/
test12() {
  new A12();
}

class S13 {
/*element: S13.fs13:[exact=JSUInt31]*/
  int fs13;

  /*element: S13.:[exact=S13]*/
  S13() {
    /*update: [exact=A13]*/ fs13 = 1;
  }
}

class A13 extends S13 {
  /*element: A13.:[exact=A13]*/
  A13() {
    /*update: [exact=A13]*/ fs13 = 1;
  }
}

/*element: test13:[null]*/
test13() {
  new A13();
}

class A14 {
  /*element: A14.f14:[exact=JSUInt31]*/
  var f14;

  /*element: A14.:[exact=A14]*/
  A14() {
    /*update: [exact=A14]*/ f14 = 1;
  }
  /*element: A14.other:[exact=A14]*/
  A14.other() {
    /*update: [exact=A14]*/ f14 = 2;
  }
}

/*element: test14:[null]*/
test14() {
  // ignore: unused_local_variable
  A14 a = new A14();
  a = new A14.other();
}

class A15 {
  /*element: A15.f15:Union([exact=JSExtendableArray], [exact=JSString])*/
  var f15;

  /*element: A15.:[exact=A15]*/
  A15() {
    /*update: [exact=A15]*/ f15 = "1";
  }

  /*element: A15.other:[exact=A15]*/
  A15.other() {
    /*update: [exact=A15]*/ f15 = new List();
  }
}

/*element: test15:[null]*/
test15() {
  // ignore: unused_local_variable
  A15 a = new A15();
  a = new A15.other();
}

class A16 {
  // TODO(johnniwinther): Investigate why these include `null`. The ast version
  // didn't.

  /*element: A16.f16:Union([exact=JSString], [null|exact=JSUInt31])*/
  var f16;

  /*element: A16.:[exact=A16]*/
  A16() {
    /*update: [exact=A16]*/ f16 = "1";
  }

  /*element: A16.other:[exact=A16]*/
  A16.other() : f16 = 1 {}
}

/*element: test16:[null]*/
test16() {
  // ignore: unused_local_variable
  A16 a = new A16();
  a = new A16.other();
}

/*element: g17:[exact=JSUInt31]*/
g17([/*[exact=A17]*/ p]) => p. /*update: [exact=A17]*/ f17 = 1;

class A17 {
/*element: A17.f17:[null|exact=JSUInt31]*/
  var f17;

  /*element: A17.:[exact=A17]*/
  A17(/*[exact=JSBool]*/ x) {
    var a;
    if (x) {
      a = this;
    } else {
      a = g17;
    }
    a(this);
  }
}

/*element: test17:[null]*/
test17() {
  new A17(true);
  new A17(false);
}

class A18 {
  /*element: A18.f18a:[exact=JSUInt31]*/
  var f18a;

  /*element: A18.f18b:Value([exact=JSString], value: "1")*/
  var f18b;

  /*element: A18.f18c:Union([exact=JSUInt31], [null|exact=A18])*/
  var f18c;

  /*element: A18.:[exact=A18]*/
  A18(/*[exact=JSBool]*/ x) {
    /*update: [exact=A18]*/ f18a = 1;
    var a;
    if (x) {
      /*update: [exact=A18]*/ f18b = "1";
      a = this;
    } else {
      a = 1;
      /*update: [exact=A18]*/ f18b = "1";
    }
    /*update: [exact=A18]*/ f18c = a;
  }
}

/*element: test18:[null]*/
test18() {
  new A18(true);
  new A18(false);
}

class A19 {
  /*element: A19.f19a:[exact=JSUInt31]*/
  var f19a;

  /*element: A19.f19b:Value([exact=JSString], value: "1")*/
  var f19b;

  /*element: A19.f19c:Union([exact=JSUInt31], [null|exact=A19])*/
  var f19c;

  /*element: A19.:[exact=A19]*/
  A19(/*[exact=JSBool]*/ x) {
    /*update: [exact=A19]*/ f19a = 1;
    var a;
    if (x) {
      /*update: [exact=A19]*/ f19b = "1";
      a = this;
    } else {
      a = 1;
      /*update: [exact=A19]*/ f19b = "1";
    }
    /*update: [exact=A19]*/ f19c = a;
    a();
  }
}

/*element: test19:[null]*/
test19() {
  new A19(true);
  new A19(false);
}

class A20 {
  /*element: A20.f20:[null|exact=JSUInt31]*/
  var f20;

  /*element: A20.:[exact=A20]*/
  A20() {
    dynamic a = this;
    // TODO(johnniwinther): Fix ast equivalence on instance fields in for.
    /*iterator: [exact=A20]*/
    /*current: [exact=A20]*/
    /*moveNext: [exact=A20]*/
    for (/*update: [exact=A20]*/ f20 in a) {}
  }

  /*element: A20.iterator:[exact=A20]*/
  get iterator => this;

  /*element: A20.current:[exact=JSUInt31]*/
  get current => 42;

  /*element: A20.moveNext:Value([exact=JSBool], value: false)*/
  bool moveNext() => false;
}

/*element: test20:[null]*/
test20() {
  new A20();
}

class A21 {
  /*element: A21.f21:[null|exact=JSUInt31]*/
  var f21;

  /*element: A21.:[exact=A21]*/
  A21() {
    dynamic a = this;
    /*iterator: [exact=A21]*/
    /*current: [null]*/
    /*moveNext: [null]*/
    for (
        // ignore: unused_local_variable
        var i in a) {}
    /*update: [exact=A21]*/ f21 = 42;
  }
  /*element: A21.iterator:[null]*/
  get iterator => null;
}

/*element: test21:[null]*/
test21() {
  new A21();
}

class A22 {
  /*element: A22.f22a:[exact=JSUInt31]*/
  var f22a;

  /*element: A22.f22b:[exact=JSUInt31]*/
  var f22b;

  /*element: A22.f22c:Value([null|exact=JSString], value: "foo")*/
  var f22c;

  /*element: A22.:[exact=A22]*/
  A22() {
    /*update: [exact=A22]*/ f22a = 42;
    /*update: [exact=A22]*/ f22b = /*[exact=A22]*/ f22a == null
        ? 42
        : /*[exact=A22]*/ f22c == null ? 41 : 43;
    /*update: [exact=A22]*/ f22c = 'foo';
  }
}

/*element: test22:[null]*/
test22() {
  new A22();
}

class A23 {
  /*element: A23.f23a:[null|exact=JSUInt31]*/
  var f23a = 42;

  /*element: A23.f23b:[null|exact=JSUInt31]*/
  var f23b = 42;

  /*element: A23.f23c:[null|exact=JSUInt31]*/
  var f23c = 42;

  /*element: A23.f23d:[null|exact=JSUInt31]*/
  var f23d = 42;

  /*element: A23.:[exact=A23]*/
  A23() {
    // Test string interpolation.
    '${/*update: [exact=A23]*/ f23a = null}';
    // Test string juxtaposition.
    ''
        '${/*update: [exact=A23]*/ f23b = null}';
    // Test list literal.
    [/*update: [exact=A23]*/ f23c = null];
    // Test map literal.
    // ignore: unused_local_variable
    var c = {'foo': /*update: [exact=A23]*/ f23d = null};
  }
}

/*element: test23:[null]*/
test23() {
  new A23();
}

class A24 {
  /*element: A24.f24a:[subclass=JSPositiveInt]*/
  var f24a = 42;

  /*element: A24.f24b:[subclass=JSPositiveInt]*/
  var f24b = 42;

  /*element: A24.f24c:[exact=JSUInt31]*/
  var f24c = 42;

  /*element: A24.f24d:[exact=JSUInt31]*/
  final f24d;

  /*element: A24.f24e:Union([exact=JSUInt31], [null|exact=JSDouble])*/
  var f24e;

/*element: A24.f24f:Value([null|exact=JSString], value: "foo")*/
  var f24f = null;

  /*element: A24.:[exact=A24]*/
  A24() : f24d = 42 {
    /*[subclass=A24]*/ /*update: [subclass=A24]*/ f24a
        /*invoke: [subclass=JSPositiveInt]*/ ++;
    /*[subclass=A24]*/ /*update: [subclass=A24]*/ f24b
        /*invoke: [subclass=JSPositiveInt]*/ += 42;
    var f24f = 'foo';
    this. /*update: [subclass=A24]*/ f24f = f24f;
  }

  /*element: A24.foo:[exact=A24]*/
  A24.foo(/*[subclass=A24]*/ other)
      : f24c = other. /*[subclass=A24]*/ f24c,
        f24d = other. /*[subclass=A24]*/ f24d,
        f24e = other
            . /*invoke: [subclass=A24]*/
            bar24();

  /*element: A24.+:Value([exact=JSString], value: "foo")*/
  operator +(/*[empty]*/ other) => 'foo';

  /*element: A24.bar24:[exact=JSDouble]*/
  bar24() => 42.5;
}

/*element: B24.:[exact=B24]*/
class B24 extends A24 {
  /*element: B24.bar24:[exact=JSUInt31]*/
  bar24() => 42;
}

/*element: test24:[null]*/
test24() {
  new A24();
  new A24.foo(new A24());
  new A24.foo(new B24());
}

/*element: A25.:[exact=A25]*/
class A25 {
  /*element: A25.f25:[exact=JSUInt31]*/
  var f25 = 42;
}

/*element: B25.:[exact=B25]*/
class B25 {
  /*element: B25.f25:Value([exact=JSString], value: "42")*/
  var f25 = '42';
}

/*element: test25:[null]*/
test25() {
  new B25();
  new A25(). /*update: [exact=A25]*/ f25 = new A25(). /*[exact=A25]*/ f25;
}

/*element: A26.:[exact=A26]*/
class A26 {
  /*element: A26.f26:[subclass=JSPositiveInt]*/
  var f26 = 42;
}

/*element: B26.:[exact=B26]*/
class B26 {
  /*element: B26.f26:[exact=JSUInt31]*/
  var f26 = 54;
}

/*element: test26:[null]*/
test26() {
  new A26(). /*update: [exact=A26]*/ f26 = <dynamic>[new B26(), new A26()]
              /*Container([exact=JSExtendableArray], element: Union([exact=A26], [exact=B26]), length: 2)*/
              [0]
          . /*Union([exact=A26], [exact=B26])*/ f26
      /*invoke: [subclass=JSPositiveInt]*/ +
      42;
}

class A27 {
  /*element: A27.f27a:[exact=JSUInt31]*/
  var f27a;

  /*element: A27.f27b:[null|exact=JSUInt31]*/
  var f27b;

  /*element: A27.:[exact=A27]*/
  A27() {
    this. /*update: [subclass=A27]*/ f27a = 42;
    this. /*update: [subclass=A27]*/ f27b = 42;
  }
}

/*element: B27.:[exact=B27]*/
class B27 extends A27 {
  set f27b(/*[exact=JSUInt31]*/ value) {}
}

/*element: test27:[null]*/
test27() {
  new A27();
  new B27();
}

class A28 {
  /*element: A28.f28a:[exact=JSUInt31]*/
  var f28a;

  /*element: A28.f28b:[null|exact=JSUInt31]*/
  var f28b;

  /*element: A28.:[exact=A28]*/
  A28(/*[exact=JSUInt31]*/ x) {
    this. /*update: [exact=A28]*/ f28a = x;
    if (x /*invoke: [exact=JSUInt31]*/ == 0) return;
    this. /*update: [exact=A28]*/ f28b = x;
  }
}

/*element: test28:[null]*/
test28() {
  new A28(0);
  new A28(1);
}

class A29 {
  /*element: A29.f29a:[exact=JSUInt31]*/
  var f29a;

  /*element: A29.f29b:[null|exact=JSUInt31]*/
  var f29b;

  /*element: A29.:[exact=A29]*/
  A29(/*[exact=JSUInt31]*/ x) {
    this. /*update: [exact=A29]*/ f29a = x;
    if (x /*invoke: [exact=JSUInt31]*/ == 0) {
    } else {
      return;
    }
    this. /*update: [exact=A29]*/ f29b = x;
  }
}

/*element: test29:[null]*/
test29() {
  new A29(0);
  new A29(1);
}

class A30 {
  /*element: A30.f30a:[exact=JSUInt31]*/
  var f30a;

  /*element: A30.f30b:[exact=JSUInt31]*/
  var f30b;

  /*element: A30.f30c:[null|exact=JSUInt31]*/
  var f30c;

  /*element: A30.:[exact=A30]*/
  A30(/*[exact=JSUInt31]*/ x) {
    this. /*update: [exact=A30]*/ f30a = x;
    if (x /*invoke: [exact=JSUInt31]*/ == 0) {
      this. /*update: [exact=A30]*/ f30b = 1;
    } else {
      this. /*update: [exact=A30]*/ f30b = x;
      return;
    }
    this. /*update: [exact=A30]*/ f30c = x;
  }
}

/*element: test30:[null]*/
test30() {
  new A30(0);
  new A30(1);
}
