Example #1
0
        private MethodDoc ParseMethod(Type type, MethodInfo method, XmlDocTree xmlDocTree)
        {
            MethodDoc methodDoc = new MethodDoc()
            {
                Name           = method.Name,
                ReturnType     = method.ReturnType,
                IsStatic       = method.IsStatic,
                IsAbstract     = method.IsAbstract,
                InheritedFrom  = method.DeclaringType == type ? null : method.DeclaringType,
                Obsolete       = method.IsDefined(typeof(ObsoleteAttribute), true),
                ObsoleteString = method.GetCustomAttribute <ObsoleteAttribute>(true)?.Message
            };

            DocMember member = xmlDocTree.GetDocumentation(method);

            if (member != null)
            {
                methodDoc.Summary       = member.Summary;
                methodDoc.ReturnSummary = member.ReturnsSummary;
            }

            methodDoc.Parameters = ParseParameters(method, member);

            return(methodDoc);
        }
Example #2
0
        private void ParseClass(Type type, XmlDocTree xmlDocTree)
        {
            ClassTypeDoc classType = new ClassTypeDoc()
            {
                Name           = type.Name,
                Type           = type,
                Namespace      = type.Namespace,
                IsGeneric      = type.IsGenericType,
                IsStatic       = type.IsAbstract && type.IsSealed,
                IsAbstract     = type.IsAbstract,
                IsSealed       = type.IsSealed,
                Obsolete       = type.IsDefined(typeof(ObsoleteAttribute), true),
                ObsoleteString = type.GetCustomAttribute <ObsoleteAttribute>(true)?.Message
            };

            foreach (MethodInfo method in type.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.Static).Where(x => !x.IsSpecialName))
            {
                classType.Methods.Add(ParseMethod(type, method, xmlDocTree));
            }

            foreach (FieldInfo field in type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.Static))
            {
                classType.Fields.Add(ParseField(type, field, xmlDocTree));
            }

            foreach (PropertyInfo property in type.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.Static))
            {
                classType.Properties.Add(ParseProperty(type, property, xmlDocTree));
            }

            foreach (ConstructorInfo constructor in type.GetConstructors(BindingFlags.Instance | BindingFlags.Public | BindingFlags.Static))
            {
                classType.Constructors.Add(ParseConstructor(type, constructor, xmlDocTree));
            }

            DocMember member = xmlDocTree.GetDocumentation(type);

            if (member != null)
            {
                classType.Summary = member.Summary;
            }

            docTypes.Add(classType);
        }
Example #3
0
        static void Main(string[] args)
        {
            if (args.Length < 4)
            {
                return;
            }

            string inputDll = Path.GetFullPath(args[0]);
            string inputXml = Path.GetFullPath(args[1]);

            string outputYaml   = Path.GetFullPath(args[2]);
            string outputFolder = Path.GetFullPath(args[3]);

            if (!Directory.Exists(outputFolder))
            {
                Directory.CreateDirectory(outputFolder);
            }
            else
            {
                Directory.GetFiles(outputFolder).ToList().ForEach(x =>
                {
                    if (Path.GetFileNameWithoutExtension(x).ToLower() != "index")
                    {
                        File.Delete(Path.Combine(outputFolder, x));
                    }
                });
            }

            Assembly assembly = Assembly.UnsafeLoadFrom(inputDll);

            XmlDocument xmlDocument = new XmlDocument();

            xmlDocument.Load(inputXml);

            Console.WriteLine("Parsing XmlDocs");
            XmlDocTree xmlDocTree = XmlDocTree.Parse(xmlDocument);

            Console.WriteLine("Parsing DocTree");
            DocTree docTree = DocTree.Parse(assembly, xmlDocTree);

            Console.WriteLine("Printing DocTree");
            Printer.Print(docTree, outputYaml, outputFolder);
        }
Example #4
0
        private FieldDoc ParseField(Type type, FieldInfo field, XmlDocTree xmlDocTree)
        {
            FieldDoc fieldDoc = new FieldDoc()
            {
                Name           = field.Name,
                Type           = field.FieldType,
                InheritedFrom  = field.DeclaringType == type ? null : field.DeclaringType,
                IsStatic       = field.IsStatic,
                Obsolete       = field.IsDefined(typeof(ObsoleteAttribute), true),
                ObsoleteString = field.GetCustomAttribute <ObsoleteAttribute>(true)?.Message
            };

            DocMember member = xmlDocTree.GetDocumentation(field);

            if (member != null)
            {
                fieldDoc.Summary = member.Summary;
            }

            return(fieldDoc);
        }
