| // Copyright (c) 2013, 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. |
| |
| library test.constructor_kinds_test; |
| |
| @MirrorsUsed(targets: "test.constructor_kinds_test") |
| import 'dart:mirrors'; |
| import 'package:expect/expect.dart'; |
| |
| class ClassWithDefaultConstructor {} |
| |
| class Class { |
| Class.generativeConstructor(); |
| Class.redirectingGenerativeConstructor() : this.generativeConstructor(); |
| factory Class.factoryConstructor() => new Class.generativeConstructor(); |
| factory Class.redirectingFactoryConstructor() = Class.factoryConstructor; |
| |
| const Class.constGenerativeConstructor(); |
| const Class.constRedirectingGenerativeConstructor() |
| : this.constGenerativeConstructor(); |
| // Not legal. |
| // const factory Class.constFactoryConstructor() => ... |
| const factory Class.constRedirectingFactoryConstructor() = |
| Class.constGenerativeConstructor; |
| } |
| |
| main() { |
| ClassMirror cm; |
| MethodMirror mm; |
| |
| // Multitest with and without constructor calls. On the VM, we want to check |
| // that constructor properties are correctly set even if the constructor |
| // hasn't been fully compiled. On dart2js, we want to check that constructors |
| // are retain even if there are no base-level calls. |
| new ClassWithDefaultConstructor(); // //# 01: ok |
| new Class.generativeConstructor(); // //# 01: ok |
| new Class.redirectingGenerativeConstructor(); // //# 01: ok |
| new Class.factoryConstructor(); // //# 01: ok |
| new Class.redirectingFactoryConstructor(); // //# 01: ok |
| const Class.constGenerativeConstructor(); // //# 01: ok |
| const Class.constRedirectingGenerativeConstructor(); // //# 01: ok |
| const Class.constRedirectingFactoryConstructor(); // //# 01: ok |
| |
| cm = reflectClass(ClassWithDefaultConstructor); |
| mm = cm.declarations.values |
| .where((d) => d is MethodMirror && d.isConstructor) |
| .single; |
| Expect.isTrue(mm.isConstructor); |
| Expect.isTrue(mm.isGenerativeConstructor); |
| Expect.isFalse(mm.isFactoryConstructor); |
| Expect.isFalse(mm.isRedirectingConstructor); |
| Expect.isFalse(mm.isConstConstructor); |
| |
| cm = reflectClass(Class); |
| |
| mm = cm.declarations[#Class.generativeConstructor]; |
| Expect.isTrue(mm.isConstructor); |
| Expect.isTrue(mm.isGenerativeConstructor); |
| Expect.isFalse(mm.isFactoryConstructor); |
| Expect.isFalse(mm.isRedirectingConstructor); |
| Expect.isFalse(mm.isConstConstructor); |
| |
| mm = cm.declarations[#Class.redirectingGenerativeConstructor]; |
| Expect.isTrue(mm.isConstructor); |
| Expect.isTrue(mm.isGenerativeConstructor); |
| Expect.isFalse(mm.isFactoryConstructor); |
| Expect.isTrue(mm.isRedirectingConstructor); |
| Expect.isFalse(mm.isConstConstructor); |
| |
| mm = cm.declarations[#Class.factoryConstructor]; |
| Expect.isTrue(mm.isConstructor); |
| Expect.isFalse(mm.isGenerativeConstructor); |
| Expect.isTrue(mm.isFactoryConstructor); |
| Expect.isFalse(mm.isRedirectingConstructor); |
| Expect.isFalse(mm.isConstConstructor); |
| |
| mm = cm.declarations[#Class.redirectingFactoryConstructor]; |
| Expect.isTrue(mm.isConstructor); |
| Expect.isFalse(mm.isGenerativeConstructor); |
| Expect.isTrue(mm.isFactoryConstructor); |
| Expect.isTrue(mm.isRedirectingConstructor); |
| Expect.isFalse(mm.isConstConstructor); |
| |
| mm = cm.declarations[#Class.constGenerativeConstructor]; |
| Expect.isTrue(mm.isConstructor); |
| Expect.isTrue(mm.isGenerativeConstructor); |
| Expect.isFalse(mm.isFactoryConstructor); |
| Expect.isFalse(mm.isRedirectingConstructor); |
| Expect.isTrue(mm.isConstConstructor); |
| |
| mm = cm.declarations[#Class.constRedirectingGenerativeConstructor]; |
| Expect.isTrue(mm.isConstructor); |
| Expect.isTrue(mm.isGenerativeConstructor); |
| Expect.isFalse(mm.isFactoryConstructor); |
| Expect.isTrue(mm.isRedirectingConstructor); |
| Expect.isTrue(mm.isConstConstructor); |
| |
| // Not legal. |
| // mm = cm.declarations[#Class.constFactoryConstructor]; |
| // Expect.isTrue(mm.isConstructor); |
| // Expect.isFalse(mm.isGenerativeConstructor); |
| // Expect.isTrue(mm.isFactoryConstructor); |
| // Expect.isFalse(mm.isRedirectingConstructor); |
| // Expect.isTrue(mm.isConstConstructor); |
| |
| mm = cm.declarations[#Class.constRedirectingFactoryConstructor]; |
| Expect.isTrue(mm.isConstructor); |
| Expect.isFalse(mm.isGenerativeConstructor); |
| Expect.isTrue(mm.isFactoryConstructor); |
| Expect.isTrue(mm.isRedirectingConstructor); |
| Expect.isTrue(mm.isConstConstructor); |
| } |