// 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.

// @dart = 2.9

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