private static async Task Properties(StreamWriter writer, Type type, XDocument xmlComments) { var properties = type.GetProperties().Where(TypeHelper.IgnoreDeclaringType).ToList(); if (properties.Count > 0) { await writer.WriteLineAsync("### Properties"); await writer.WriteLineAsync("| | |"); await writer.WriteLineAsync("|_|_|"); foreach (var property in properties.OrderBy(o => o.Name)) { await writer.WriteAsync("["); await writer.WriteAsync(property.Name); await writer.WriteAsync("]("); await writer.WriteAsync(FileNameHelper.PropertyFileName(string.Empty, property)); await writer.WriteAsync(")|"); var summary = XmlCommentHelper.Property(xmlComments, property); await writer.WriteAsync(summary); if (property.DeclaringType != type) { if (summary.Length > 0) { await writer.WriteAsync("<br/>"); } await writer.WriteAsync("(Inherited from "); await writer.WriteAsync(property.DeclaringType?.Name); await writer.WriteAsync(")"); } await writer.WriteLineAsync(); } } await writer.WriteLineAsync(); }
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)); } } }