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