|  | // 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()); | 
|  | } |