| // Copyright (c) 2011, 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.7 |
| |
| import "package:expect/expect.dart"; |
| |
| // A plain class that implements many fields. |
| class A { |
| var fieldA1 = 0x1; |
| var fieldA2 = 0x2; |
| var fieldA3 = 0x4; |
| var fieldA4 = 0x8; |
| |
| var fieldB1 = 0x10; |
| var fieldB2 = 0x20; |
| var fieldB3 = 0x40; |
| var fieldB4 = 0x80; |
| |
| var fieldC1 = 0x100; |
| var fieldC2 = 0x200; |
| var fieldC3 = 0x400; |
| var fieldC4 = 0x800; |
| |
| var fieldD1 = 0x1000; |
| var fieldD2 = 0x2000; |
| var fieldD3 = 0x4000; |
| var fieldD4 = 0x8000; |
| |
| var fieldXA1 = 0x1; |
| var fieldXA2 = 0x2; |
| var fieldXA3 = 0x4; |
| var fieldXA4 = 0x8; |
| |
| var fieldXB1 = 0x10; |
| var fieldXB2 = 0x20; |
| var fieldXB3 = 0x40; |
| var fieldXB4 = 0x80; |
| |
| var fieldXC1 = 0x1; |
| var fieldXC2 = 0x2; |
| var fieldXC3 = 0x4; |
| var fieldXC4 = 0x8; |
| |
| var fieldXD1 = 0x10; |
| var fieldXD2 = 0x20; |
| var fieldXD3 = 0x40; |
| var fieldXD4 = 0x80; |
| |
| var fieldYA1 = 0x1; |
| var fieldYA2 = 0x200; |
| var fieldYA3 = 0x400; |
| var fieldYA4 = 0x800; |
| |
| var fieldYB1 = 0x10; |
| var fieldYB2 = 0x200; |
| var fieldYB3 = 0x400; |
| var fieldYB4 = 0x800; |
| |
| var fieldYC1 = 0x100; |
| var fieldYC2 = 0x2000; |
| var fieldYC3 = 0x4000; |
| var fieldYC4 = 0x8000; |
| |
| var fieldYD1 = 0x1000; |
| var fieldYD2 = 0x2000; |
| var fieldYD3 = 0x4000; |
| var fieldYD4 = 0x8000; |
| } |
| |
| // Implementing the same fields using inheritance and a mixin. |
| class B { |
| var fieldA1 = 0x0011; |
| var fieldA2 = 0x0002; |
| var fieldA3 = 0x0044; |
| var fieldA4 = 0x0008; |
| |
| var fieldB1 = 0x0010; |
| var fieldB2 = 0x0220; |
| var fieldB3 = 0x0040; |
| var fieldB4 = 0x0880; |
| |
| var fieldC1 = 0x0101; |
| var fieldC2 = 0x0200; |
| var fieldC3 = 0x0404; |
| var fieldC4 = 0x0810; |
| |
| var fieldD1 = 0x1000; |
| var fieldD2 = 0x2204; |
| var fieldD3 = 0x4040; |
| var fieldD4 = 0x8801; |
| } |
| |
| class C { |
| var fieldXA1 = 0x8001; |
| var fieldXA2 = 0x4002; |
| var fieldXA3 = 0x2004; |
| var fieldXA4 = 0x1008; |
| |
| var fieldXB1 = 0x810; |
| var fieldXB2 = 0x420; |
| var fieldXB3 = 0x240; |
| var fieldXB4 = 0x180; |
| |
| var fieldXC1 = 0x180; |
| var fieldXC2 = 0x240; |
| var fieldXC3 = 0x420; |
| var fieldXC4 = 0x810; |
| |
| var fieldXD1 = 0x1008; |
| var fieldXD2 = 0x2004; |
| var fieldXD3 = 0x4002; |
| var fieldXD4 = 0x8001; |
| } |
| |
| class D extends B with C { |
| var fieldYA1 = 0x8001; |
| var fieldYA2 = 0x4002; |
| var fieldYA3 = 0x2004; |
| var fieldYA4 = 0x0008; |
| |
| var fieldYB1 = 0x810; |
| var fieldYB2 = 0x420; |
| var fieldYB3 = 0x240; |
| var fieldYB4 = 0x080; |
| |
| var fieldYC1 = 0x180; |
| var fieldYC2 = 0x240; |
| var fieldYC3 = 0x420; |
| var fieldYC4 = 0x800; |
| |
| var fieldYD1 = 0x1008; |
| var fieldYD2 = 0x2004; |
| var fieldYD3 = 0x4002; |
| var fieldYD4 = 0x8000; |
| } |
| |
| // Mix in the mixin into the full implementation, shadowing some fields. |
| class E extends A with C {} |
| |
| // Another mixin for block C. |
| class F { |
| var fieldYA1 = 0x0001; |
| var fieldYA2 = 0x1022; |
| var fieldYA3 = 0x0004; |
| var fieldYA4 = 0x0088; |
| |
| var fieldYB1 = 0x0410; |
| var fieldYB2 = 0x0022; |
| var fieldYB3 = 0x0040; |
| var fieldYB4 = 0x0880; |
| |
| var fieldYC1 = 0x1001; |
| var fieldYC2 = 0x2200; |
| var fieldYC3 = 0x4400; |
| var fieldYC4 = 0x8800; |
| |
| var fieldYD1 = 0x1108; |
| var fieldYD2 = 0x2200; |
| var fieldYD3 = 0x4044; |
| var fieldYD4 = 0x8001; |
| } |
| |
| // Use two mixins in a single class. |
| class G extends B with C, F {} |
| |
| bool checkFields(cls) { |
| var blockA = cls.fieldA1 ^ |
| cls.fieldA2 ^ |
| cls.fieldA3 ^ |
| cls.fieldA4 ^ |
| cls.fieldB1 ^ |
| cls.fieldB2 ^ |
| cls.fieldB3 ^ |
| cls.fieldB4 ^ |
| cls.fieldC1 ^ |
| cls.fieldC2 ^ |
| cls.fieldC3 ^ |
| cls.fieldC4 ^ |
| cls.fieldD1 ^ |
| cls.fieldD2 ^ |
| cls.fieldD3 ^ |
| cls.fieldD4; |
| var blockB = cls.fieldXA1 ^ |
| cls.fieldXA2 ^ |
| cls.fieldXA3 ^ |
| cls.fieldXA4 ^ |
| cls.fieldXB1 ^ |
| cls.fieldXB2 ^ |
| cls.fieldXB3 ^ |
| cls.fieldXB4 ^ |
| cls.fieldXC1 ^ |
| cls.fieldXC2 ^ |
| cls.fieldXC3 ^ |
| cls.fieldXC4 ^ |
| cls.fieldXD1 ^ |
| cls.fieldXD2 ^ |
| cls.fieldXD3 ^ |
| cls.fieldXD4; |
| var blockC = cls.fieldYA1 ^ |
| cls.fieldYA2 ^ |
| cls.fieldYA3 ^ |
| cls.fieldYA4 ^ |
| cls.fieldYB1 ^ |
| cls.fieldYB2 ^ |
| cls.fieldYB3 ^ |
| cls.fieldYB4 ^ |
| cls.fieldYC1 ^ |
| cls.fieldYC2 ^ |
| cls.fieldYC3 ^ |
| cls.fieldYC4 ^ |
| cls.fieldYD1 ^ |
| cls.fieldYD2 ^ |
| cls.fieldYD3 ^ |
| cls.fieldYD4; |
| return blockA == 0xFFFF && blockB == 0x0000 && blockC == 0x1111; |
| } |
| |
| main() { |
| var instances = [new A(), new D(), new E(), new G()]; |
| for (var instance in instances) { |
| Expect.isTrue(checkFields(instance)); |
| } |
| } |