// 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);
}
