blob: c946ed79f01fcf7b407c84b90b16aab8b61ecda6 [file] [log] [blame]
// Copyright (c) 2020, 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.
/// Checks that abstract instance variable declarations are allowed.
import "package:expect/expect.dart";
// Valid declarations for abstract class.
abstract class C {
abstract int x1, x2;
abstract var y1, y2, y3; // infers dynamic.
abstract final z;
abstract final int u1, u2;
abstract covariant int v1, v2, v3;
abstract covariant var w;
}
class D {
int x1, x2;
var y1, y2, y3;
var z;
int u1, u2;
covariant int v1, v2, v3;
covariant var w;
D() :
x1 = 0,
x2 = 0,
y1 = 1,
y2 = 1,
y3 = 1,
z = 2,
u1 = 3,
u2 = 3,
v1 = 4,
v2 = 4,
v3 = 4,
w = 5;
}
/// Valid implementation of abstract interface.
class E extends D implements C {}
// Valid declarations when superclass has implementation.
class F extends D { // Class is not abstract.
abstract int x1, x2;
abstract var y1, y2, y3;
abstract final z;
abstract final int u1, u2;
abstract covariant int v1, v2, v3;
abstract covariant var w;
}
// Records accesses.
class Logger {
Symbol? lastName;
String _x = "x";
int _y = 0;
String get x {
lastName = #x;
return _x;
}
set x(String value) {
lastName = #x;
_x = value;
}
int get y {
lastName = #y;
return _y;
}
set y(int value) {
lastName = #y;
_y = value;
}
}
/// Check that abstract declarations do not shadow implementation.
class Override extends Logger {
abstract String x;
abstract final int y;
}
void main() {
C c = E();
Expect.equals(0, c.x1);
Expect.equals(0, c.x2);
Expect.equals(1, c.y1);
Expect.equals(1, c.y2);
Expect.equals(1, c.y3);
Expect.equals(2, c.z);
Expect.equals(3, c.u1);
Expect.equals(3, c.u2);
Expect.equals(4, c.v1);
Expect.equals(4, c.v2);
Expect.equals(4, c.v3);
Expect.equals(5, c.w);
c.x1 = 6;
Expect.equals(6, c.x1);
c.y2 = 7;
Expect.equals(7, c.y2);
c.v3 = 8;
Expect.equals(8, c.v3);
c.w = 9;
Expect.equals(9, c.w);
// Class F is not abstract and can be instantiated.
F f = F();
Expect.equals(0, f.x1);
Expect.equals(0, f.x2);
Expect.equals(1, f.y1);
Expect.equals(1, f.y2);
Expect.equals(1, f.y3);
Expect.equals(2, f.z);
Expect.equals(3, f.u1);
Expect.equals(3, f.u2);
Expect.equals(4, f.v1);
Expect.equals(4, f.v2);
Expect.equals(4, f.v3);
Expect.equals(5, f.w);
f.x1 = 6;
Expect.equals(6, f.x1);
f.y2 = 7;
Expect.equals(7, f.y2);
f.v3 = 8;
Expect.equals(8, f.v3);
f.w = 9;
Expect.equals(9, f.w);
// Check that abstract declarations do not shadow superclass implementation.
Override o = Override();
Expect.equals("x", o.x);
Expect.equals(#x, o.lastName);
Expect.equals(0, o.y);
Expect.equals(#y, o.lastName);
o.x = "b";
Expect.equals(#x, o.lastName);
o.y = 42;
Expect.equals(#y, o.lastName);
Expect.equals("b", o.x);
Expect.equals(#x, o.lastName);
Expect.equals(42, o.y);
Expect.equals(#y, o.lastName);
}