// Copyright (c) 2019, 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";

///////////////////////////////////////////////////////////////////////
// The following tests check that setters or getters in an extension
// correctly shadow members with the same basename in the surrounding
// scope.
///////////////////////////////////////////////////////////////////////

String get topLevelGetter => "-1";
void set topLevelSetter(String _) {}
String topLevelField = "-3";
String topLevelMethod(String x) => "-4";

// Location that extension setters write to.
int _storeTo = null;
// Check that the most recent setter call set the value
// of _storeTo.
void checkSetter(int x) {
  int written = _storeTo;
  _storeTo = null;
  Expect.equals(written, x);
}

// Check that an instance getter in an extension shadows top level
// members with the same basename.
extension E1 on A1 {
  int get topLevelSetter => 1;
  int get topLevelField => 2;
  int get topLevelMethod => 3;
  void test() {
    // Reading the local getters is valid
    Expect.equals(topLevelSetter + 1, 2);
    Expect.equals(topLevelField + 1, 3);
    Expect.equals(topLevelMethod + 1, 4);
  }
}

class A1 {}

// Check that an instance setter in an extension shadows top level
// members with the same basename.
extension E2 on A2 {
  void set topLevelGetter(int x) {
    _storeTo = x;
  }

  void set topLevelField(int x) {
    _storeTo = x;
  }

  void set topLevelMethod(int x) {
    _storeTo = x;
  }

  void test() {
    checkSetter(topLevelGetter = 42);
    checkSetter(topLevelField = 42);
    checkSetter(topLevelMethod = 42);
  }
}

class A2 {}

// Check that a static getter in an extension shadows top level
// members with the same basename.
extension E3 on A3 {
  static int get topLevelSetter => 1;
  static int get topLevelField => 2;
  static int get topLevelMethod => 3;
  void test() {
    // Reading the local getters is valid
    Expect.equals(topLevelSetter + 1, 2);
    Expect.equals(topLevelField + 1, 3);
    Expect.equals(topLevelMethod + 1, 4);
  }
}

class A3 {}

// Check that a static setter in an extension shadows top level
// members with the same basename.
extension E4 on A4 {
  static void set topLevelGetter(int x) {
    _storeTo = x;
  }

  static void set topLevelField(int x) {
    _storeTo = x;
  }

  static void set topLevelMethod(int x) {
    _storeTo = x;
  }

  void test() {
    checkSetter(topLevelGetter = 42);
    checkSetter(topLevelField = 42);
    checkSetter(topLevelMethod = 42);
  }
}

class A4 {}

// Define extensions on A6.
extension E5 on A6 {
  void set extensionSetter(int x) {}
  int extensionMethod(int x) => -3;
}

// Check that an instance getter in an extension shadows extension
// members with the same basename from a different extension.
extension E6 on A6 {
  int get extensionSetter => 1;
  int get extensionMethod => 3;
  void test() {
    // Reading the local getters is valid
    Expect.equals(extensionSetter + 1, 2);
    Expect.equals(extensionMethod + 1, 4);
  }
}

class A6 {}

// Check that an instance getter in a class shadows extension
// members with the same basename from extension E5.
class A7 extends A6 {
  int get extensionSetter => 1;
  int get extensionMethod => 3;
  void test() {
    // Reading the local getters is valid
    Expect.equals(extensionSetter + 1, 2);
    Expect.equals(extensionMethod + 1, 4);
  }
}

// Define extensions on A8.
extension E7 on A8 {
  int get extensionGetter => -1;
  int extensionMethod(int x) => -3;
}

// Check that an instance setter in an extension shadows extension
// members with the same basename from a different extension.
extension E8 on A8 {
  void set extensionGetter(int x) {
    _storeTo = x;
  }

  void set extensionMethod(int x) {
    _storeTo = x;
  }

  void test() {
    checkSetter(extensionGetter = 42);
    checkSetter(extensionMethod = 42);
  }
}

class A8 {}

// Check that an instance setter in a class shadows extension
// members with the same basename from extension E7.
class A9 extends A8 {
  void set extensionGetter(int x) {
    _storeTo = x;
  }

  void set extensionMethod(int x) {
    _storeTo = x;
  }

  void test() {
    checkSetter(extensionGetter = 42);
    checkSetter(extensionMethod = 42);
  }
}

// Define extensions on A10.
extension E9 on A10 {
  void set extensionSetter(int x) {}
  void set extensionFieldSetter(int x) {}
  int extensionMethod(int x) => -3;
}

// Check that a static getter in an extension shadows extension
// members with the same basename from a different extension.
extension E10 on A10 {
  static int get extensionSetter => 1;
  static final int extensionFieldSetter = 2;
  static int get extensionMethod => 3;
  void test() {
    // Reading the local getters is valid
    Expect.equals(extensionSetter + 1, 2);
    Expect.equals(extensionFieldSetter + 1, 3);
    Expect.equals(extensionMethod + 1, 4);
  }
}

class A10 {}

// Check that a static getter in a class shadows extension
// members with the same basename from extension E9.
class A11 extends A10 {
  static int get extensionSetter => 1;
  static final int extensionFieldSetter = 2;
  static int get extensionMethod => 3;
  void test() {
    // Reading the local getters is valid
    Expect.equals(extensionSetter + 1, 2);
    Expect.equals(extensionFieldSetter + 1, 3);
    Expect.equals(extensionMethod + 1, 4);
  }
}

// Define extensions on A12.
extension E11 on A12 {
  int get extensionGetter => -1;
  int extensionMethod(int x) => -3;
}

// Check that a static setter in an extension shadows extension
// members with the same basename from a different extension.
extension E12 on A12 {
  static void set extensionGetter(int x) {
    _storeTo = x;
  }

  static void set extensionMethod(int x) {
    _storeTo = x;
  }

  void test() {
    checkSetter(extensionGetter = 42);
    checkSetter(extensionMethod = 42);
  }
}

class A12 {}

// Check that a static setter in a class shadows extension
// members with the same basename from extension E11.
class A13 extends A12 {
  static void set extensionGetter(int x) {
    _storeTo = x;
  }

  static void set extensionMethod(int x) {
    _storeTo = x;
  }

  void test() {
    checkSetter(extensionGetter = 42);
    checkSetter(extensionMethod = 42);
  }
}

void main() {
  A1().test();
  A2().test();
  A3().test();
  A4().test();
  A6().test();
  A7().test();
  A8().test();
  A9().test();
  A10().test();
  A11().test();
  A12().test();
  A13().test();
}
