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