private static async Task Constructors(StreamWriter writer, Type type, XDocument xmlComments)
        {
            var constructors = type.GetConstructors();

            if (constructors.Length > 0)
            {
                await writer.WriteLineAsync("### Constructors");

                await writer.WriteLineAsync("| | |");

                await writer.WriteLineAsync("|_|_|");

                foreach (var constructor in constructors)
                {
                    await writer.WriteAsync("[");

                    await TypeHelper.FullName(writer, type, t => t.Name, "<", ">");

                    await writer.WriteAsync("(");

                    var parameters = constructor.GetParameters();

                    if (parameters.Length > 0)
                    {
                        await TypeHelper.FullName(writer, parameters[0].ParameterType, t => t.Name, "<", ">");

                        for (var i = 1; i < parameters.Length; i++)
                        {
                            await writer.WriteAsync(", ");

                            await TypeHelper.FullName(writer, parameters[i].ParameterType, t => t.Name, "&lt;", "&gt;");
                        }
                    }

                    await writer.WriteAsync(")](");

                    await writer.WriteAsync(FileNameHelper.ConstructorFileName(string.Empty, type));

                    await writer.WriteAsync(")|");

                    await writer.WriteLineAsync(
                        XmlCommentHelper.Summary(XmlCommentHelper.MethodElement(xmlComments, constructor)));
                }
            }
        }
        internal static async Task Build(Assembly assembly, XDocument xmlComments, string outputPath)
        {
            var exportedTypesByNamespace = DocumentBuilder.ExportedTypesByNamespace(assembly);

            foreach ((var typeNamespace, var types) in exportedTypesByNamespace)
            {
                foreach (var type in types)
                {
                    if (!TypeHelper.TypeIsADelegate(type))
                    {
                        var constructors = type
                                           .GetConstructors(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)
                                           .Where(o => o.IsPublic || o.IsFamily)
                                           .ToList();

                        if (constructors.Count > 0)
                        {
                            await using (var writer = File.CreateText(
                                             FileNameHelper.ConstructorFileName(outputPath, type)))
                            {
                                if (constructors.Count > 1)
                                {
                                    await ConstructorDocument.BuildMultiple(writer, type, constructors, xmlComments);
                                }
                                else
                                {
                                    await ConstructorDocument.BuildSingle(writer, type, constructors[0], xmlComments);
                                }
                            }
                        }

                        foreach (var property in type.GetProperties().Where(o => o.DeclaringType == type))
                        {
                            await using (var writer =
                                             File.CreateText(FileNameHelper.PropertyFileName(outputPath, property)))
                            {
                                await PropertyDocument.Build(writer, property, xmlComments);
                            }
                        }

                        foreach (var methods in type
                                 .GetMethods(
                                     BindingFlags.Instance |
                                     BindingFlags.Static |
                                     BindingFlags.Public |
                                     BindingFlags.NonPublic)
                                 .Where(
                                     o => o.DeclaringType == type &&
                                     !o.IsSpecialName &&
                                     (o.IsPublic || o.IsFamily) &&
                                     (!o.IsVirtual || (o.Attributes & MethodAttributes.NewSlot) != 0))
                                 .GroupBy(o => o.Name)
                                 .Select(o => o.ToList()))
                        {
                            await using (var writer =
                                             File.CreateText(FileNameHelper.MethodFileName(outputPath, methods[0])))
                            {
                                if (methods.Count > 1)
                                {
                                    await MethodDocument.BuildMultiple(writer, assembly, type, methods, xmlComments);
                                }
                                else
                                {
                                    await MethodDocument.BuildSingle(writer, assembly, type, methods[0], xmlComments);
                                }
                            }
                        }
                    }

                    await using (var writer = File.CreateText(FileNameHelper.TypeFileName(outputPath, type)))
                    {
                        if (TypeHelper.TypeIsADelegate(type))
                        {
                            await DelegateDocument.Build(writer, type, xmlComments);
                        }
                        else
                        {
                            await TypeDocument.Build(writer, type, xmlComments);
                        }
                    }
                }

                await using (var writer = File.CreateText(FileNameHelper.NamespaceFileName(outputPath, typeNamespace)))
                {
                    await NamespaceDocument.Build(writer, typeNamespace, types, xmlComments);
                }
            }

            if (exportedTypesByNamespace.Count > 1)
            {
                await using (var writer =
                                 File.CreateText(FileNameHelper.AssemblyFileName(outputPath, assembly.GetName())))
                {
                    await AssemblyDocument.Build(
                        writer,
                        assembly,
                        exportedTypesByNamespace.Select(o => o.TypeNamespace));
                }
            }
        }