public override void Render(PageTree parent, MarkdownWriter writer) { writer.WriteHeader(1, Title); writer.WriteParagraph(Docs?.Summary ?? "_(No Description)_"); writer.WriteHeader(2, "Signature"); writer.WriteCodeBlock("csharp", DocUtilities.GetPropertySignature(_property, true, true, true)); }
public TypePage(Type type, MemberXmlDocs docs, ProjectXmlDocs prjDocs) : base(docs) { Type = type; _prjDocs = prjDocs; var name = DocUtilities.GetDisplayTitle(type, false); if (type.IsEnum) { Title = $"{name} Enum"; } else if (type.IsInterface) { Title = $"{name} Interface"; } else if (type.IsValueType) { Title = $"{name} Struct"; } else if (type.IsSubclassOf(typeof(Delegate))) { Title = $"{name} Delegate"; } else { Title = $"{name} Class"; } }
private static Doc Print(BlockSyntax node, string?groupId) { Doc statementSeparator = node.Parent is AccessorDeclarationSyntax && node.Statements.Count <= 1 ? Doc.Line : Doc.HardLine; var docs = new List <Doc> { groupId != null ? Doc.IfBreak(" ", Doc.Line, groupId) : node.Parent is ParenthesizedLambdaExpressionSyntax ? Doc.Null : Doc.Line, Token.Print(node.OpenBraceToken) }; if (node.Statements.Count > 0) { var innerDoc = Doc.Indent( statementSeparator, Doc.Join(statementSeparator, node.Statements.Select(Node.Print)) ); DocUtilities.RemoveInitialDoubleHardLine(innerDoc); docs.Add(Doc.Concat(innerDoc, statementSeparator)); } docs.Add( node.Statements.Count == 0 ? " " : Doc.Null, Token.Print(node.CloseBraceToken) ); return(Doc.Group(docs)); }
public ConstructorsPage(Type type, IEnumerable <ConstructorInfo> ctors, Dictionary <ConstructorInfo, MemberXmlDocs> ctorsData) : base(null) { _type = type; _ctors = ctors; _ctorsData = ctorsData; Title = $"{DocUtilities.GetDisplayTitle(type)} constructors"; }
public void RemoveInitialDoubleHardLine_Should_Handle_Empty_List() { var doc = new List <Doc>(); DocUtilities.RemoveInitialDoubleHardLine(doc); doc.Should().BeEmpty(); }
public void RemoveInitialDoubleHardLine_Should_Only_Remove_Initial_HardLines() { var doc = Doc.Concat("1", Doc.HardLine, Doc.HardLine); DocUtilities.RemoveInitialDoubleHardLine(doc); doc.Should().BeEquivalentTo(Doc.Concat("1", Doc.HardLine, Doc.HardLine)); }
public void RemoveInitialDoubleHardLine_Work_With_Doc_Null_Before_String() { var doc = Doc.Concat(Doc.HardLine, Doc.Null, "1", Doc.HardLine, "2"); DocUtilities.RemoveInitialDoubleHardLine(doc); DocSerializer.Serialize(doc) .Should() .Be(DocSerializer.Serialize(Doc.Concat(Doc.HardLine, "1", Doc.HardLine, "2"))); }
public void RemoveInitialDoubleHardLine_Should_Remove_Simple_Double_HardLine() { var doc = new List <Doc> { Doc.HardLine, Doc.HardLine }; DocUtilities.RemoveInitialDoubleHardLine(doc); doc.Should().HaveCount(1); }
public void RemoveInitialDoubleHardLine_Should_Remove_Null() { var doc = new List <Doc> { Doc.Null }; DocUtilities.RemoveInitialDoubleHardLine(doc); doc.Should().BeEmpty(); }
public void RemoveInitialDoubleHardLine_Should_Remove_Deep_Concated_HardLine() { var concat = Doc.Concat(Doc.HardLine, Doc.HardLine); var doc = new List <Doc> { Doc.Concat(concat) }; DocUtilities.RemoveInitialDoubleHardLine(doc); concat.Contents.Should().ContainSingle(); }
public void RemoveInitialDoubleHardLine_Should_Remove_Concated_HardLine() { var concat = Doc.Concat(Doc.HardLine, Doc.HardLine); var doc = new List <Doc> { concat }; DocUtilities.RemoveInitialDoubleHardLine(doc); concat.Should().BeEquivalentTo(Doc.Concat(Doc.HardLine, Doc.Null)); }
public void RemoveInitialDoubleHardLine_Should_Not_Remove_Deep_Concated_HardLine() { var concat = Doc.Concat(Doc.HardLine); var doc = new List <Doc> { Doc.Concat(concat) }; DocUtilities.RemoveInitialDoubleHardLine(doc); concat.Contents.Should().BeEquivalentTo(Doc.HardLine); }
public void RemoveInitialDoubleHardLine_Should_Remove_Indented_HardLine() { var indent = Doc.Indent(Doc.HardLine); var doc = new List <Doc> { Doc.HardLine, indent }; DocUtilities.RemoveInitialDoubleHardLine(doc); indent.Contents.Should().Be(Doc.Null); }
public void RemoveInitialDoubleHardLine_Should_Not_Remove_Deep_Indented_HardLine() { var indent = Doc.Indent(Doc.HardLine); var doc = new List <Doc> { Doc.Indent(indent) }; DocUtilities.RemoveInitialDoubleHardLine(doc); indent.Contents.Should().BeEquivalentTo(Doc.HardLine); }
public void RemoveInitialDoubleHardLine_Should_Remove_Grouped_Double_HardLine() { var contents = new List <Doc> { Doc.HardLine, Doc.HardLine }; var doc = Doc.Group(contents); DocUtilities.RemoveInitialDoubleHardLine(doc); contents.Should().ContainSingle(); }
public void RemoveInitialDoubleHardLine_Should_Remove_Simple_Double_HardLine() { var doc = new List <Doc> { Doc.HardLine, Doc.HardLine }; DocUtilities.RemoveInitialDoubleHardLine(doc); doc.Should().BeEquivalentTo(new List <Doc> { Doc.HardLine, Doc.Null }); }
public void RemoveInitialDoubleHardLine_Should_Remove_Grouped_Double_HardLine() { var contents = new List <Doc> { Doc.HardLine, Doc.HardLine }; var doc = Doc.Group(contents); DocUtilities.RemoveInitialDoubleHardLine(doc); contents.Should().BeEquivalentTo(new List <Doc> { Doc.HardLine, Doc.Null }); }
public override void Render(PageTree parent, MarkdownWriter writer) { writer.WriteHeader(1, Title); foreach (var data in _methodData.OrderBy(m => m.Key.GetParameters().Length)) { var method = data.Key; var docs = data.Value; writer.WriteHeader(2, DocUtilities.GetMethodSignature(method, false, false)); writer.WriteParagraph(docs?.Summary); writer.WriteHeader(3, "Signature"); writer.WriteCodeBlock("csharp", DocUtilities.GetMethodSignature(method, true, true)); if (docs != null) { if (docs.HasTypeParameters) { writer.WriteHeader(3, "Type Parameters"); foreach (var tp in method.GetGenericArguments()) { var desc = docs?.GetTypeParameterDescription(tp.Name) ?? "_(No Description)_"; writer.WriteLine($"- `{tp.Name}`: {desc}"); } writer.WriteLine(); } if (docs.HasParameters) { writer.WriteHeader(3, "Parameters"); foreach (var p in method.GetParameters()) { var desc = docs?.GetParameterDescription(p.Name) ?? "_(No Description)_"; writer.WriteLine($"- `{p.Name}`: {desc}"); } writer.WriteLine(); } if (docs.Returns != null) { writer.WriteHeader(3, "Returns"); writer.WriteLine(docs.Returns); } if (docs.Remarks != null) { writer.WriteHeader(3, "Remarks"); writer.WriteLine(docs.Remarks); } } } }
public void RemoveInitialDoubleHardLine_Should_Remove_Single_HardLine() { var concat = Doc.Concat(Doc.HardLine, Doc.HardLine, Doc.HardLine); var doc = new List <Doc> { Doc.Concat(concat) }; DocUtilities.RemoveInitialDoubleHardLine(doc); concat.Contents.Should() .BeEquivalentTo(new List <Doc> { Doc.HardLine, Doc.Null, Doc.HardLine }); }
public override void Render(PageTree parent, MarkdownWriter writer) { writer.WriteHeader(1, Title); foreach (var(ctor, idx) in _ctors.Select((ctor, idx) => (ctor, idx))) { if (idx > 0) { writer.WriteLine(); writer.WriteLine("<p> </p>"); writer.WriteLine("<p> </p>"); writer.WriteLine("<hr/>"); writer.WriteLine(); } writer.WriteHeader(2, DocUtilities.GetMethodSignature(ctor, false, false)); var docs = _ctorsData[ctor]; writer.WriteParagraph(docs?.Summary); writer.WriteHeader(3, "Signature"); writer.WriteCodeBlock("csharp", DocUtilities.GetMethodSignature(ctor, true, true)); if (docs != null) { if (docs.HasParameters) { writer.WriteHeader(3, "Parameters"); foreach (var p in ctor.GetParameters()) { var desc = docs?.GetParameterDescription(p.Name) ?? "_(No Description)_"; writer.WriteLine($"- `{p.Name}`: {desc}"); } writer.WriteLine(); } if (docs.Remarks != null) { writer.WriteHeader(3, "Remarks"); writer.WriteLine(docs.Remarks); } } } }
public override void Render(PageTree parent, MarkdownWriter writer) { writer.WriteHeader(1, Title); writer.WriteParagraph($"**Namespace:** {Type.Namespace}"); var inheritance = DocUtilities.GetInheritanceString(Type); if (!String.IsNullOrEmpty(inheritance)) { writer.WriteParagraph($"**Inheritance:** {inheritance}"); } writer.WriteParagraph(Docs?.Summary ?? "(No Description)"); writer.WriteHeader(2, "Signature"); writer.WriteCodeBlock("csharp", DocUtilities.GetClassSignature(Type)); var ctors = Type.GetConstructors().OrderBy(c => c.Name).ToArray(); if (ctors.Length > 0) { writer.WriteHeader(2, "Constructors"); if (Args.MethodGroupsTable) { writer.WriteLine("|**Name**|**Summary**|"); writer.WriteLine("|---|---|"); } var ctorNum = 1; foreach (var ctor in ctors) { if (Args.MethodGroupsTable) { var anchor = ""; if (ctorNum > 1) { anchor = $"#{DocUtilities.GetAnchor(DocUtilities.GetMethodSignature(ctor, false, false))}"; } var sbLink = new StringBuilder(); sbLink.Append($"[{DocUtilities.GetMethodSignature(ctor, false, false)}]"); sbLink.Append($"({DocUtilities.GetURLTitle(Type)}/ctors.md{anchor})"); bool isStatic = ctor.IsStatic; if (isStatic) { sbLink.Append(" (static)"); } var summary = ""; var doc = _prjDocs[ID.GetIDString(ctor)]; if (doc != null && !string.IsNullOrEmpty(doc.Summary)) { summary = doc.Summary.Replace("|", "\\|").Replace("\n", "<br/>"); } writer.WriteLine($"|{sbLink.ToString()}|{summary}|"); } else { var sbLink = new StringBuilder($"[{DocUtilities.GetMethodSignature(ctor, false, true)}]({DocUtilities.GetURLTitle(Type)}/ctors.md)"); bool isStatic = ctor.IsStatic; if (isStatic) { sbLink.Append(" (static)"); } writer.WriteLine($"- {sbLink.ToString()}"); } ++ctorNum; } } var methods = Type.GetMethods().OrderBy(m => m.Name).ToArray(); if (methods.Length > 0) { writer.WriteHeader(2, "Methods"); if (Args.MethodGroupsTable) { writer.WriteLine("|**Name**|**Summary**|"); writer.WriteLine("|---|---|"); } foreach (var methodGroup in methods.Where(m => !m.IsSpecialName).GroupBy(m => m.Name)) { if (Args.MethodGroupsTable) { foreach (var(method, idx) in methodGroup .OrderBy(m => m.GetParameters().Length) .Select((method, idx) => (method, idx))) { var anchor = ""; if (idx > 0) { anchor = $"#{DocUtilities.GetAnchor(DocUtilities.GetMethodSignature(method, false, false))}"; } var sbLink = new StringBuilder(); sbLink.Append($"[{DocUtilities.GetIdentifier(methodGroup.Key)}]"); sbLink.Append($"({DocUtilities.GetURLTitle(Type)}/{DocUtilities.GetIdentifier(methodGroup.Key)}.md{anchor})"); bool isStatic = method.IsStatic; if (isStatic) { sbLink.Append(" (static)"); } var summary = ""; var doc = _prjDocs[ID.GetIDString(method)]; if (doc != null && !string.IsNullOrEmpty(doc.Summary)) { summary = doc.Summary.Replace("|", "\\|").Replace("\n", "<br/>"); } writer.WriteLine($"|{sbLink.ToString()}|{summary}|"); } } else { var sbLink = new StringBuilder($"[{DocUtilities.GetIdentifier(methodGroup.Key)}]({DocUtilities.GetURLTitle(Type)}/{DocUtilities.GetIdentifier(methodGroup.Key)}.md)"); bool isStatic = methodGroup.All(m => m.IsStatic); if (isStatic) { sbLink.Append(" (static)"); } writer.WriteLine($"- {sbLink.ToString()}"); } } } var props = Type.GetProperties() .Where(p => p.GetIndexParameters().Length == 0) .OrderBy(p => p.Name) .ToArray(); if (props.Length > 0) { writer.WriteHeader(2, "Properties"); if (Args.PropertiesTable) { writer.WriteLine("|**Name**|**Summary**|"); writer.WriteLine("|---|---|"); } foreach (var prop in props) { var sbLink = new StringBuilder($"[{DocUtilities.GetIdentifier(prop.Name)}]({DocUtilities.GetURLTitle(Type)}/{DocUtilities.GetIdentifier(prop.Name)}.md)"); bool isStatic = prop.CanRead && prop.GetGetMethod(true).IsStatic || prop.CanWrite && prop.GetSetMethod(true).IsStatic; if (isStatic) { sbLink.Append(" (static)"); } if (Args.PropertiesTable) { var summary = ""; var doc = _prjDocs[ID.GetIDString(prop)]; if (doc != null && !string.IsNullOrEmpty(doc.Summary)) { summary = doc.Summary.Replace("|", "\\|").Replace("\n", "<br/>"); } writer.WriteLine($"|{sbLink.ToString()}|{summary}"); } else { writer.WriteLine($"- {sbLink.ToString()}"); } } } var fields = Type.GetFields() .Where(f => !f.IsSpecialName) .OrderBy(f => f.Name) .ToArray(); if (fields.Length > 0) { writer.WriteHeader(2, "Fields"); foreach (var field in fields) { var sbLink = new StringBuilder($"- [{DocUtilities.GetIdentifier(field.Name)}]({DocUtilities.GetURLTitle(Type)}/{DocUtilities.GetIdentifier(field.Name)}.md)"); if (field.IsStatic) { sbLink.Append(" (static)"); } writer.WriteLine(sbLink.ToString()); } } // TODO: Events //writer.WriteHeader(2, "Events"); var operators = Type.GetMethods() .Where(m => m.Name.StartsWith("op_") && m.Name != "op_Explicit" && m.Name != "op_Implicit") .ToArray(); if (operators.Length > 0) { writer.WriteHeader(2, "Operators"); foreach (var op in operators) { writer.WriteLine($"- [{DocUtilities.GetOperatorSymbol(op.Name)}]({DocUtilities.GetURLTitle(Type)}/{op.Name}.md)"); } } writer.WriteHeader(2, "Conversions"); }
public override void Render(PageTree parent, MarkdownWriter writer) { writer.WriteHeader(1, Title); writer.WriteParagraph($"**Namespace:** {Type.Namespace}"); var inheritance = DocUtilities.GetInheritanceString(Type); if (!String.IsNullOrEmpty(inheritance)) { writer.WriteParagraph($"**Inheritance:** {inheritance}"); } writer.WriteParagraph(Docs?.Summary ?? "(No Description)"); writer.WriteHeader(2, "Signature"); writer.WriteCodeBlock("csharp", DocUtilities.GetClassSignature(Type)); var methods = Type.GetMethods().OrderBy(m => m.Name).ToArray(); if (methods.Length > 0) { writer.WriteHeader(2, "Methods"); foreach (var methodGroup in methods.Where(m => !m.IsSpecialName).GroupBy(m => m.Name)) { var sbLink = new StringBuilder($"- [{DocUtilities.GetIdentifier(methodGroup.Key)}]({DocUtilities.GetURLTitle(Type)}/{DocUtilities.GetIdentifier(methodGroup.Key)}.md)"); bool isStatic = methodGroup.All(m => m.IsStatic); if (isStatic) { sbLink.Append(" (static)"); } writer.WriteLine(sbLink.ToString()); } } var props = Type.GetProperties() .Where(p => p.GetIndexParameters().Length == 0) .OrderBy(p => p.Name) .ToArray(); if (props.Length > 0) { writer.WriteHeader(2, "Properties"); foreach (var prop in props) { var sbLink = new StringBuilder($"- [{DocUtilities.GetIdentifier(prop.Name)}]({DocUtilities.GetURLTitle(Type)}/{DocUtilities.GetIdentifier(prop.Name)}.md)"); bool isStatic = prop.CanRead && prop.GetGetMethod(true).IsStatic || prop.CanWrite && prop.GetSetMethod(true).IsStatic; if (isStatic) { sbLink.Append(" (static)"); } writer.WriteLine(sbLink.ToString()); } } var fields = Type.GetFields() .Where(f => !f.IsSpecialName) .OrderBy(f => f.Name) .ToArray(); if (fields.Length > 0) { writer.WriteHeader(2, "Fields"); foreach (var field in fields) { var sbLink = new StringBuilder($"- [{DocUtilities.GetIdentifier(field.Name)}]({DocUtilities.GetURLTitle(Type)}/{DocUtilities.GetIdentifier(field.Name)}.md)"); if (field.IsStatic) { sbLink.Append(" (static)"); } writer.WriteLine(sbLink.ToString()); } } // TODO: Events //writer.WriteHeader(2, "Events"); var operators = Type.GetMethods() .Where(m => m.Name.StartsWith("op_") && m.Name != "op_Explicit" && m.Name != "op_Implicit") .ToArray(); if (operators.Length > 0) { writer.WriteHeader(2, "Operators"); foreach (var op in operators) { writer.WriteLine($"- [{DocUtilities.GetOperatorSymbol(op.Name)}]({DocUtilities.GetURLTitle(Type)}/{op.Name}.md)"); } } writer.WriteHeader(2, "Conversions"); }
public static Doc Print(NamespaceDeclarationSyntax node) { var docs = new List <Doc> { ExtraNewLines.Print(node), AttributeLists.Print(node, node.AttributeLists), Modifiers.Print(node.Modifiers), Token.Print(node.NamespaceKeyword), " ", Node.Print(node.Name) }; var innerDocs = new List <Doc>(); var hasMembers = node.Members.Count > 0; var hasUsing = node.Usings.Count > 0; var hasExterns = node.Externs.Count > 0; if (hasMembers || hasUsing || hasExterns) { innerDocs.Add(Doc.HardLine); if (hasExterns) { innerDocs.Add( Doc.Join(Doc.HardLine, node.Externs.Select(ExternAliasDirective.Print)), Doc.HardLine ); } if (hasUsing) { innerDocs.Add( Doc.Join(Doc.HardLine, node.Usings.Select(UsingDirective.Print)), Doc.HardLine ); } if (hasMembers) { innerDocs.Add( Doc.Join(Doc.HardLine, node.Members.Select(Node.Print)), Doc.HardLine ); } innerDocs.RemoveAt(innerDocs.Count - 1); } else { innerDocs.Add(" "); } DocUtilities.RemoveInitialDoubleHardLine(innerDocs); docs.Add( Doc.Group( Doc.Line, Token.Print(node.OpenBraceToken), Doc.Indent(innerDocs), hasMembers || hasUsing || hasExterns ? Doc.HardLine : Doc.Null, Token.Print(node.CloseBraceToken), Token.Print(node.SemicolonToken) ) ); return(Doc.Concat(docs)); }
public FieldPage(FieldInfo field, MemberXmlDocs docs) : base(docs) { _field = field; Title = $"{DocUtilities.GetFieldSignature(_field, false)} field ({DocUtilities.GetDisplayTitle(_field.DeclaringType)})"; }
public static Doc Print(BaseTypeDeclarationSyntax node) { ParameterListSyntax? parameterList = null; TypeParameterListSyntax?typeParameterList = null; var constraintClauses = Enumerable.Empty <TypeParameterConstraintClauseSyntax>(); var hasMembers = false; SyntaxToken?keyword = null; Doc members = Doc.Null; SyntaxToken?semicolonToken = null; string? groupId = null; if (node is TypeDeclarationSyntax typeDeclarationSyntax) { typeParameterList = typeDeclarationSyntax.TypeParameterList; constraintClauses = typeDeclarationSyntax.ConstraintClauses; hasMembers = typeDeclarationSyntax.Members.Count > 0; if (typeDeclarationSyntax.Members.Count > 0) { members = Doc.Indent( Doc.HardLine, Doc.Join(Doc.HardLine, typeDeclarationSyntax.Members.Select(Node.Print)) ); } if (node is ClassDeclarationSyntax classDeclarationSyntax) { keyword = classDeclarationSyntax.Keyword; } else if (node is StructDeclarationSyntax structDeclarationSyntax) { keyword = structDeclarationSyntax.Keyword; } else if (node is InterfaceDeclarationSyntax interfaceDeclarationSyntax) { keyword = interfaceDeclarationSyntax.Keyword; } else if (node is RecordDeclarationSyntax recordDeclarationSyntax) { keyword = recordDeclarationSyntax.Keyword; groupId = Guid.NewGuid().ToString(); parameterList = recordDeclarationSyntax.ParameterList; } semicolonToken = typeDeclarationSyntax.SemicolonToken; } else if (node is EnumDeclarationSyntax enumDeclarationSyntax) { members = Doc.Indent( Doc.HardLine, SeparatedSyntaxList.Print( enumDeclarationSyntax.Members, EnumMemberDeclaration.Print, Doc.HardLine ) ); hasMembers = enumDeclarationSyntax.Members.Count > 0; keyword = enumDeclarationSyntax.EnumKeyword; semicolonToken = enumDeclarationSyntax.SemicolonToken; } var docs = new List <Doc> { ExtraNewLines.Print(node), AttributeLists.Print(node, node.AttributeLists), Modifiers.Print(node.Modifiers) }; if (keyword != null) { docs.Add(Token.PrintWithSuffix(keyword.Value, " ")); } docs.Add(Token.Print(node.Identifier)); if (typeParameterList != null) { docs.Add(TypeParameterList.Print(typeParameterList)); } if (parameterList != null) { docs.Add(ParameterList.Print(parameterList, groupId)); } if (node.BaseList != null) { docs.Add(BaseList.Print(node.BaseList)); } docs.Add(ConstraintClauses.Print(constraintClauses)); if (hasMembers) { DocUtilities.RemoveInitialDoubleHardLine(members); var useSpaceBraceWithParameterList = groupId != null && parameterList != null; docs.Add( useSpaceBraceWithParameterList ? Doc.IfBreak(" ", Doc.Line, groupId) : Doc.HardLine, Token.Print(node.OpenBraceToken), members, Doc.HardLine, Token.Print(node.CloseBraceToken) ); } else if (node.OpenBraceToken.Kind() != SyntaxKind.None) { Doc separator = node.CloseBraceToken.LeadingTrivia.Any() ? Doc.Line : " "; docs.Add( separator, Token.Print(node.OpenBraceToken), separator, Token.Print(node.CloseBraceToken) ); } if (semicolonToken.HasValue) { docs.Add(Token.Print(semicolonToken.Value)); } return(Doc.Concat(docs)); }
public MethodGroupPage(Type type, string name, Dictionary <MethodInfo, MemberXmlDocs> methodData) : base(null) { _type = type; _methodData = methodData; Title = $"{DocUtilities.GetDisplayTitle(type)}.{DocUtilities.GetIdentifier(name)} method"; }
public PropertyPage(PropertyInfo property, MemberXmlDocs docs) : base(docs) { _property = property; Title = $"{DocUtilities.GetPropertySignature(_property, false, false, false)} property ({DocUtilities.GetDisplayTitle(_property.DeclaringType)})"; }