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

/*member: index:[empty]*/
dynamic get index => throw '';

/*member: A.:[exact=A]*/
class A {
  /*member: A.foo:Value([exact=JSString], value: "string")*/
  get foo => 'string';

  set foo(/*[subclass=JSNumber]*/ value) {}

  /*member: A.[]:Value([exact=JSString], value: "string")*/
  operator [](/*[empty]*/ index) => 'string';

  /*member: A.[]=:[null]*/
  operator []=(/*[empty]*/ index, /*[subclass=JSNumber]*/ value) {}

  /*member: A.returnDynamic1:Union([exact=JSString], [exact=JSUInt31])*/
  returnDynamic1() => /*[subclass=A]*/ /*update: [subclass=A]*/ foo
      /*invoke: Union([exact=JSString], [exact=JSUInt31])*/ --;

  /*member: A.returnNum1:[subclass=JSNumber]*/
  returnNum1() => /*invoke: Union([exact=JSString], [exact=JSUInt31])*/ --
      /*[subclass=A]*/ /*update: [subclass=A]*/ foo;

  /*member: A.returnNum2:[subclass=JSNumber]*/
  returnNum2() => /*[subclass=A]*/ /*update: [subclass=A]*/ foo
      /*invoke: Union([exact=JSString], [exact=JSUInt31])*/ -= 42;

  /*member: A.returnDynamic2:Union([exact=JSString], [exact=JSUInt31])*/
  returnDynamic2() => this
          /*[subclass=A]*/ /*update: [subclass=A]*/ [index]
      /*invoke: Union([exact=JSString], [exact=JSUInt31])*/ --;

  /*member: A.returnNum3:[subclass=JSNumber]*/
  returnNum3() => /*invoke: Union([exact=JSString], [exact=JSUInt31])*/ --this
      /*[subclass=A]*/ /*update: [subclass=A]*/ [index];

  /*member: A.returnNum4:[subclass=JSNumber]*/
  returnNum4() => this
          /*[subclass=A]*/ /*update: [subclass=A]*/ [index]
      /*invoke: Union([exact=JSString], [exact=JSUInt31])*/ -= 42;

  /*member: A.returnEmpty3:[empty]*/
  returnEmpty3() {
    dynamic a = this;
    return a. /*[subclass=A]*/ /*update: [subclass=A]*/
            bar
        /*invoke: [empty]*/ --;
  }

  /*member: A.returnEmpty1:[empty]*/
  returnEmpty1() {
    dynamic a = this;
    return /*invoke: [empty]*/ --a
        . /*[subclass=A]*/ /*update: [subclass=A]*/ bar;
  }

  /*member: A.returnEmpty2:[empty]*/
  returnEmpty2() {
    dynamic a = this;
    return a. /*[subclass=A]*/ /*update: [subclass=A]*/ bar
        /*invoke: [empty]*/ -= 42;
  }
}

/*member: B.:[exact=B]*/
class B extends A {
  /*member: B.foo:[exact=JSUInt31]*/
  get foo => 42;
  /*member: B.[]:[exact=JSUInt31]*/
  operator [](/*[empty]*/ index) => 42;

  /*member: B.returnString1:Value([exact=JSString], value: "string")*/
  returnString1() =>
      super.foo /*invoke: Value([exact=JSString], value: "string")*/ --;

  /*member: B.returnDynamic1:[empty]*/
  returnDynamic1() =>
      /*invoke: Value([exact=JSString], value: "string")*/
      --super.foo;

  /*member: B.returnDynamic2:[empty]*/
  returnDynamic2() =>
      super.foo /*invoke: Value([exact=JSString], value: "string")*/ -= 42;

  /*member: B.returnString2:Value([exact=JSString], value: "string")*/
  returnString2() => super[index]
      /*invoke: Value([exact=JSString], value: "string")*/ --;

  /*member: B.returnDynamic3:[empty]*/
  returnDynamic3() =>
      /*invoke: Value([exact=JSString], value: "string")*/
      --super[index];

  /*member: B.returnDynamic4:[empty]*/
  returnDynamic4() => super[index]
      /*invoke: Value([exact=JSString], value: "string")*/ -= 42;
}

/*member: main:[null]*/
main() {
  new A()
    .. /*invoke: [exact=A]*/ returnNum1()
    .. /*invoke: [exact=A]*/ returnNum2()
    .. /*invoke: [exact=A]*/ returnNum3()
    .. /*invoke: [exact=A]*/ returnNum4()
    .. /*invoke: [exact=A]*/ returnDynamic1()
    .. /*invoke: [exact=A]*/ returnDynamic2()
    .. /*invoke: [exact=A]*/ returnEmpty1()
    .. /*invoke: [exact=A]*/ returnEmpty2()
    .. /*invoke: [exact=A]*/ returnEmpty3();

  new B()
    .. /*invoke: [exact=B]*/ returnString1()
    .. /*invoke: [exact=B]*/ returnString2()
    .. /*invoke: [exact=B]*/ returnDynamic1()
    .. /*invoke: [exact=B]*/ returnDynamic2()
    .. /*invoke: [exact=B]*/ returnDynamic3()
    .. /*invoke: [exact=B]*/ returnDynamic4();
}
