public override string ToString() { var mb = new MarkdownBuilder(); mb.HeaderWithCode(1, Beautifier.BeautifyTypeWithLink(type, GenerateTypeRelativeLinkPath, false)); mb.AppendLine(); var desc = commentLookup[type.FullName].FirstOrDefault(x => x.MemberType == MemberType.Type)?.Summary ?? ""; if (desc != "") { mb.AppendLine(desc); } { var sb = new StringBuilder(); var stat = (type.IsAbstract && type.IsSealed) ? "static " : ""; var abst = (type.IsAbstract && !type.IsInterface && !type.IsSealed) ? "abstract " : ""; var classOrStructOrEnumOrInterface = type.IsInterface ? "interface" : type.IsEnum ? "enum" : type.IsValueType ? "struct" : "class"; sb.AppendLine($"public {stat}{abst}{classOrStructOrEnumOrInterface} {Beautifier.BeautifyType(type, true)}"); var impl = string.Join(", ", new[] { type.BaseType }.Concat(type.GetInterfaces()).Where(x => x != null && x != typeof(object) && x != typeof(ValueType)).Select(x => Beautifier.BeautifyType(x))); if (impl != "") { sb.AppendLine(" : " + impl); } mb.Code("csharp", sb.ToString()); } mb.AppendLine(); if (type.IsEnum) { var enums = Enum.GetNames(type) .Select(x => new { Name = x, //Value = ((Int32)Enum.Parse(type), Value = x }) .OrderBy(x => x.Value) .ToArray(); BuildTable(mb, "Enum", enums, commentLookup[type.FullName], x => x.Value, x => x.Name, x => x.Name); } else { BuildTable(mb, "Fields", GetFields(), commentLookup[type.FullName], x => Beautifier.BeautifyTypeWithLink(x.FieldType, GenerateTypeRelativeLinkPath), x => x.Name, x => x.Name); BuildTable(mb, "Properties", GetProperties(), commentLookup[type.FullName], x => Beautifier.BeautifyTypeWithLink(x.PropertyType, GenerateTypeRelativeLinkPath), x => x.Name, x => x.Name); BuildTable(mb, "Events", GetEvents(), commentLookup[type.FullName], x => Beautifier.BeautifyTypeWithLink(x.EventHandlerType, GenerateTypeRelativeLinkPath), x => x.Name, x => x.Name); BuildTable(mb, "Constructors", GetConstructors(), commentLookup[type.FullName], x => "void", x => x.Name, x => Beautifier.ToMarkdownConstructorInfo(x, GenerateTypeRelativeLinkPath)); BuildTable(mb, "Methods", GetMethods(), commentLookup[type.FullName], x => Beautifier.BeautifyTypeWithLink(x.ReturnType, GenerateTypeRelativeLinkPath), x => x.Name, x => Beautifier.ToMarkdownMethodInfo(x, GenerateTypeRelativeLinkPath)); BuildTable(mb, "Static Fields", GetStaticFields(), commentLookup[type.FullName], x => Beautifier.BeautifyTypeWithLink(x.FieldType, GenerateTypeRelativeLinkPath), x => x.Name, x => x.Name); BuildTable(mb, "Static Properties", GetStaticProperties(), commentLookup[type.FullName], x => Beautifier.BeautifyTypeWithLink(x.PropertyType, GenerateTypeRelativeLinkPath), x => x.Name, x => x.Name); BuildTable(mb, "Static Methods", GetStaticMethods(), commentLookup[type.FullName], x => Beautifier.BeautifyTypeWithLink(x.ReturnType, GenerateTypeRelativeLinkPath), x => x.Name, x => Beautifier.ToMarkdownMethodInfo(x, GenerateTypeRelativeLinkPath)); BuildTable(mb, "Static Events", GetStaticEvents(), commentLookup[type.FullName], x => Beautifier.BeautifyTypeWithLink(x.EventHandlerType, GenerateTypeRelativeLinkPath), x => x.Name, x => x.Name); } return(mb.ToString()); }
public void GenerateMethodDocuments(string namescapeDirectoryPath) { var methods = GetMethods(); var comments = commentLookup[type.FullName]; foreach (var method in methods) { var sb = new StringBuilder(); string generateTypeRelativeLinkPath(Type type) { var RelativeLinkPath = $"{(string.Join("/", this.Namespace.Split('.').Select(a => "..")))}/../{type.FullName?.Replace('.', '/')}.md"; if (type.FullName?.Contains("+") ?? false) { return(RelativeLinkPath); } return(RelativeLinkPath); } var isExtension = method.GetCustomAttributes <System.Runtime.CompilerServices.ExtensionAttribute>(false).Any(); var seq = method.GetParameters().Select(x => { var suffix = x.HasDefaultValue ? (" = " + (x.DefaultValue ?? $"null")) : ""; return($"{Beautifier.BeautifyTypeWithLink(x.ParameterType, generateTypeRelativeLinkPath)} " + x.Name + suffix); }); sb.AppendLine($"#\t{method.DeclaringType.Name}.{method.Name} Method ({(isExtension ? "this " : "")}{string.Join(", ", seq)})"); var parameters = method.GetParameters(); var comment = comments.FirstOrDefault(a => (a.MemberName == method.Name || a.MemberName.StartsWith(method.Name + "`")) && parameters.All(b => a.Parameters.ContainsKey(b.Name)) ); if (comment != null) { if (comment.Parameters != null && comment.Parameters.Count > 0) { sb.AppendLine($""); sb.AppendLine("##\tParameters"); foreach (var parameter in parameters) { sb.AppendLine($""); sb.AppendLine($"###\t{parameter.Name}"); sb.AppendLine($"-\tType: {Beautifier.BeautifyTypeWithLink(parameter.ParameterType, generateTypeRelativeLinkPath)}"); if (comment.Parameters.ContainsKey(parameter.Name)) { sb.AppendLine($"-\t{comment.Parameters[parameter.Name]}"); } } } if (!string.IsNullOrEmpty(comment.Returns)) { sb.AppendLine($""); sb.AppendLine("##\tReturn Value"); sb.AppendLine($"-\tType: {Beautifier.BeautifyTypeWithLink(method.ReturnType, generateTypeRelativeLinkPath)}"); sb.AppendLine($"-\t{comment.Returns}"); } sb.AppendLine($""); sb.AppendLine("##\tRemarks"); sb.AppendLine($"-\t{comment.Summary}"); } if (!Directory.Exists(Path.Combine(namescapeDirectoryPath, $"{method.DeclaringType.Name}"))) { Directory.CreateDirectory(Path.Combine(namescapeDirectoryPath, $"{method.DeclaringType.Name}")); } File.WriteAllText(Path.Combine(namescapeDirectoryPath, $"{method.DeclaringType.Name}/{method.MetadataToken}.md"), sb.ToString()); } }