internal static string TypeParameter(XDocument xmlComments, MethodInfo method, Type genericArgument)
 {
     return(XmlCommentHelper.MethodElement(xmlComments, method)
            ?.Descendants("typeparam")
            .FirstOrDefault(el => el.Attribute("name")?.Value == genericArgument.Name)
            ?.Value ??
            string.Empty);
 }
 internal static string Returns(XDocument xmlComments, MethodInfo method)
 {
     return(XmlCommentHelper.MethodElement(xmlComments, method)
            ?.Descendants("returns")
            .FirstOrDefault()
            ?.Value ??
            string.Empty);
 }
 internal static string Parameter(XDocument xmlComments, MethodBase method, ParameterInfo parameter)
 {
     return(XmlCommentHelper.MethodElement(xmlComments, method)
            ?.Descendants("param")
            .FirstOrDefault(el => el.Attribute("name")?.Value == parameter.Name)
            ?.Value ??
            string.Empty);
 }
        private static string MemberNameAttribute(MethodBase methodInfo)
        {
            var stringBuilder = new StringBuilder(256);

            stringBuilder.Append("M:");
            stringBuilder.Append(methodInfo.DeclaringType?.FullName);
            stringBuilder.Append('.');
            stringBuilder.Append(methodInfo.Name.Replace('.', '#'));

            Type[]? genericTypeArguments = null;

            if (methodInfo.DeclaringType != null && methodInfo.DeclaringType.IsGenericTypeDefinition)
            {
                genericTypeArguments = methodInfo.DeclaringType.GetGenericArguments();
            }

            Type[]? genericMethodArguments = null;

            if (methodInfo.IsGenericMethodDefinition)
            {
                genericMethodArguments = methodInfo.GetGenericArguments();

                stringBuilder.Append("``");
                stringBuilder.Append(methodInfo.GetGenericArguments().Length);
            }

            var parameters = methodInfo.GetParameters();

            if (parameters.Length > 0)
            {
                stringBuilder.Append('(');

                stringBuilder.Append(
                    XmlCommentHelper.ReplaceGenericMethodParameter(
                        genericTypeArguments,
                        genericMethodArguments,
                        parameters[0].ParameterType));

                for (var i = 1; i < parameters.Length; ++i)
                {
                    stringBuilder.Append(',');

                    stringBuilder.Append(
                        XmlCommentHelper.ReplaceGenericMethodParameter(
                            genericTypeArguments,
                            genericMethodArguments,
                            parameters[i].ParameterType));
                }

                stringBuilder.Append(')');
            }

            return(stringBuilder.ToString());
        }
        private static string?ReplaceGenericMethodParameter(
            Type[]?genericTypeArguments,
            Type[]?genericMethodArguments,
            Type parameterType)
        {
            if (parameterType.IsGenericType)
            {
                var parameterGenericArguments = parameterType.GetGenericArguments();

                var stringBuilder = new StringBuilder(256);

                stringBuilder.Append(parameterType.Namespace);

                if (!string.IsNullOrEmpty(parameterType.Namespace))
                {
                    stringBuilder.Append('.');
                }

                stringBuilder.Append(parameterType.Name.Split('`')[0]);
                stringBuilder.Append('{');

                stringBuilder.Append(
                    XmlCommentHelper.ReplaceGenericMethodParameter(
                        genericTypeArguments,
                        genericMethodArguments,
                        parameterGenericArguments[0]));

                for (var i = 1; i < parameterGenericArguments.Length; ++i)
                {
                    stringBuilder.Append(',');

                    stringBuilder.Append(
                        XmlCommentHelper.ReplaceGenericMethodParameter(
                            genericTypeArguments,
                            genericMethodArguments,
                            parameterGenericArguments[i]));
                }

                stringBuilder.Append('}');

                return(stringBuilder.ToString());
            }

            if (parameterType.FullName == null)
            {
                if (genericTypeArguments != null)
                {
                    for (var i = 0; i < genericTypeArguments.Length; ++i)
                    {
                        if (genericTypeArguments[i].Name == parameterType.Name)
                        {
                            return("`" + i);
                        }
                    }
                }

                if (genericMethodArguments != null)
                {
                    for (var i = 0; i < genericMethodArguments.Length; ++i)
                    {
                        if (genericMethodArguments[i].Name == parameterType.Name)
                        {
                            return("``" + i);
                        }
                    }
                }
            }

            return(parameterType.FullName);
        }