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

// @dart = 2.7

import 'package:expect/expect.dart';

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

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

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

class Class2 {
  /*spec:nnbd-off.member: Class2.method4:direct,explicit=[method4.T],needsArgs,selectors=[Selector(call, method4, arity=0, types=1)]*/
  /*prod:nnbd-off.member: Class2.method4:needsArgs,selectors=[Selector(call, method4, arity=0, types=1)]*/
  method4<T>() {
    /*needsSignature*/
    num local(T n) => null;
    return local;
  }
}

class Class3 {
  /*member: Class3.method5:needsArgs,selectors=[Selector(call, method5, arity=0, types=1)]*/
  method5<T>() {
    /*needsSignature*/
    T local(num n) => null;
    return local;
  }
}

class Class4 {
  /*spec:nnbd-off.member: Class4.method6:direct,explicit=[method6.T],needsArgs,selectors=[Selector(call, method6, arity=0, types=1)]*/
  /*prod:nnbd-off.member: Class4.method6:*/
  method6<T>() {
    /**/
    num local(num n, T t) => null;
    return local;
  }
}

/*spec:nnbd-off.member: method7:direct,explicit=[method7.T],needsArgs*/
/*prod:nnbd-off.member: method7:needsArgs*/
method7<T>() {
  /*needsSignature*/
  num local(T n) => null;
  return local;
}

/*member: method8:needsArgs*/
method8<T>() {
  /*needsSignature*/
  T local(num n) => null;
  return local;
}

/*spec:nnbd-off.member: method9:direct,explicit=[method9.T],needsArgs*/
/*prod:nnbd-off.member: method9:*/
method9<T>() {
  /**/
  num local(num n, T t) => null;
  return local;
}

method10() {
  /*spec:nnbd-off.direct,explicit=[local.T],needsArgs,needsInst=[<dynamic>,<num>,<num>],needsSignature*/
  /*prod:nnbd-off.needsSignature*/
  num local<T>(T n) => null;
  return local;
}

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

method12() {
  /*spec:nnbd-off.direct,explicit=[local.T],needsArgs,needsInst=[<dynamic>,<num>,<num>]*/
  /*prod:nnbd-off.*/
  num local<T>(num n, T t) => null;
  return local;
}

num Function(num) method13() {
  /*needsSignature*/
  num local<T>(num n) => null;
  return local;
}

num Function(num) method14() {
  /*spec:nnbd-off.direct,explicit=[local.T],needsArgs,needsInst=[<dynamic>,<num>,<num>],needsSignature*/
  /*prod:nnbd-off.needsSignature*/
  num local<T>(T n) => null;
  return local;
}

num Function(num) method15() {
  /*needsSignature*/
  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()));
  Expect.isTrue(test(method14()));
  Expect.isTrue(test(method15()));
}
