| /* |
| * 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 Let d be the declaration of a variable v. If d is a local or |
| * instance variable, then the invocation of the implicit getter of v |
| * evaluates to the value stored in v. |
| * If d is a static or library variable then the implicit getter method of v |
| * executes as follows: |
| * Non-constant variable declaration with initializer. If d is of one of the |
| * forms var v = e; , T v = e; , final v = e; , final T v = e; , static v = e; |
| * ,static T v = e; , static final v = e; or static final T v = e; and no |
| * value has yet been stored into v then the initializer expression e is |
| * evaluated. If, during the evaluation of e, the getter for v is invoked, |
| * a CyclicInitializationError is thrown. If the evaluation succeeded yielding |
| * an object o, let r = o, otherwise let r = null. In any case, r is stored |
| * into v. The result of executing the getter is r. |
| * Constant variable declaration. If d is of one of the forms const v = e; , |
| * const T v = e; , static const v = e; or static const T v = e; the result |
| * of the getter is the value of the compile time constant e. Note that a |
| * compile time constant cannot depend on itself, so no cyclic references can |
| * occur. Otherwise |
| * Variable declaration without initializer. The result of executing the |
| * getter method is the value stored in v. |
| * @description Checks the result of the getter and that the initializer |
| * expression is evaluated only once. |
| * @author msyabro |
| * @reviewer iefremov |
| */ |
| import "../../Utils/expect.dart"; |
| |
| String log = ""; |
| |
| writeLog(int i) { |
| log = "${log}${i}"; |
| return i; |
| } |
| |
| class C { |
| static var a = writeLog(1); |
| static int b = writeLog(2); |
| static final c = writeLog(3); |
| static final int d = writeLog(4); |
| } |
| |
| main() { |
| Expect.equals(4, C.d); |
| Expect.equals(1, C.a); |
| Expect.equals(2, C.b); |
| Expect.equals(3, C.c); |
| |
| Expect.equals("4123", log, "Lazy static getters execution was wrong!"); |
| } |