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