| // Copyright (c) 2014, 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. | 
 |  | 
 | import "package:expect/expect.dart"; | 
 |  | 
 | String toplevel = 'A'; | 
 |  | 
 | class Foo { | 
 |   String x = 'x'; | 
 |  | 
 |   easy(z) { | 
 |         return x + y + z; | 
 |         //         ^ | 
 |         // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_IDENTIFIER | 
 |         // [cfe] The getter 'y' isn't defined for the class 'Foo'. | 
 |   } | 
 |  | 
 |   // Shadow the 'y' field in various ways | 
 |   shadow_y_parameter(y) { | 
 |         return x + this.y + y; | 
 |         //              ^ | 
 |         // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER | 
 |         // [cfe] The getter 'y' isn't defined for the class 'Foo'. | 
 |   } | 
 |  | 
 |   shadow_y_local(z) { | 
 |     var y = z; | 
 |         return x + this.y + y; | 
 |         //              ^ | 
 |         // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER | 
 |         // [cfe] The getter 'y' isn't defined for the class 'Foo'. | 
 |   } | 
 |  | 
 |   shadow_y_capturedLocal(z) { | 
 |     var y = z; | 
 |     foo() { | 
 |             return x + this.y + y; | 
 |             //              ^ | 
 |             // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER | 
 |             // [cfe] The getter 'y' isn't defined for the class 'Foo'. | 
 |     } | 
 |     return foo(); | 
 |   } | 
 |  | 
 |   shadow_y_closureParam(z) { | 
 |     foo(y) { | 
 |             return x + this.y + y; | 
 |             //              ^ | 
 |             // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER | 
 |             // [cfe] The getter 'y' isn't defined for the class 'Foo'. | 
 |     } | 
 |     return foo(z); | 
 |   } | 
 |  | 
 |   shadow_y_localInsideClosure(z) { | 
 |     foo() { | 
 |       var y = z; | 
 |             return x + this.y + y; | 
 |             //              ^ | 
 |             // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER | 
 |             // [cfe] The getter 'y' isn't defined for the class 'Foo'. | 
 |     } | 
 |  | 
 |     return foo(); | 
 |   } | 
 |  | 
 |   // Shadow the 'x' field in various ways | 
 |   shadow_x_parameter(x) { | 
 |         return this.x + y + x; | 
 |         //              ^ | 
 |         // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_IDENTIFIER | 
 |         // [cfe] The getter 'y' isn't defined for the class 'Foo'. | 
 |   } | 
 |  | 
 |   shadow_x_local(z) { | 
 |     var x = z; | 
 |         return this.x + y + x; | 
 |         //              ^ | 
 |         // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_IDENTIFIER | 
 |         // [cfe] The getter 'y' isn't defined for the class 'Foo'. | 
 |   } | 
 |  | 
 |   shadow_x_capturedLocal(z) { | 
 |     var x = z; | 
 |     foo() { | 
 |             return this.x + y + x; | 
 |             //              ^ | 
 |             // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_IDENTIFIER | 
 |             // [cfe] The getter 'y' isn't defined for the class 'Foo'. | 
 |     } | 
 |     return foo(); | 
 |   } | 
 |  | 
 |   shadow_x_closureParam(z) { | 
 |     foo(x) { | 
 |             return this.x + y + x; | 
 |             //              ^ | 
 |             // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_IDENTIFIER | 
 |             // [cfe] The getter 'y' isn't defined for the class 'Foo'. | 
 |     } | 
 |     return foo(z); | 
 |   } | 
 |  | 
 |   shadow_x_localInsideClosure(z) { | 
 |     foo() { | 
 |       var x = z; | 
 |             return this.x + y + x; | 
 |             //              ^ | 
 |             // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_IDENTIFIER | 
 |             // [cfe] The getter 'y' isn't defined for the class 'Foo'. | 
 |     } | 
 |  | 
 |     return foo(); | 
 |   } | 
 |  | 
 |   shadow_x_toplevel() { | 
 |         return x + this.y + toplevel + this.toplevel; | 
 |         //              ^ | 
 |         // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER | 
 |         // [cfe] The getter 'y' isn't defined for the class 'Foo'. | 
 |         //                                  ^^^^^^^^ | 
 |         // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER | 
 |         // [cfe] The getter 'toplevel' isn't defined for the class 'Foo'. | 
 |   } | 
 | } | 
 |  | 
 | class Sub extends Foo { | 
 |   String y = 'y'; | 
 |   String toplevel = 'B'; | 
 | } | 
 |  | 
 | main() { | 
 |     Expect.equals('xyz', new Sub().easy('z')); | 
 |     Expect.equals('xyz', new Sub().shadow_y_parameter('z')); | 
 |     Expect.equals('xyz', new Sub().shadow_y_local('z')); | 
 |     Expect.equals('xyz', new Sub().shadow_y_capturedLocal('z')); | 
 |     Expect.equals('xyz', new Sub().shadow_y_closureParam('z')); | 
 |     Expect.equals('xyz', new Sub().shadow_y_localInsideClosure('z')); | 
 |     Expect.equals('xyz', new Sub().shadow_x_parameter('z')); | 
 |     Expect.equals('xyz', new Sub().shadow_x_local('z')); | 
 |     Expect.equals('xyz', new Sub().shadow_x_capturedLocal('z')); | 
 |     Expect.equals('xyz', new Sub().shadow_x_closureParam('z')); | 
 |     Expect.equals('xyz', new Sub().shadow_x_localInsideClosure('z')); | 
 |  | 
 |     Expect.equals('xyAB', new Sub().shadow_x_toplevel()); | 
 | } |