// Copyright (c) 2019, 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.9

/// @assertion A composite member invocation on a target expression X is an
/// expression of one of the forms:
/// Composite member invocation on target X	     Corresponding member base name
///    X.id binop= expr2	                                       id
/// @description Check explicit extension member invocation in form of
/// X.id -= expr2
/// @issue 39198
/// @author sgrekhov@unipro.ru

import "../../Utils/expect.dart";

class C {
  int value;
  C() : value = 0 {}
  init() {
    value = 0;
  }
  C operator [](int index) {
    this.value += index;
    return this;
  }
  void operator []=(int index, C other) {
    this.value += other.value + index;
  }
  C operator -(int val) {
    this.value += val;
    return this;
  }
}

extension Extension1 on C {
  C operator [](int index) {
    this.value += index + 1;
    return this;
  }
  void operator []=(int index, C other) {
    this.value += other.value + index + 1;
  }
  C operator -(int val) {
    this.value += val + 1;
    return this;
  }
}

extension Extension2 on C {
  C operator [](int index) {
    this.value += index + 2;
    return this;
  }
  void operator []=(int index, C other) {
    this.value += other.value + index + 2;
  }
  C operator -(int val) {
    this.value += val + 2;
    return this;
  }
}

main() {
  C c = C();
  Extension1(c)[13] -= 42; // [] and []= from extension, - from C
  Expect.equals(126, c.value);

  c.init();
  Extension2(c)[13] -= 42; // [] and []= from extension, - from C
  Expect.equals(129, c.value);

  c.init();
  c[13] -= 42;
  Expect.equals(13 + 42 + 55 + 13, c.value);
}
