コード例 #1
0
        public EventItem(AMemberItem parent, XElement element)
            : base(parent, element)
        {
            TypeDefinition parentType = (parent as TypeItem).Type;

            Event = parentType.Events.First(e => e.Name == Name);
        }
コード例 #2
0
        public FieldItem(AMemberItem parent, XElement element)
            : base(parent, element)
        {
            TypeDefinition parentType = (parent as TypeItem).Type;

            Field = parentType.Fields.First(f => f.Name == Name);
        }
コード例 #3
0
        public PropertyItem(AMemberItem parent, XElement element)
            : base(parent, element)
        {
            XElement valueElement = element.GetValue();

            Value = valueElement != null ? new ValueItem(this, valueElement) : null;
        }
コード例 #4
0
        public MethodItem(AMemberItem parent, XElement item)
            : base(parent, GetMethodName(item, parent), item)
        {
            XElement returnElement = item.GetReturns();

            Return     = returnElement != null ? new ReturnItem(this, returnElement) : null;
            Parameters = item.GetParameters().Select(e => new ParameterItem(this, e)).ToArray();
        }
コード例 #5
0
        private DocWriter(AMemberItem item, string filePath)
        {
            if (!_builders.TryDequeue(out _builder))
            {
                _builder = new StringBuilder(1024);
            }

            _item     = item;
            _filePath = filePath;
        }
コード例 #6
0
 public ReturnItem(AMemberItem parent, XElement element)
     : base(parent, element)
 {
     Type = parent switch
     {
         MethodItem methodItem => methodItem.Method.ReturnType,
         OperatorItem operatorItem => operatorItem.Method.ReturnType,
                    _ => throw new NotSupportedException()
     };
 }
コード例 #7
0
        public PropertyItem(AMemberItem parent, XElement element)
            : base(parent, GetPropertyName(element, parent), element)
        {
            TypeDefinition parentType = (parent as TypeItem).Type;

            Property = parentType.Properties.First(p => p.Name == Name);

            Parameters = element.GetParameters().Select(e => new ParameterItem(this, e)).ToArray();
            Value      = new ValueItem(this, element.GetValue() ?? new XElement("value"));
        }
コード例 #8
0
        private static string GetNameWithoutGeneric(AMemberItem item)
        {
            if (item is TypeItem typeItem &&
                typeItem.Generics.Length > 0)
            {
                return($"{item.Name.Substring(0, item.Name.IndexOf("&lt"))}`{typeItem.Generics.Length}");
            }

            return(item.Name);
        }
コード例 #9
0
        public MethodItem(AMemberItem parent, XElement item)
            : base(parent, GetMethodName(item, parent), item)
        {
            TypeDefinition parentType = (parent as TypeItem).Type;
            string         methodName = item.GetFullName().Substring(parent.Element.GetFullName().Length + 1).Replace('#', '.').Replace('@', '&');

            Method = GetMethodDefinition(item, parent, parentType.Methods);

            Return     = new ReturnItem(this, item.GetReturns() ?? new XElement("returns"));
            Parameters = item.GetParameters().Select(e => new ParameterItem(this, e)).ToArray();
        }
コード例 #10
0
 public ParameterItem(AMemberItem parent, XElement element)
     : base(parent, element)
 {
     Parameter = parent switch
     {
         MethodItem methodItem => methodItem.Method.Parameters.First(p => p.Name == Name),
         OperatorItem operatorItem => operatorItem.Method.Parameters.First(p => p.Name == Name),
         ConstructorItem constructorItem => constructorItem.Constructor.Parameters.First(p => p.Name == Name),
         PropertyItem property => property.Property.Parameters.First(p => p.Name == Name),
         _ => throw new NotSupportedException()
     };
 }
コード例 #11
0
        private static string GetPropertyName(XElement element, AMemberItem parent)
        {
            string name = element.GetName();

            if (name.EndsWith(")"))
            {
                name = MethodItem.GetMethodName(element, parent);
                name = $"this[{name.Substring(name.IndexOf('(') + 1).Replace(')', ']')}";
            }

            return(name);
        }
コード例 #12
0
        private void WriteDocFor <T>(DocWriter writer, T item)
            where T : AMemberItem
        {
            writer.WriteLine($"#### {MainName.AsLink()}");
            AMemberItem         parent  = item.Parent;
            Stack <AMemberItem> parents = new Stack <AMemberItem>();

            while (parent != null)
            {
                parents.Push(parent);
                parent = parent.Parent;
            }
            writer.WriteLine($"### {string.Join(".", parents.Select(i => i is NamespaceItem ? i.AsLinkWithTarget(MainName) : i.AsLink()))}");

            item.Write(this, writer);
        }
