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

// dart2jsOptions=--strong

import 'package:expect/expect.dart';

class Class1 {
  method1() {
    num local<T>(num n) => null;
    return local;
  }

  method2() {
    num local<T>(int n) => null;
    return local;
  }

  method3() {
    int local<T>(num n) => null;
    return local;
  }
}

class Class2 {
  method4<T>() {
    num local(T n) => null;
    return local;
  }
}

class Class3 {
  method5<T>() {
    T local(num n) => null;
    return local;
  }
}

class Class4 {
  method6<T>() {
    num local(num n, T t) => null;
    return local;
  }
}

method7<T>() {
  num local(T n) => null;
  return local;
}

method8<T>() {
  T local(num n) => null;
  return local;
}

method9<T>() {
  num local(num n, T t) => null;
  return local;
}

method10() {
  num local<T>(T n) => null;
  return local;
}

method11() {
  T local<T>(num n) => null;
  return local;
}

method12() {
  num local<T>(num n, T t) => null;
  return local;
}

num Function(num) //# 01: ok
    method13() {
  num local<T>(num n) => null;
  return local;
}

num Function(num) //# 01: continued
    method14() {
  num local<T>(T n) => null;
  return local;
}

num Function(num) //# 01: continued
    method15() {
  T local<T>(num n) => null;
  return local;
}

@pragma('dart2js:noInline')
test(o) => o is num Function(num);

main() {
  Expect.isFalse(test(new Class1().method1()));
  Expect.isFalse(test(new Class1().method2()));
  Expect.isFalse(test(new Class1().method3()));
  Expect.isTrue(test(new Class2().method4<num>()));
  Expect.isTrue(test(new Class3().method5<num>()));
  Expect.isFalse(test(new Class4().method6<num>()));
  Expect.isTrue(test(method7<num>()));
  Expect.isTrue(test(method8<num>()));
  Expect.isFalse(test(method9()));
  Expect.isFalse(test(method10()));
  Expect.isFalse(test(method11()));
  Expect.isFalse(test(method12()));
  Expect.isTrue(test(method13())); //# 01: continued
  Expect.isTrue(test(method14())); //# 01: continued
  Expect.isTrue(test(method15())); //# 01: continued
}
