/*
 * 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.
 */
/**
 * @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);
}
