var result;

extension Extension on int {
  static int staticMethod() => 1;
  static int staticMethod() => 2;
  static int get staticGetter => 1;
  static int get staticGetter => 2;
  static void set staticSetter(value) {}
  static void set staticSetter(value) {}
  static int staticField = 1;
  static int staticField = 2;
  static int staticFieldAndSetter1 = 1;
  static void set staticFieldAndSetter1(int value) {}
  static void set staticFieldAndSetter2(int value) {}
  static int staticFieldAndSetter2 = 1;
  static late final int staticLateFinalFieldAndSetter1;
  static void set staticLateFinalFieldAndSetter1(int value) {}
  static void set staticLateFinalFieldAndSetter2(int value) {}
  static late final int staticLateFinalFieldAndSetter2;
  static final int staticDuplicateFieldAndSetter = 1;
  static final int staticDuplicateFieldAndSetter = 2;
  static void set staticDuplicateFieldAndSetter(int value) {}
  static final int staticFieldAndDuplicateSetter = 1;
  static void set staticFieldAndDuplicateSetter(int value) {}
  static void set staticFieldAndDuplicateSetter(int value) {}
  static final int staticDuplicateFieldAndDuplicateSetter = 1;
  static final int staticDuplicateFieldAndDuplicateSetter = 2;
  static void set staticDuplicateFieldAndDuplicateSetter(int value) {}
  static void set staticDuplicateFieldAndDuplicateSetter(int value) {}
  static int staticMethodAndSetter1() => 1;
  static void set staticMethodAndSetter1(int value) {}
  static void set staticMethodAndSetter2(int value) {}
  static int staticMethodAndSetter2() => 1;
}

test() {}
main() {}
expect(expected, actual) {}
throws(dynamic Function() f) {}