コード例 #13
0
        private void WriteLinkFor <T>(DocWriter writer, AMemberItem parent)
            where T : AMemberItem
        {
            bool hasHeader = false;

            foreach (T item in _items.Values.OfType <T>().Where(i => i.Parent == parent).OrderBy(i => i.Name))
            {
                if (!hasHeader)
                {
                    hasHeader = true;
                    writer.WriteLine($"### {item.Header}");
                }

                writer.WriteLine($"- {item.AsLink()}");
            }
        }
コード例 #14
0
        private static MethodDefinition GetMethodDefinition(XElement element, AMemberItem parent, IEnumerable <MethodDefinition> methods)
        {
            string methodName = element.GetFullName().Substring(parent.Element.GetFullName().Length + 1)
                                .Replace('#', '.')
                                .Replace('@', '&')
                                .Replace('{', '<')
                                .Replace('}', '>');

            int parametersIndex = methodName.IndexOf('(');

            if (parametersIndex < 0)
            {
                parametersIndex = methodName.Length;
                methodName     += "()";
            }

            int genericsCount = 0;
            int genericsIndex = methodName.IndexOf('`');

            if (genericsIndex > 0 && genericsIndex < parametersIndex)
            {
                genericsCount = int.Parse(methodName.Substring(genericsIndex, parametersIndex - genericsIndex).Trim('`'));
                methodName    = methodName.Substring(0, genericsIndex) + methodName.Substring(parametersIndex);
            }

            string[] methodGenerics = GetGenericNames(element).ToArray();
            for (int i = 0; i < methodGenerics.Length; ++i)
            {
                methodName = methodName.Replace($"``{i}", methodGenerics[i]);
            }

            GenericItem[] typeGenerics = (parent as TypeItem)?.Generics;
            for (int i = 0; i < typeGenerics.Length; ++i)
            {
                methodName = methodName.Replace($"`{i}", typeGenerics[i].Name);
            }

            return(methods.First(m => m.GetName() == methodName && m.GenericParameters.Count == genericsCount));
        }
コード例 #15
0
        public TypeItem(AMemberItem parent, XElement item, AssemblyDefinition assembly)
            : base(parent, item)
        {
            string typeName = GetNameWithoutGeneric(this);

            while (parent != null)
            {
                typeName = $"{GetNameWithoutGeneric(parent)}{(parent is TypeItem ? '/' : '.')}{typeName}";

                parent = parent.Parent;
            }

            Type = assembly.MainModule.GetType(typeName);
            if (Type.BaseType?.FullName == "System.MulticastDelegate")
            {
                Header = "Delegates";
                Title  = "delegate";
            }
            else if (Type.IsEnum)
            {
                Header = "Enums";
                Title  = "enum";
            }
            else if (Type.IsInterface)
            {
                Header = "Interfaces";
                Title  = "interface";
            }
            else if (Type.IsValueType)
            {
                Header = "Structs";
                Title  = "struct";
            }
            else
            {
                Header = "Classes";
                Title  = "class";
            }
        }
コード例 #16
0
        private void WriteDocFor <T>(DocWriter writer, T item)
            where T : AMemberItem
        {
            writer.WriteLine($"#### {_mainName.AsLink()}");
            AMemberItem         parent  = item.Parent;
            Stack <AMemberItem> parents = new Stack <AMemberItem>();

            while (parent != null)
            {
                parents.Push(parent);
                parent = parent.Parent;
            }
            writer.WriteLine($"### {string.Join(".", parents.Select(i => i is NamespaceItem ? i.AsLinkWithTarget(_mainName) : i.AsLink()))}");
            writer.WriteLine($"## {item.Name} `{item.Title}`");

            WriteText(writer, item);
            WriteItem(writer, item.Remarks);
            WriteItem(writer, item.Example);
            WriteItems(writer, (item as AGenericDocItem)?.Generics);
            WriteItems(writer, (item as IParameterDocItem)?.Parameters);
            WriteItem(writer, (item as IReturnDocItem)?.Return);
            WriteItem(writer, (item as PropertyItem)?.Value);
            WriteItems(writer, item.Exceptions);
        }
コード例 #17
0
 public static GenericItem[] GetFrom(AMemberItem item)
 {
     return(item.Element.GetGenerics().Select(i => new GenericItem(item, i)).ToArray());
 }
コード例 #18
0
 private GenericItem(AMemberItem parent, XElement element)
     : base(parent, element)
 {
 }