Example #5
0
        public static DocTree Parse(Assembly assembly, XmlDocTree xmlDocTree)
        {
            DocTree docTree = new DocTree();

            foreach (Type type in assembly.ExportedTypes)
            {
                if (type.IsEnum)
                {
                    docTree.ParseEnum(type, xmlDocTree);
                }
                else if (type.IsClass)
                {
                    docTree.ParseClass(type, xmlDocTree);
                }
                else if (type.IsValueType)
                {
                    docTree.ParseStruct(type, xmlDocTree);
                }
            }

            return(docTree);
        }
Example #6
0
        private PropertyDoc ParseProperty(Type type, PropertyInfo property, XmlDocTree xmlDocTree)
        {
            PropertyDoc propertyDoc = new PropertyDoc()
            {
                Name           = property.Name,
                Type           = property.PropertyType,
                Getter         = property.CanRead,
                Setter         = property.CanWrite,
                InheritedFrom  = property.DeclaringType == type ? null : property.DeclaringType,
                Obsolete       = property.IsDefined(typeof(ObsoleteAttribute), true),
                ObsoleteString = property.GetCustomAttribute <ObsoleteAttribute>(true)?.Message
            };

            DocMember member = xmlDocTree.GetDocumentation(property);

            if (member != null)
            {
                propertyDoc.Summary = member.Summary;
            }

            return(propertyDoc);
        }
Example #7
0
        private void ParseEnum(Type type, XmlDocTree xmlDocTree)
        {
            EnumTypeDoc enumType = new EnumTypeDoc()
            {
                Name      = type.Name,
                Type      = type,
                Namespace = type.Namespace
            };

            foreach (string name in type.GetEnumNames())
            {
                EnumDoc enumValue = new EnumDoc()
                {
                    Name = name
                };

                DocMember member = xmlDocTree.GetDocumentationEnumValue(type, name);

                if (member != null)
                {
                    enumValue.Summary = member.Summary;
                }

                enumType.Values.Add(enumValue);
            }

            {
                DocMember member = xmlDocTree.GetDocumentation(type);

                if (member != null)
                {
                    enumType.Summary = member.Summary;
                }
            }

            docTypes.Add(enumType);
        }
Example #8
0
        private ConstructorDoc ParseConstructor(Type type, ConstructorInfo constructor, XmlDocTree xmlDocTree)
        {
            ConstructorDoc constructorDoc = new ConstructorDoc()
            {
                Type           = type,
                Obsolete       = constructor.IsDefined(typeof(ObsoleteAttribute), true),
                ObsoleteString = constructor.GetCustomAttribute <ObsoleteAttribute>(true)?.Message
            };

            DocMember member = xmlDocTree.GetDocumentation(constructor);

            if (member != null)
            {
                constructorDoc.Summary = member.Summary;
            }

            constructorDoc.Parameters = ParseParameters(constructor, member);

            return(constructorDoc);
        }
Example #9
0
        public static XmlDocTree Parse(XmlDocument document)
        {
            XmlDocTree xmlTree = new XmlDocTree();

            XmlNode memberNodes = document.SelectSingleNode(".//members");

            if (memberNodes != null)
            {
                foreach (XmlNode memberNode in memberNodes)
                {
                    if (memberNode.Attributes == null)
                    {
                        continue;
                    }

                    DocMember member = new DocMember();

                    XmlNode summaryNode = memberNode.SelectSingleNode(".//summary");

                    if (summaryNode != null)
                    {
                        member.Summary = summaryNode.InnerText.Trim();
                    }

                    XmlNode returnsNode = memberNode.SelectSingleNode(".//returns");

                    if (returnsNode != null)
                    {
                        member.ReturnsSummary = returnsNode.InnerText.Trim();
                    }

                    XmlNodeList paramNodes = memberNode.SelectNodes(".//param");

                    if (paramNodes != null)
                    {
                        foreach (XmlNode parameterNode in paramNodes)
                        {
                            if (parameterNode.Attributes == null)
                            {
                                continue;
                            }

                            member.Parameters.Add(parameterNode.Attributes["name"].Value, parameterNode.InnerText.Trim());
                        }
                    }

                    XmlNode typeParamNodes = memberNode.SelectSingleNode(".//typeparam");

                    if (typeParamNodes != null)
                    {
                        foreach (XmlNode typeParamNode in typeParamNodes)
                        {
                            if (typeParamNode.Attributes == null)
                            {
                                continue;
                            }

                            member.TypeParams.Add(typeParamNode.Attributes["name"].Value, typeParamNode.InnerText.Trim());
                        }
                    }

                    xmlTree.documentation.Add(memberNode.Attributes["name"].Value, member);
                }
            }

            return(xmlTree);
        }