private static DeclarationsProvider GetDeclarationsProvider(Target target)
        {
            var method = target.Method;

            if (method.ReturnType == typeof(Task))
            {
                return new TaskDeclarationsProvider(target);
            }
            if (method.ReturnType.GetTypeInfo().IsGenericType 
                && method.ReturnType.GetTypeInfo().GetGenericTypeDefinition() == typeof(Task<>))
            {
                return new GenericTaskDeclarationsProvider(target, typeof(TaskMethodInvoker<>));
            }
            if (method.ReturnType.GetTypeInfo().IsGenericType 
                && method.ReturnType.GetTypeInfo().GetGenericTypeDefinition() == typeof(ValueTask<>))
            {
                return new GenericTaskDeclarationsProvider(target, typeof(ValueTaskMethodInvoker<>));
            }

            if (method.ReturnType == typeof(void))
            {
                var isUsingAsyncKeyword = method.HasAttribute<AsyncStateMachineAttribute>();
                if (isUsingAsyncKeyword)
                {
                    throw new NotSupportedException("async void is not supported by design");
                }

                return new VoidDeclarationsProvider(target);
            }
            return new NonVoidDeclarationsProvider(target);
        }
 private static Target CreateTarget(Type type, MethodInfo setupMethod, MethodInfo methodInfo, BenchmarkAttribute attr)
 {
     var target = new Target(type, methodInfo, setupMethod, attr.Description, baseline: attr.Baseline, operationsPerInvoke: attr.OperationsPerInvoke);
     AssertMethodHasCorrectSignature("Benchmark", methodInfo);
     AssertMethodIsAccessible("Benchmark", methodInfo);
     AssertMethodIsNotGeneric("Benchmark", methodInfo);
     return target;
 }
 public NonVoidDeclarationsProvider(Target target) : base(target) { }
 internal DeclarationsProvider(Target target)
 {
     Target = target;
 }
 public GenericTaskDeclarationsProvider(Target target, Type invoker) : base(target)
 {
     invokerFullName = invoker.GetTypeInfo().FullName.Split(GenericArgumentSign).First();
 }
 public TaskDeclarationsProvider(Target target) : base(target) { }
        private static string GetExtraAttributes(Target target)
        {
#if !CORE
            if (target.Method.GetCustomAttributes(false).OfType<System.STAThreadAttribute>().Any())
            {
                return "[System.STAThreadAttribute]";
            }
#endif

            return string.Empty;
        }