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