using System.Text; using System.Xml; namespace AssetRipper.AssemblyDumper.Documentation; internal static class DocumentationHandler { private static readonly Dictionary> typeDefinitionDocumentation = new(); private static readonly Dictionary> methodDefinitionDocumentation = new(); private static readonly Dictionary> propertyDefinitionDocumentation = new(); private static readonly Dictionary> fieldDefinitionDocumentation = new(); private static readonly Dictionary> eventDefinitionDocumentation = new(); public static void MakeDocumentationFile() { XmlDocument document = XmlUtils.CreateNewDocument(); XmlElement docElement = document.AddChildElement(document, "doc"); docElement.AddAssemblyName(document, SharedState.AssemblyName); XmlElement membersElement = docElement.AddChildElement(document, "members"); foreach ((TypeDefinition type, List lines) in typeDefinitionDocumentation) { membersElement.AddTypeMember(document, type).AddSummary(document, GetSummary(lines)); } foreach ((MethodDefinition type, List lines) in methodDefinitionDocumentation) { membersElement.AddMethodMember(document, type).AddSummary(document, GetSummary(lines)); } foreach ((PropertyDefinition type, List lines) in propertyDefinitionDocumentation) { membersElement.AddPropertyMember(document, type).AddSummary(document, GetSummary(lines)); } foreach ((FieldDefinition type, List lines) in fieldDefinitionDocumentation) { membersElement.AddFieldMember(document, type).AddSummary(document, GetSummary(lines)); } foreach ((EventDefinition type, List lines) in eventDefinitionDocumentation) { membersElement.AddEventMember(document, type).AddSummary(document, GetSummary(lines)); } document.SaveWithTabs($"{SharedState.AssemblyName}.xml"); } private static void SaveWithTabs(this XmlDocument document, string path) { XmlWriterSettings settings = new XmlWriterSettings(); settings.Indent = true; settings.IndentChars = "\t"; using FileStream stream = File.Create(path); XmlWriter writer = XmlWriter.Create(stream, settings); document.Save(writer); } public static void AddTypeDefinitionLine(TypeDefinition type, string line) { List lines = typeDefinitionDocumentation.GetOrAdd(type); lines.Add(line); } public static void AddMethodDefinitionLine(MethodDefinition method, string line) { List lines = methodDefinitionDocumentation.GetOrAdd(method); lines.Add(line); } public static void AddPropertyDefinitionLine(PropertyDefinition property, string line) { List lines = propertyDefinitionDocumentation.GetOrAdd(property); lines.Add(line); } public static void AddPropertyDefinitionLine(PropertyBase property, string line) { AddPropertyDefinitionLine(property.Definition, line); if (property.SpecialDefinition is not null) { AddPropertyDefinitionLine(property.SpecialDefinition, line); } } public static void AddPropertyDefinitionLine(ClassProperty property, string line) { AddPropertyDefinitionLine((PropertyBase)property, line); if (property.HasBackingFieldInDeclaringType) { AddFieldDefinitionLine(property.BackingField, line); } } public static void AddPropertyDefinitionLineNotSpecial(ClassProperty property, string line) { AddPropertyDefinitionLine(property.Definition, line); if (property.HasBackingFieldInDeclaringType) { AddFieldDefinitionLine(property.BackingField, line); } } public static void AddFieldDefinitionLine(FieldDefinition field, string line) { List lines = fieldDefinitionDocumentation.GetOrAdd(field); lines.Add(line); } public static void AddEventDefinitionLine(EventDefinition @event, string line) { List lines = eventDefinitionDocumentation.GetOrAdd(@event); lines.Add(line); } private static string GetSummary(List lines) { if (lines.Count == 0) { return ""; } StringBuilder sb = new(); sb.AppendLineAndThreeTabs(); sb.Append(lines[0]); for (int i = 1; i < lines.Count; i++) { sb.AppendBreakTag(); sb.AppendLineAndThreeTabs(); sb.Append(lines[i]); } sb.AppendLineAndThreeTabs(); return sb.ToString(); } }