// 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.

// SharedOptions=--enable-experiment=extension-methods

import "package:expect/expect.dart";

// Tests that static extensions can be used for all operators.

void main() {
  Object a = "a";
  Object b = "b";
  Object c = "c";

  expect("(-a)", -a);
  expect("(~a)", ~a);
  expect("(a+b)", a + b);
  expect("(a-b)", a - b);
  expect("(a*b)", a * b);
  expect("(a/b)", a / b);
  expect("(a%b)", a % b);
  expect("(a~/b)", a ~/ b);
  expect("(a|b)", a | b);
  expect("(a&b)", a & b);
  expect("(a^b)", a ^ b);
  expect("(a<b)", a < b);
  expect("(a>b)", a > b);
  expect("(a<=b)", a <= b);
  expect("(a>=b)", a >= b);
  expect("(a<<b)", a << b);
  expect("(a>>b)", a >> b);
  // expect("(a>>>b)", a >>> b);
  expect("a(b)", a(b));
  expect("a(b,c)", a(b, c));
  expect("a[b]", a[b]);
  expect("c", a[b] = c, "a[b]=c");

  // Operator-assignment works and evaluates to its RHS value.
  expect("(a.field+b)", a.field += b, "a.field=(a.field+b)");
  expect("(a.field-b)", a.field -= b, "a.field=(a.field-b)");
  expect("(a.field*b)", a.field *= b, "a.field=(a.field*b)");
  expect("(a.field/b)", a.field /= b, "a.field=(a.field/b)");
  expect("(a.field%b)", a.field %= b, "a.field=(a.field%b)");
  expect("(a.field~/b)", a.field ~/= b, "a.field=(a.field~/b)");
  expect("(a.field|b)", a.field |= b, "a.field=(a.field|b)");
  expect("(a.field&b)", a.field &= b, "a.field=(a.field&b)");
  expect("(a.field^b)", a.field ^= b, "a.field=(a.field^b)");
  expect("(a.field<<b)", a.field <<= b, "a.field=(a.field<<b)");
  expect("(a.field>>b)", a.field >>= b, "a.field=(a.field>>b)");
  // expect("(a.field>>>b)", a.field >>>= b, "a.field=(a.field>>>b)");

  // Even on index operations.
  expect("(a[c]+b)", a[c] += b, "a[c]=(a[c]+b)");
  expect("(a[c]-b)", a[c] -= b, "a[c]=(a[c]-b)");
  expect("(a[c]*b)", a[c] *= b, "a[c]=(a[c]*b)");
  expect("(a[c]/b)", a[c] /= b, "a[c]=(a[c]/b)");
  expect("(a[c]%b)", a[c] %= b, "a[c]=(a[c]%b)");
  expect("(a[c]~/b)", a[c] ~/= b, "a[c]=(a[c]~/b)");
  expect("(a[c]|b)", a[c] |= b, "a[c]=(a[c]|b)");
  expect("(a[c]&b)", a[c] &= b, "a[c]=(a[c]&b)");
  expect("(a[c]^b)", a[c] ^= b, "a[c]=(a[c]^b)");
  expect("(a[c]<<b)", a[c] <<= b, "a[c]=(a[c]<<b)");
  expect("(a[c]>>b)", a[c] >>= b, "a[c]=(a[c]>>b)");
  // expect("(a[c]>>>b)", a[c] >>>= b, "a[c]=(a[c]>>>b)");

  // And ++/-- expands to their assignments.
  expect("(a.field+1)", ++a.field, "a.field=(a.field+1)");
  expect("(a.field-1)", --a.field, "a.field=(a.field-1)");
  expect("a.field", a.field++, "a.field=(a.field+1)");
  expect("a.field", a.field--, "a.field=(a.field-1)");
  expect("(a[b]+1)", ++a[b], "a[b]=(a[b]+1)");
  expect("(a[b]-1)", --a[b], "a[b]=(a[b]-1)");
  expect("a[b]", a[b]++, "a[b]=(a[b]+1)");
  expect("a[b]", a[b]--, "a[b]=(a[b]-1)");

  // Combinations.
  expect("(a+b[b(c)]((a*b)))", a + b[c[a] = b(c)](a * b), "c[a]=b(c)");

  // Operator precedence is unaffected by being extensions.
  expect("(c<((-a)|(b^((~c)&((a<<b)>>((c-a)+((((b*c)~/a)%b)/c)))))))",
      c < -a | b ^ ~c & a << b >> c - a + b * c ~/ a % b / c);
  expect("((((((((((((c/b)%a)~/c)*b)+a)-c)<<b)>>a)&(~c))^b)|(-a))>b)",
      c / b % a ~/ c * b + a - c << b >> a & ~c ^ b | -a > b);
}

// Last value set by []= or setter.
String setValue = "";

void expect(String expect, Object value, [String expectSet]) {
  Expect.equals(expect, value, "value");
  if (expectSet != null) Expect.equals(expectSet, setValue, "assignment");
}

extension Ops on Object {
  Object operator -() => "(-${this})";
  Object operator ~() => "(~${this})";
  Object operator +(Object other) => "(${this}+$other)";
  Object operator -(Object other) => "(${this}-$other)";
  Object operator *(Object other) => "(${this}*$other)";
  Object operator /(Object other) => "(${this}/$other)";
  Object operator %(Object other) => "(${this}%$other)";
  Object operator ~/(Object other) => "(${this}~/$other)";
  Object operator |(Object other) => "(${this}|$other)";
  Object operator &(Object other) => "(${this}&$other)";
  Object operator ^(Object other) => "(${this}^$other)";
  Object operator <(Object other) => "(${this}<$other)";
  Object operator >(Object other) => "(${this}>$other)";
  Object operator <=(Object other) => "(${this}<=$other)";
  Object operator >=(Object other) => "(${this}>=$other)";
  Object operator <<(Object other) => "(${this}<<$other)";
  Object operator >>(Object other) => "(${this}>>$other)";
  // TODO: enable `>>>` when it has been implemented.
  // String operator >>>(Object other) => "(${this}>>>$other)";

  // Cannot make an extension method for `==` because it's declared by Object.

  Object operator [](Object other) => "${this}[$other]";
  void operator []=(Object other, Object value) {
    setValue = "${this}[$other]=$value";
  }

  Object call([arg1, arg2]) =>
      "${this}(${[arg1, arg2].where((x) => x != null).join(",")})";

  Object get field => "${this}.field";
  void set field(Object other) {
    setValue = "${this}.field=$other";
  }
}
