// Copyright (c) 2018, 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 Class1<T> {
  /*member: Class1.field:hasThis*/
  var field = /*fields=[T],free=[T],hasThis*/ () => T;

  /*member: Class1.funcField:hasThis*/
  Function? funcField;

  /*member: Class1.:hasThis*/
  Class1() {
    field = /*fields=[T],free=[T],hasThis*/ () => T;
  }

  /*member: Class1.setFunc:hasThis*/
  Class1.setFunc(this.funcField);

  /*member: Class1.fact:*/
  factory Class1.fact() => Class1<T>();

  /*member: Class1.fact2:*/
  factory Class1.fact2() =>
      Class1.setFunc(/*fields=[T],free=[T]*/ () => Set<T>());

  /*member: Class1.method1:hasThis*/
  method1() => T;

  /*member: Class1.method2:hasThis*/
  method2() {
    return /*fields=[this],free=[this],hasThis*/ () => T;
  }

  /*member: Class1.method3:hasThis*/
  method3<S>() => S;

  /*member: Class1.method4:hasThis*/
  method4<S>() {
    return /*fields=[S],free=[S],hasThis*/ () => S;
  }

  /*member: Class1.method5:hasThis*/
  method5() {
    /*hasThis*/ local<S>() {
      return /*fields=[S],free=[S],hasThis*/ () => S;
    }

    return local<double>();
  }

  /*member: Class1.method6:hasThis*/
  method6<S>() {
    /*fields=[S],free=[S],hasThis*/ local<U>() {
      return /*fields=[S,U],free=[S,U],hasThis*/ () => '$S$U';
    }

    var local2 =
        /*fields=[S,this],free=[S,this],hasThis*/
        (o) {
      return
          /*fields=[S,this],free=[S,this],hasThis*/
          () => Map<T, S>();
    };
    return local2(local<double>());
  }

  /*member: Class1.staticMethod1:*/
  static staticMethod1<S>() => S;

  /*member: Class1.staticMethod2:*/
  static staticMethod2<S>() {
    return /*fields=[S],free=[S]*/ () => S;
  }

  /*member: Class1.staticMethod3:*/
  static staticMethod3() {
    local<S>() {
      return /*fields=[S],free=[S]*/ () => S;
    }

    return local<double>();
  }

  /*member: Class1.staticMethod4:*/
  static staticMethod4<S>() {
    /*fields=[S],free=[S]*/ local<U>() {
      return /*fields=[S,U],free=[S,U]*/ () => '$S$U';
    }

    var local2 = /*fields=[S],free=[S]*/ (o) {
      return /*fields=[S],free=[S]*/ () => Set<S>();
    };
    return local2(local<double>());
  }
}

/*member: topLevelMethod1:*/
topLevelMethod1<S>() => S;

/*member: topLevelMethod2:*/
topLevelMethod2<S>() {
  return /*fields=[S],free=[S]*/ () => S;
}

/*member: topLevelMethod3:*/
topLevelMethod3() {
  local<S>() {
    return /*fields=[S],free=[S]*/ () => S;
  }

  return local<double>();
}

/*member: topLevelMethod4:*/
topLevelMethod4<S>() {
  /*fields=[S],free=[S]*/ local<U>() {
    return /*fields=[S,U],free=[S,U]*/ () => '$S$U';
  }

  var local2 = /*fields=[S],free=[S]*/ (o) {
    return /*fields=[S],free=[S]*/ () => Set<S>();
  };
  return local2(local<double>());
}

/*member: main:*/
main() {
  Class1<int>().method1();
  Class1<int>.fact().method2();
  Class1<int>.fact2().funcField!() is Set;
  Class1<int>().method3<double>();
  Class1<int>().method4<double>();
  Class1<int>().method5();
  Class1<int>().method6<double>();
  Class1.staticMethod1<double>();
  Class1.staticMethod2<double>();
  Class1.staticMethod3();
  Class1.staticMethod4<double>();
  topLevelMethod1<double>();
  topLevelMethod2<double>();
  topLevelMethod3();
  topLevelMethod4<double>();
}
