@@ -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