blob: 2354aa647093817fa48b23b065f4c5b9fc12c7e0 [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 the constructor body is executed after all
* initializers and 'this' reference as well as all instance fields are
* accessible in the constructor body.
* @author iefremov
* @needsreview It seems to be impossible to verify the order initialized
* variable declarations are processed because we can't invoke any methods
* there which would help observe the exact sequence. Same about the
* initializing formals.
*/
import "../../../../Utils/expect.dart";
class C {
C(this.f) : c = "c", d = "d", e = "e" {
Expect.equals(1, a, "Instance variable should already be initialized!");
Expect.equals("You are not paid to think!", this.b,
"Instance variable should already be initialized!");
Expect.equals("c", this.c,
"Instance variable should already be initialized!");
Expect.equals("d", d, "Instance variable should already be initialized!");
Expect.equals("e", e, "Instance variable should already be initialized!");
Expect.equals("f", f, "Instance variable should already be initialized!");
}
var e, d, c;
var f;
var a = 1;
final b = "You are not paid to think!";
}
main() {
new C("f");
}