// Copyright (c) 2013, 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.

library test.generic_function_typedef;

import 'dart:mirrors';

import 'package:expect/expect.dart';

import 'generics_helper.dart';

class C<T> {
  makeClosure1() {
    T closure1(T t) => t;
    return closure1;
  }

  makeClosure2() {
    enclosing() {
      T closure2(T t) => t;
      return closure2;
    }

    ;
    return enclosing();
  }
}

main() {
  ClosureMirror closure1 =
      reflect(new C<String>().makeClosure1()) as ClosureMirror;
  Expect.equals(reflectClass(String), closure1.function.returnType);
  Expect.equals(reflectClass(String), closure1.function.parameters[0].type);

  ClosureMirror closure2 =
      reflect(new C<String>().makeClosure2()) as ClosureMirror;
  Expect.equals(reflectClass(String), closure2.function.returnType);
  Expect.equals(reflectClass(String), closure2.function.parameters[0].type);
}
