Skip to content

Commit 389d7c2

Browse files
committed
Use a two-step process to remove unnecessary paragraphs
1 parent 55284a7 commit 389d7c2

File tree

1 file changed

+28
-3
lines changed

1 file changed

+28
-3
lines changed

OpenStackNetAnalyzers/OpenStackNetAnalyzers/RenderAsMarkdownCodeFix.cs

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ public class RenderAsMarkdownCodeFix : CodeFixProvider
2222
private static readonly ImmutableArray<string> _fixableDiagnostics =
2323
ImmutableArray.Create(RenderAsMarkdownAnalyzer.DiagnosticId);
2424

25+
private static readonly SyntaxAnnotation UnnecessaryParagraphAnnotation =
26+
new SyntaxAnnotation("OpenStack:UnnecessaryParagraph");
27+
2528
public sealed override ImmutableArray<string> GetFixableDiagnosticIds()
2629
{
2730
return _fixableDiagnostics;
@@ -119,7 +122,8 @@ private async Task<Document> CreateChangedDocument(CodeFixContext context, Docum
119122
return context.Document;
120123

121124
// Remove unnecessary nested paragraph elements
122-
contentsOnly = contentsOnly.ReplaceNodes(contentsOnly.DescendantNodes().OfType<XmlElementSyntax>(), RemoveNestedParagraphs);
125+
contentsOnly = contentsOnly.ReplaceNodes(contentsOnly.DescendantNodes().OfType<XmlElementSyntax>(), MarkUnnecessaryParagraphs);
126+
contentsOnly = contentsOnly.ReplaceNodes(contentsOnly.DescendantNodes().OfType<XmlElementSyntax>(), RemoveUnnecessaryParagraphs);
123127

124128
SyntaxNode root = await context.Document.GetSyntaxRootAsync(cancellationToken);
125129
SyntaxNode newRoot = root.ReplaceNode(documentationCommentTriviaSyntax, contentsOnly);
@@ -129,13 +133,34 @@ private async Task<Document> CreateChangedDocument(CodeFixContext context, Docum
129133
return context.Document.WithSyntaxRoot(newRoot);
130134
}
131135

132-
private SyntaxNode RemoveNestedParagraphs(SyntaxNode originalNode, SyntaxNode rewrittenNode)
136+
private SyntaxNode MarkUnnecessaryParagraphs(SyntaxNode originalNode, SyntaxNode rewrittenNode)
133137
{
134138
XmlElementSyntax elementSyntax = rewrittenNode as XmlElementSyntax;
135139
if (!IsUnnecessaryParaElement(elementSyntax))
136140
return rewrittenNode;
137141

138-
return elementSyntax.Content[0].WithTriviaFrom(rewrittenNode);
142+
return elementSyntax.WithAdditionalAnnotations(UnnecessaryParagraphAnnotation);
143+
}
144+
145+
private SyntaxNode RemoveUnnecessaryParagraphs(XmlElementSyntax originalNode, XmlElementSyntax rewrittenNode)
146+
{
147+
bool hasUnnecessary = false;
148+
SyntaxList<XmlNodeSyntax> content = rewrittenNode.Content;
149+
for (int i = 0; i < content.Count; i++)
150+
{
151+
if (content[i].HasAnnotation(UnnecessaryParagraphAnnotation))
152+
{
153+
hasUnnecessary = true;
154+
XmlElementSyntax unnecessaryElement = (XmlElementSyntax)content[i];
155+
content = content.ReplaceRange(unnecessaryElement, unnecessaryElement.Content);
156+
i += unnecessaryElement.Content.Count;
157+
}
158+
}
159+
160+
if (!hasUnnecessary)
161+
return rewrittenNode;
162+
163+
return rewrittenNode.WithContent(content);
139164
}
140165

141166
private static bool IsUnnecessaryParaElement(XmlElementSyntax elementSyntax)

0 commit comments

Comments
 (0)