| // 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); |
| } |