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

class Class<T> {
  static var field;
}

extension Extension<T> on Class<T> {

  static get property => Class.field;

  static set property(value) {
    Class.field = value;
  }

  static var field;

  static readGetter() {
    return property;
  }

  static writeSetterRequired(value) {
    property = value;
  }

  static writeSetterOptional([value]) {
    property = value;
  }

  static writeSetterNamed({value}) {
    property = value;
  }

  static genericWriteSetterRequired<S>(S value) {
    property = value;
  }

  static genericWriteSetterOptional<S>([S? value]) {
    property = value;
  }

  static genericWriteSetterNamed<S>({S? value}) {
    property = value;
  }

  static get tearOffGetterNoArgs => readGetter;
  static get tearOffGetterRequired => writeSetterRequired;
  static get tearOffGetterOptional => writeSetterOptional;
  static get tearOffGetterNamed => writeSetterNamed;
  static get tearOffGetterGenericRequired => genericWriteSetterRequired;
  static get tearOffGetterGenericOptional => genericWriteSetterOptional;
  static get tearOffGetterGenericNamed => genericWriteSetterNamed;

  static invocationsFromStaticContext(int value) {
    readGetter();
    writeSetterRequired(value);
    writeSetterOptional();
    writeSetterOptional(value);
    writeSetterNamed();
    writeSetterNamed(value: value);
    genericWriteSetterRequired(value);
    genericWriteSetterRequired<int>(value);
    genericWriteSetterOptional();
    genericWriteSetterOptional<int>();
    genericWriteSetterOptional(value);
    genericWriteSetterOptional<int>(value);
    genericWriteSetterNamed();
    genericWriteSetterNamed<int>();
    genericWriteSetterNamed(value: value);
    genericWriteSetterNamed<int>(value: value);
  }

  static tearOffsFromStaticContext(int value) {
    var tearOffNoArgs = readGetter;
    tearOffNoArgs();
    var tearOffRequired = writeSetterRequired;
    tearOffRequired(value);
    var tearOffOptional = writeSetterOptional;
    tearOffOptional();
    tearOffOptional(value);
    var tearOffNamed = writeSetterNamed;
    tearOffNamed();
    tearOffNamed(value: value);
    var tearOffGenericRequired = genericWriteSetterRequired;
    tearOffGenericRequired(value);
    tearOffGenericRequired<int>(value);
    var tearOffGenericOptional = genericWriteSetterOptional;
    tearOffGenericOptional();
    tearOffGenericOptional<int>();
    tearOffGenericOptional(value);
    tearOffGenericOptional<int>(value);
    var tearOffGenericNamed = genericWriteSetterNamed;
    tearOffGenericNamed();
    tearOffGenericNamed<int>();
    tearOffGenericNamed(value: value);
    tearOffGenericNamed<int>(value: value);
  }

  static fieldAccessFromStaticContext() {
    field = property;
    property = field;
  }

  static getterCallsFromStaticContext(int value) {
    tearOffGetterNoArgs();
    tearOffGetterRequired(value);
    tearOffGetterOptional();
    tearOffGetterOptional(value);
    tearOffGetterNamed();
    tearOffGetterNamed(value: value);
    tearOffGetterGenericRequired(value);
    tearOffGetterGenericRequired<int>(value);
    tearOffGetterGenericOptional();
    tearOffGetterGenericOptional<int>();
    tearOffGetterGenericOptional(value);
    tearOffGetterGenericOptional<int>(value);
    tearOffGetterGenericNamed();
    tearOffGetterGenericNamed<int>();
    tearOffGetterGenericNamed(value: value);
    tearOffGetterGenericNamed<int>(value: value);
  }

  invocationsFromInstanceContext(T value) {
    readGetter();
    writeSetterRequired(value);
    writeSetterOptional();
    writeSetterOptional(value);
    writeSetterNamed();
    writeSetterNamed(value: value);
    genericWriteSetterRequired(value);
    genericWriteSetterRequired<T>(value);
    genericWriteSetterOptional();
    genericWriteSetterOptional<T>();
    genericWriteSetterOptional(value);
    genericWriteSetterOptional<T>(value);
    genericWriteSetterNamed();
    genericWriteSetterNamed<T>();
    genericWriteSetterNamed(value: value);
    genericWriteSetterNamed<T>(value: value);
  }

  tearOffsFromInstanceContext(T value) {
    var tearOffNoArgs = readGetter;
    tearOffNoArgs();
    var tearOffRequired = writeSetterRequired;
    tearOffRequired(value);
    var tearOffOptional = writeSetterOptional;
    tearOffOptional();
    tearOffOptional(value);
    var tearOffNamed = writeSetterNamed;
    tearOffNamed();
    tearOffNamed(value: value);
    var tearOffGenericRequired = genericWriteSetterRequired;
    tearOffGenericRequired(value);
    tearOffGenericRequired<T>(value);
    var tearOffGenericOptional = genericWriteSetterOptional;
    tearOffGenericOptional();
    tearOffGenericOptional<T>();
    tearOffGenericOptional(value);
    tearOffGenericOptional<T>(value);
    var tearOffGenericNamed = genericWriteSetterNamed;
    tearOffGenericNamed();
    tearOffGenericNamed<T>();
    tearOffGenericNamed(value: value);
    tearOffGenericNamed<T>(value: value);
  }

  fieldAccessFromInstanceContext() {
    field = property;
    property = field;
  }

  getterCallsFromInstanceContext(T value) {
    tearOffGetterNoArgs();
    tearOffGetterRequired(value);
    tearOffGetterOptional();
    tearOffGetterOptional(value);
    tearOffGetterNamed();
    tearOffGetterNamed(value: value);
    tearOffGetterGenericRequired(value);
    tearOffGetterGenericRequired<T>(value);
    tearOffGetterGenericOptional();
    tearOffGetterGenericOptional<T>();
    tearOffGetterGenericOptional(value);
    tearOffGetterGenericOptional<T>(value);
    tearOffGetterGenericNamed();
    tearOffGetterGenericNamed<T>();
    tearOffGetterGenericNamed(value: value);
    tearOffGetterGenericNamed<T>(value: value);
  }
}

main() {}