// 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.

// @dart = 2.7

/*member: 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();
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  /*member: 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";
    }
  }
}

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

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

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

  /*member: 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();
    }
  }
}

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

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

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

  /*member: 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();
    }
  }
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

/*member: 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.

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

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

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

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

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

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

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

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

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

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

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

  /*member: 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;
  }
}

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

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

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

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

  /*member: 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();
  }
}

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

class A20 {
  /*member: A20.f20:[null]*/
  var f20;

  /*member: 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;
}

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

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

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

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

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

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

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

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

  /*member: 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;
}

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

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

  /*member: 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;
  }

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

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

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

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

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

  /*member: 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';
  }
}

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

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

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

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

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

  /*member: 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};
  }
}

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

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

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

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

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

  /*member: A24.f24e:Union(null, [exact=JSNumNotInt], [exact=JSUInt31])*/
  var f24e;

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

  /*member: 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;
  }

  /*member: 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();

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

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

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

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

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

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

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

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

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

/*member: 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 {
  /*member: A27.f27a:[exact=JSUInt31]*/
  var f27a;

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

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

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

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

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

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

  /*member: 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;
  }
}

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

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

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

  /*member: 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;
  }
}

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

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

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

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

  /*member: 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;
  }
}

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