コード例 #19
0
 public EventItem(AMemberItem parent, XElement element)
     : base(parent, element)
 {
 }
コード例 #20
0
 public DocWriter(string path, AMemberItem item)
     : this(item, Path.Combine(path, $"{item.LinkName}.md"))
 {
 }
コード例 #21
0
 public static ExceptionItem[] GetFrom(AMemberItem item)
 {
     return(item.Element.GetExceptions()?.Select(i => new ExceptionItem(item, i)).ToArray());
 }
コード例 #22
0
 public bool IsForThis(AMemberItem item) => _item == item;
コード例 #23
0
 public ReturnItem(AMemberItem parent, XElement element)
     : base(parent, element)
 {
 }
コード例 #24
0
 public ValueItem(AMemberItem parent, XElement element)
     : base(parent, element)
 {
     Type = (parent as PropertyItem).Property.PropertyType;
 }
コード例 #25
0
 private RemarksItem(AMemberItem parent, XElement element)
     : base(parent, element)
 {
 }
コード例 #26
0
        public static RemarksItem GetFrom(AMemberItem item)
        {
            XElement remarksElement = item.Element.GetRemarks();

            return(remarksElement != null ? new RemarksItem(item, remarksElement) : null);
        }
コード例 #27
0
 private ExceptionItem(AMemberItem parent, XElement element)
     : base(parent, element)
 {
 }
コード例 #28
0
 public TypeItem(AMemberItem parent, XElement item)
     : base(parent, item)
 {
 }
コード例 #29
0
 public FieldItem(AMemberItem parent, XElement element)
     : base(parent, element)
 {
 }
コード例 #30
0
        private void WriteText(DocWriter writer, AItem item)
        {
            string summary = string.Empty;

            void WriteNodes(IEnumerable <XNode> nodes)
            {
                foreach (XNode node in nodes)
                {
                    switch (node)
                    {
                    case XText text:
                        summary += string.Join("  \n", text.Value.Split('\n'));
                        break;

                    case XElement element:
                        switch (element.Name.LocalName)
                        {
                        case "see":
                        case "seealso":
                            string referenceName = element.GetReferenceName();
                            summary +=
                                _items.TryGetValue(referenceName, out AMemberItem reference)
                                        ? (reference is NamespaceItem ? reference.AsLinkWithTarget(_mainName) : reference.AsLink())
                                        : referenceName.Substring(2).AsDotNetApiLink();
                            break;

                        case "typeparamref":
                            AMemberItem parent  = item as AMemberItem ?? item.Parent;
                            GenericItem generic = null;
                            while (parent != null && generic == null)
                            {
                                if (parent is AGenericDocItem genericItem)
                                {
                                    generic = Array.Find(genericItem.Generics, i => i.Name == element.GetName());
                                }

                                parent = parent.Parent;
                            }

                            if (generic == null)
                            {
                                summary += element.GetName();
                            }
                            else
                            {
                                summary +=
                                    writer.IsForThis(generic.Parent)
                                            ? generic.AsPageLink()
                                            : generic.AsLinkWithTarget();
                            }
                            break;

                        case "paramref":
                            IParameterDocItem parameterItem = (item as IParameterDocItem) ?? (item.Parent as IParameterDocItem);
                            ParameterItem     parameter     = parameterItem.Parameters.First(i => i.Name == element.GetName());

                            summary += parameter.AsPageLink();
                            break;

                        case "c":
                            summary += $"`{element.Value}`";
                            break;

                        case "code":
                            summary += $"```{element.Value}```\n";
                            break;

                        case "para":
                            summary += "\n\n";
                            WriteNodes(element.Nodes());
                            summary += "\n\n";
                            break;

                        default:
                            summary += element.ToString();
                            break;
                        }
                        break;

                    default:
                        throw new Exception($"unhandled node type in summary {node.NodeType}");
                    }
                }
            }

            WriteNodes(item.Summary.Nodes());

            string[] lines      = summary.Split('\n');
            int      startIndex = 0;
            int      firstLine  = 0;

            foreach (string line in lines)
            {
                if (!string.IsNullOrWhiteSpace(line))
                {
                    startIndex = line.Length - line.TrimStart().Length;
                    break;
                }

                ++firstLine;
            }

            summary = string.Join(Environment.NewLine, lines.Skip(firstLine).Select(l => l.StartsWith(" ") ? l.Substring(startIndex) : l));
            while (summary.EndsWith(Environment.NewLine))
            {
                summary = summary.Substring(0, summary.Length - Environment.NewLine.Length);
            }

            writer.WriteLine($"{summary.TrimEnd()}");
        }