Skip to content

Commit 26875b7

Browse files
committed
Add XmlSyntaxFactory and simplify the builder
1 parent 202ed8d commit 26875b7

3 files changed

Lines changed: 154 additions & 45 deletions

File tree

OpenStackNetAnalyzers/OpenStackNetAnalyzers/ImplementBuilderPatternCodeFix.cs

Lines changed: 15 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -110,51 +110,21 @@ private async Task<Solution> CreateChangedSolution(CodeFixContext context, Class
110110
{
111111
// Need to add a new class for the extension methods.
112112

113-
DocumentationCommentTriviaSyntax documentationComment = SyntaxFactory.DocumentationCommentTrivia(SyntaxKind.SingleLineDocumentationCommentTrivia)
114-
.AddContent(
115-
SyntaxFactory.XmlElement(
116-
SyntaxFactory.XmlElementStartTag(SyntaxFactory.XmlName("summary")),
117-
SyntaxFactory.List<XmlNodeSyntax>()
118-
.Add(
119-
SyntaxFactory.XmlText().AddTextTokens(
120-
SyntaxFactory.XmlTextNewLine(SyntaxFactory.TriviaList(), Environment.NewLine, Environment.NewLine, SyntaxFactory.TriviaList()),
121-
SyntaxFactory.XmlTextLiteral(SyntaxFactory.TriviaList(), "This class provides extension methods for the ", "This class provides extension methods for the ", SyntaxFactory.TriviaList())
122-
.WithLeadingTrivia(SyntaxFactory.DocumentationCommentExterior("/// "))))
123-
.Add(
124-
SyntaxFactory.XmlEmptyElement(SyntaxFactory.XmlName("see")).AddAttributes(
125-
SyntaxFactory.XmlCrefAttribute(
126-
SyntaxFactory.XmlName("cref"),
127-
SyntaxFactory.Token(SyntaxKind.DoubleQuoteToken),
128-
SyntaxFactory.TypeCref(SyntaxFactory.ParseTypeName(declaringType.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat))),
129-
SyntaxFactory.Token(SyntaxKind.DoubleQuoteToken))
130-
.WithLeadingTrivia(SyntaxFactory.Whitespace(" "))))
131-
.Add(
132-
SyntaxFactory.XmlText().AddTextTokens(
133-
SyntaxFactory.XmlTextLiteral(SyntaxFactory.TriviaList(), " class.", " class.", SyntaxFactory.TriviaList()),
134-
SyntaxFactory.XmlTextNewLine(SyntaxFactory.TriviaList(), Environment.NewLine, Environment.NewLine, SyntaxFactory.TriviaList()))),
135-
SyntaxFactory.XmlElementEndTag(SyntaxFactory.XmlName("summary"))
136-
.WithLeadingTrivia(SyntaxFactory.DocumentationCommentExterior("/// "))),
137-
SyntaxFactory.XmlText().AddTextTokens(SyntaxFactory.XmlTextNewLine(SyntaxFactory.TriviaList(), Environment.NewLine, Environment.NewLine, SyntaxFactory.TriviaList())),
138-
SyntaxFactory.XmlEmptyElement(SyntaxFactory.XmlName("threadsafety"))
139-
.AddAttributes(
140-
SyntaxFactory.XmlTextAttribute(
141-
SyntaxFactory.XmlName("static"),
142-
SyntaxFactory.Token(SyntaxKind.DoubleQuoteToken),
143-
SyntaxFactory.TokenList(SyntaxFactory.XmlTextLiteral(SyntaxFactory.TriviaList(), "true", "true", SyntaxFactory.TriviaList())),
144-
SyntaxFactory.Token(SyntaxKind.DoubleQuoteToken))
145-
.WithLeadingTrivia(SyntaxFactory.Whitespace(" ")),
146-
SyntaxFactory.XmlTextAttribute(
147-
SyntaxFactory.XmlName("instance"),
148-
SyntaxFactory.Token(SyntaxKind.DoubleQuoteToken),
149-
SyntaxFactory.TokenList(SyntaxFactory.XmlTextLiteral(SyntaxFactory.TriviaList(), "false", "false", SyntaxFactory.TriviaList())),
150-
SyntaxFactory.Token(SyntaxKind.DoubleQuoteToken))
151-
.WithLeadingTrivia(SyntaxFactory.Whitespace(" ")))
152-
.WithLeadingTrivia(SyntaxFactory.DocumentationCommentExterior("/// ")),
153-
SyntaxFactory.XmlText().AddTextTokens(SyntaxFactory.XmlTextNewLine(SyntaxFactory.TriviaList(), Environment.NewLine, Environment.NewLine, SyntaxFactory.TriviaList())),
154-
SyntaxFactory.XmlEmptyElement(SyntaxFactory.XmlName("preliminary"))
155-
.WithLeadingTrivia(SyntaxFactory.DocumentationCommentExterior("/// ")))
156-
.WithLeadingTrivia(SyntaxFactory.DocumentationCommentExterior("/// "))
157-
.WithTrailingTrivia(SyntaxFactory.EndOfLine(Environment.NewLine));
113+
DocumentationCommentTriviaSyntax documentationComment = XmlSyntaxFactory.DocumentationComment(
114+
XmlSyntaxFactory.MultiLineElement(
115+
"summary",
116+
XmlSyntaxFactory.List(
117+
XmlSyntaxFactory.Text("This class provides extension methods for the "),
118+
XmlSyntaxFactory.EmptyElement("see").AddAttributes(
119+
XmlSyntaxFactory.CrefAttribute(SyntaxFactory.TypeCref(SyntaxFactory.ParseTypeName(declaringType.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat))))),
120+
XmlSyntaxFactory.Text(" class."))),
121+
XmlSyntaxFactory.NewLine(),
122+
XmlSyntaxFactory.EmptyElement("threadsafety")
123+
.AddAttributes(
124+
XmlSyntaxFactory.TextAttribute("static", "true"),
125+
XmlSyntaxFactory.TextAttribute("instance", "false")),
126+
XmlSyntaxFactory.NewLine(),
127+
XmlSyntaxFactory.EmptyElement("preliminary"));
158128

