// 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() {
  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();

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