blob: 58eecf47a1a589fa08235d64c44e2e98cc059d70 [file] [log] [blame]
// 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.
class Class1 {
int field;
Class1(this.field);
String toString() => 'Class1($field)';
}
class Class2 {
int field;
Class2(this.field);
String toString() => 'Class2($field)';
}
extension on Class1 {
int method() {
print('Extension1.method on $this');
return field;
}
num genericMethod<T extends num>(T t) {
print('Extension1.genericMethod<$T>($t) on $this');
return field + t;
}
int get property {
print('Extension1.property get on $this');
return field;
}
set property(int value) {
field = value;
print('Extension1.property set($value) on $this');
value++;
}
}
extension on Class2 {
int method() {
print('Extension2.method on $this');
return field + 3;
}
num genericMethod<T extends num>(T t) {
print('Extension2.genericMethod<$T>($t) on $this');
return field + t + 4;
}
int get property {
print('Extension2.property get on $this');
return field + 5;
}
set property(int value) {
print('Extension2.property set($value) on $this');
value++;
field = value;
}
}
main() {
Class1 c10 = new Class1(0);
Class1 c11 = new Class1(1);
testExtension1(c10, c11, c10, c11);
Class2 c20 = new Class2(0);
Class2 c21 = new Class2(1);
testExtension2(c20, c21, c20);
}
testExtension1(Class1 c0, Class1 c1, Class1? c0n, Class1? c1n) {
expect(0, c0.method());
expect(1, c1.method());
expect(1, c1n?.method());
expect(42, c0.genericMethod(42));
expect(43, c0.genericMethod<num>(43));
expect(88, c1.genericMethod(87));
expect(89, c1.genericMethod<num>(88));
expect(0, c0.property);
expect(0, c0n?.property);
expect(42, c0.property = 42);
expect(1, c1.property);
expect(87, c0.property = 87);
expect(27, c0.property = c1.property = 27);
expect(37, c1.property = c0.property = 37);
expect(77, c1.property = c0.property = c1.property = 77);
expect(67, c0.property = c1.property = c0.property = 67);
}
testExtension2(Class2 c0, Class2 c1, Class2? c0n) {
expect(3, c0.method());
expect(3, c0n?.method());
expect(4, c1.method());
expect(46, c0.genericMethod(42));
expect(47, c0.genericMethod<num>(43));
expect(92, c1.genericMethod(87));
expect(93, c1.genericMethod<num>(88));
expect(5, c0.property);
expect(5, c0n?.property);
expect(42, c0.property = 42);
expect(48, c0.property);
expect(6, c1.property);
expect(43, c1.property = 43);
expect(49, c1.property);
expect(49, c0.property = c1.property);
expect(55, c1.property = c0.property);
expect(61, c1.property = c0.property = c1.property);
expect(67, c0.property = c1.property = c0.property);
}
expect(expected, actual) {
if (expected != actual) {
throw 'Mismatch: expected=$expected, actual=$actual';
}
}