blob: ddad1fbf301103b1d6cc100276992b391d92cc2f [file] [log] [blame]
// 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.
// @dart = 2.9
// 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);
}