407428311f
Change-Id: I277a4f29d39c2c4d2669931b5f4837db65589167 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/149522 Auto-Submit: Kevin Moore <kevmoo@google.com> Commit-Queue: Leaf Petersen <leafp@google.com> Reviewed-by: Leaf Petersen <leafp@google.com>
129 lines
5.0 KiB
Dart
129 lines
5.0 KiB
Dart
// 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.
|
|
|
|
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";
|
|
}
|
|
}
|