Ejemplo n.º 1
0
        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());
        }
Ejemplo n.º 2
0
        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());
            }
        }