dart-sdk/tests/language_2/mixin/accessor_test.dart
Robert Nystrom fc1b1ecc71 Move files under language_2 into subdirectories.
Change-Id: Idbcc965a27e9ffeedf5e0a1068b019de4193070f
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/127745
Commit-Queue: Bob Nystrom <rnystrom@google.com>
Reviewed-by: Alexander Thomas <athom@google.com>
2019-12-11 19:18:00 +00:00

64 lines
1.7 KiB
Dart

// Copyright (c) 2018, 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.
// Regression test case for DDC bug where if a getter/setter is mixed in
// without a corresponding getter/setter, DDC fails to install a the
// corresponding getter/setter that calls super.
import "package:expect/expect.dart";
abstract class C<E> {
E get first;
set first(E value);
E operator [](int index);
operator []=(int index, E value);
}
abstract class CMixin<E> implements C<E> {
E get first => this[0];
set first(E x) {
this[0] = x;
}
}
abstract class CBase<E> extends Object with CMixin<E> {}
abstract class DMixin<E> implements C<E> {
set first(E _) => throw new UnsupportedError('');
operator []=(int index, E value) => throw new UnsupportedError('');
}
abstract class DBase<E> = CBase<E> with DMixin<E>;
class DView<E> extends DBase<E> {
final Iterable<E> _source;
DView(this._source);
E operator [](int index) => _source.elementAt(index);
}
abstract class FMixin<E> implements C<E> {
E get first => throw new UnsupportedError('');
E operator [](int index) => throw new UnsupportedError('');
}
class FView<E> extends CBase<E> with FMixin<E> {
List<E> _values;
FView(this._values);
operator []=(int index, E value) {
_values[index] = value;
}
}
void main() {
var d = new DView([3]);
Expect.equals(3, d.first);
Expect.throws(() => d.first = 42, (e) => e is UnsupportedError);
var list = [3];
var f = new FView(list);
f.first = 42;
Expect.equals(42, list[0]);
Expect.throws(() => f.first, (e) => e is UnsupportedError);
}