159129
SyntaxNode extensionsClassRoot = SyntaxFactory.CompilationUnit().AddMembers(
160130
SyntaxFactory.NamespaceDeclaration(SyntaxFactory.ParseName(declaringType.ContainingNamespace.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat)))

OpenStackNetAnalyzers/OpenStackNetAnalyzers/OpenStackNetAnalyzers.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
<Compile Include="NonNullableJsonPropertyAnalyzer.cs" />
4343
<Compile Include="Properties\AssemblyInfo.cs" />
4444
<Compile Include="SpacingExtensions.cs" />
45+
<Compile Include="XmlSyntaxFactory.cs" />
4546
</ItemGroup>
4647
<ItemGroup>
4748
<None Include="Diagnostic.nuspec">
Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
namespace OpenStackNetAnalyzers
2+
{
3+
using System;
4+
using System.Xml.Linq;
5+
using Microsoft.CodeAnalysis;
6+
using Microsoft.CodeAnalysis.CSharp;
7+
using Microsoft.CodeAnalysis.CSharp.Syntax;
8+
9+
internal static class XmlSyntaxFactory
10+
{
11+
public static DocumentationCommentTriviaSyntax DocumentationComment(params XmlNodeSyntax[] content)
12+
{
13+
return SyntaxFactory.DocumentationCommentTrivia(SyntaxKind.SingleLineDocumentationCommentTrivia, List(content))
14+
.WithLeadingTrivia(SyntaxFactory.DocumentationCommentExterior("/// "))
15+
.WithTrailingTrivia(SyntaxFactory.EndOfLine(Environment.NewLine));
16+
}
17+
18+
public static XmlElementSyntax MultiLineElement(string localName, SyntaxList<XmlNodeSyntax> content)
19+
{
20+
return MultiLineElement(SyntaxFactory.XmlName(localName), content);
21+
}
22+
23+
public static XmlElementSyntax MultiLineElement(XmlNameSyntax name, SyntaxList<XmlNodeSyntax> content)
24+
{
25+
return SyntaxFactory.XmlElement(
26+
SyntaxFactory.XmlElementStartTag(name),
27+
content.Insert(0, NewLine()).Add(NewLine()),
28+
SyntaxFactory.XmlElementEndTag(name));
29+
}
30+
31+
public static XmlElementSyntax Element(string localName, SyntaxList<XmlNodeSyntax> content)
32+
{
33+
return Element(SyntaxFactory.XmlName(localName), content);
34+
}
35+
36+
public static XmlElementSyntax Element(XmlNameSyntax name, SyntaxList<XmlNodeSyntax> content)
37+
{
38+
return SyntaxFactory.XmlElement(
39+
SyntaxFactory.XmlElementStartTag(name),
40+
content,
41+
SyntaxFactory.XmlElementEndTag(name));
42+
}
43+
44+
public static XmlEmptyElementSyntax EmptyElement(string localName)
45+
{
46+
return SyntaxFactory.XmlEmptyElement(SyntaxFactory.XmlName(localName));
47+
}
48+
49+
public static SyntaxList<XmlNodeSyntax> List(params XmlNodeSyntax[] nodes)
50+
{
51+
return SyntaxFactory.List(nodes);
52+
}
53+
54+
public static XmlTextSyntax Text(string value)
55+
{
56+
return Text(TextLiteral(value));
57+
}
58+
59+
public static XmlTextSyntax Text(params SyntaxToken[] textTokens)
60+
{
61+
return SyntaxFactory.XmlText(SyntaxFactory.TokenList(textTokens));
62+
}
63+
64+
public static XmlTextAttributeSyntax TextAttribute(string name, string value)
65+
{
66+
return TextAttribute(name, TextLiteral(value));
67+
}
68+
69+
public static XmlTextAttributeSyntax TextAttribute(string name, params SyntaxToken[] textTokens)
70+
{
71+
return TextAttribute(SyntaxFactory.XmlName(name), SyntaxKind.DoubleQuoteToken, SyntaxFactory.TokenList(textTokens));
72+
}
73+
74+
public static XmlTextAttributeSyntax TextAttribute(string name, SyntaxKind quoteKind, SyntaxTokenList textTokens)
75+
{
76+
return TextAttribute(SyntaxFactory.XmlName(name), SyntaxKind.DoubleQuoteToken, textTokens);
77+
}
78+
79+
public static XmlTextAttributeSyntax TextAttribute(XmlNameSyntax name, SyntaxKind quoteKind, SyntaxTokenList textTokens)
80+
{
81+
return SyntaxFactory.XmlTextAttribute(
82+
name,
83+
SyntaxFactory.Token(quoteKind),
84+
textTokens,
85+
SyntaxFactory.Token(quoteKind))
86+
.WithLeadingTrivia(SyntaxFactory.Whitespace(" "));
87+
}
88+
89+
public static XmlCrefAttributeSyntax CrefAttribute(CrefSyntax cref)
90+
{
91+
return CrefAttribute(cref, SyntaxKind.DoubleQuoteToken);
92+
}
93+
94+
public static XmlCrefAttributeSyntax CrefAttribute(CrefSyntax cref, SyntaxKind quoteKind)
95+
{
96+
return SyntaxFactory.XmlCrefAttribute(
97+
SyntaxFactory.XmlName("cref"),
98+
SyntaxFactory.Token(quoteKind),
99+
cref,
100+
SyntaxFactory.Token(quoteKind))
101+
.WithLeadingTrivia(SyntaxFactory.Whitespace(" "));
102+
}
103+
104+
public static XmlTextSyntax NewLine()
105+
{
106+
return Text(TextNewLine());
107+
}
108+
109+
public static SyntaxToken TextNewLine()
110+
{
111+
return TextNewLine(true);
112+
}
113+
114+
public static SyntaxToken TextNewLine(bool continueComment)
115+
{
116+
SyntaxToken token = SyntaxFactory.XmlTextNewLine(
117+
SyntaxFactory.TriviaList(),
118+
Environment.NewLine,
119+
Environment.NewLine,
120+
SyntaxFactory.TriviaList());
121+
122+
if (continueComment)
123+
token = token.WithTrailingTrivia(SyntaxFactory.DocumentationCommentExterior("/// "));
124+
125+
return token;
126+
}
127+
128+
public static SyntaxToken TextLiteral(string value)
129+
{
130+
string encoded = new XText(value).ToString();
131+
return SyntaxFactory.XmlTextLiteral(
132+
SyntaxFactory.TriviaList(),
133+
encoded,
134+
value,
135+
SyntaxFactory.TriviaList());
136+
}
137+
}
138+
}

0 commit comments

Comments
 (0)