// 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();
  test20b();
  test21();
  test21b();
  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=JSUInt31], [null|exact=JSString])*/
  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]*/
  var f20;

  /*element: A20.:[exact=A20]*/
  A20() {
    dynamic a = this;
    /*iterator: [exact=A20]*/
    /*current: [empty]*/
    /*moveNext: [empty]*/
    for (/*update: [exact=A20]*/ f20 in a) {}
  }

  get iterator => this;

  get current => 42;

  bool moveNext() => false;
}

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

class A20b extends Iterable implements Iterator {
  /*element: A20b.f20b:[null|exact=JSUInt31]*/
  var f20b;

  /*element: A20b.:[exact=A20b]*/
  A20b() {
    dynamic a = this;
    /*iterator: [exact=A20b]*/
    /*current: [exact=A20b]*/
    /*moveNext: [exact=A20b]*/
    for (/*update: [exact=A20b]*/ f20b in a) {}
  }

  /*element: A20b.iterator:[exact=A20b]*/
  @override
  get iterator => this;

  /*element: A20b.current:[exact=JSUInt31]*/
  @override
  get current => 42;

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

/*element: test20b:[null]*/
test20b() {
  new A20b();
}

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

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

  get iterator => null;
}

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

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

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

  /*element: A21b.iterator:[null]*/
  @override
  get iterator => null;
}

/*element: test21b:[null]*/
test21b() {
  new A21b();
}

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]*/
  @override
  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 {
  @override
  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);
}
