// 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. // Test compile-time errors for illegal variable declarations if the name // has been referenced before the variable is declared. import 'dart:math' as math; use(value) => value; var x = 0; final y = 0; class C { var f; C() : f = 'How do you spell PTSD?'; void test1() { use(f); // Refers to instance field f. // ^ // [analyzer] COMPILE_TIME_ERROR.REFERENCED_BEFORE_DECLARATION // [cfe] Local variable 'f' can't be referenced before it is declared. var f = 'A shut mouth gathers no foot.'; } void test2() { void localFunc() { use(f); // Refers to instance field f. // ^ // [analyzer] COMPILE_TIME_ERROR.REFERENCED_BEFORE_DECLARATION // [cfe] Local variable 'f' can't be referenced before it is declared. } var f = 'When chemists die, they barium.'; if (true) { var f = 1; // ok, shadows outer f and instance field f. } } void test3() { if (true) { use(x); // Refers to top-level x. // ^ // [analyzer] COMPILE_TIME_ERROR.READ_POTENTIALLY_UNASSIGNED_FINAL // [analyzer] COMPILE_TIME_ERROR.REFERENCED_BEFORE_DECLARATION // [cfe] Local variable 'x' can't be referenced before it is declared. use(y); // Refers to top-level y. // ^ // [analyzer] COMPILE_TIME_ERROR.REFERENCED_BEFORE_DECLARATION // [cfe] Local variable 'y' can't be referenced before it is declared. } final x = "I have not yet begun to procrastinate."; const y = "Honk if you like peace and quiet!"; } void test4() { void Q() { P(); // Refers to non-existing top-level function P // [error column 7, length 1] // [analyzer] COMPILE_TIME_ERROR.REFERENCED_BEFORE_DECLARATION // [cfe] Local variable 'P' can't be referenced before it is declared. // [cfe] The method 'P' isn't defined for the type 'C'. } void P() { Q(); } Function f = () { x = f; // ^ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT // [analyzer] COMPILE_TIME_ERROR.REFERENCED_BEFORE_DECLARATION // [cfe] Local variable 'f' can't be referenced before it is declared. }; } test() { test1(); test2(); test3(); test4(); } } void testTypeRef() { String s = 'Can vegetarians eat animal crackers?'; // [error column 3, length 6] // [analyzer] COMPILE_TIME_ERROR.REFERENCED_BEFORE_DECLARATION // [cfe] Local variable 'String' can't be referenced before it is declared. var String = "I distinctly remember forgetting that."; } void testLibPrefix() { var pie = math.pi; // ^^^^ // [analyzer] COMPILE_TIME_ERROR.READ_POTENTIALLY_UNASSIGNED_FINAL // [analyzer] COMPILE_TIME_ERROR.REFERENCED_BEFORE_DECLARATION // [cfe] Local variable 'math' can't be referenced before it is declared. final math = 0; } void noErrorsExpected() { use(x); for (var x = 0; x < 10; x++) use(x); for (var i = 0; i < 10; i++) var x = 0; if (true) var x = 0; while (false) var x = 0; try { throw "ball"; } catch (x) { use(x); } switch (x) { case 0: var x = 'Does fuzzy logic tickle?'; } var int = 007; } void main() { var c = new C(); c.test(); testTypeRef(); testLibPrefix(); noErrorsExpected(); }