blob: 4d1640ef7761385fbe0f995c4c88d61d3816f326 [file] [log] [blame]
// 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.
/// @assertion Execution of a generative constructor k is always done with
/// respect to a set of bindings for its formal parameters and with this bound
/// to a fresh instance i and the type parameters of the immediately enclosing
/// class bound to a set of actual type arguments V1, ... , Vm.
/// If k is redirecting then its redirect clause has the form
/// this.g(a1, ..., an, xn+1: an+1, ..., xn+k: an+k)
/// where g identifies another generative constructor of the immediately
/// surrounding class. Then execution of k proceeds by evaluating the argument
/// list (a1, ..., an, xn+1: an+1, ..., xn+k: an+k) and then executing g with
/// respect to the bindings resulting from the evaluation of (a1, ..., an, xn+1:
/// an+1, ..., xn+k: an+k) and with this bound to i and the type parameters of
/// the immediately enclosing class bound to V1, ... , Vm.
/// Otherwise, execution proceeds as follows:
/// Any initializing formals declared in k's parameter list are executed in the
/// order they appear in the program text. Then, k's initializers are executed
/// in the order they appear in the program.
/// After all the initializers have completed, the body of k is executed in a
/// scope where this is bound to i. Execution of the body begins with execution
/// of the body of the superconstructor with this bound to i, the type
/// parameters of the immediately enclosing class bound to a set of actual type
/// arguments V1, ... , Vm and the formal parameter bindings determined by the
/// argument list of the superinitializer of k.
/// @description Checks that superconstructor intializers and superconstructor
/// body are executed in the correct order and before the body of this class's
/// constructor.
/// @author iefremov
import "../../../../Utils/expect.dart";
var log;
writeLog(var x) {
log = '$log$x';
}
class C {
C(this.a, this.b) : y = writeLog("y"), x = writeLog("x") {
writeLog("C");
Expect.equals("a", a, "Instance variable must be already initialized!");
Expect.equals("b", b, "Instance variable must be already initialized!");
}
C.named(this.a, this.b) : y = writeLog("y"), x = writeLog("x") {
writeLog("C.named");
Expect.equals("a", a, "Instance variable must be already initialized!");
Expect.equals("b", b, "Instance variable must be already initialized!");
}
C.rdr(a, b) : this(a, b);
var a;
var b;
var x;
var y;
}
class D extends C {
D() : d4 = writeLog("d4"), d3 = writeLog("d3"), super("a", "b") {
writeLog("D");
}
D.named() : d4 = writeLog("d4"), d3 = writeLog("d3"), super.named("a", "b") {
writeLog("D.named");
}
D.rdr() : this();
var d3;
var d4;
}
main() {
log = "";
var d = new D();
Expect.equals("d4d3yxCD", log);
log = "";
d = new D.named();
Expect.equals("d4d3yxC.namedD.named", log);
log = "";
d = new D.rdr();
Expect.equals("d4d3yxCD", log);
}