// 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; 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 as MethodMirror; 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] as MethodMirror; 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] as MethodMirror; 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] as MethodMirror; 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] as MethodMirror; 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] as MethodMirror; 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] as MethodMirror; 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] as MethodMirror; // 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] as MethodMirror; Expect.isTrue(mm.isConstructor); Expect.isFalse(mm.isGenerativeConstructor); Expect.isTrue(mm.isFactoryConstructor); Expect.isTrue(mm.isRedirectingConstructor); Expect.isTrue(mm.isConstConstructor); }