@@ -120,6 +120,9 @@ private async Task<Document> CreateChangedDocument(CodeFixContext context, Docum
120
120
. ReplaceExteriorTrivia ( contentsOnly , leadingTrivia )
121
121
. WithLeadingTrivia ( SyntaxFactory . DocumentationCommentExterior ( "///" ) ) ;
122
122
123
+ // Remove unnecessary nested paragraph elements
124
+ contentsOnly = contentsOnly . ReplaceNodes ( contentsOnly . DescendantNodes ( ) . OfType < XmlElementSyntax > ( ) , RemoveNestedParagraphs ) ;
125
+
123
126
SyntaxNode root = await context . Document . GetSyntaxRootAsync ( cancellationToken ) ;
124
127
SyntaxNode newRoot = root . ReplaceNode ( documentationCommentTriviaSyntax , contentsOnly ) ;
125
128
if ( documentationCommentTriviaSyntax . IsEquivalentTo ( contentsOnly ) )
@@ -128,6 +131,45 @@ private async Task<Document> CreateChangedDocument(CodeFixContext context, Docum
128
131
return context . Document . WithSyntaxRoot ( newRoot ) ;
129
132
}
130
133
134
+ private SyntaxNode RemoveNestedParagraphs ( SyntaxNode originalNode , SyntaxNode rewrittenNode )
135
+ {
136
+ XmlElementSyntax elementSyntax = rewrittenNode as XmlElementSyntax ;
137
+ if ( ! IsUnnecessaryParaElement ( elementSyntax ) )
138
+ return rewrittenNode ;
139
+
140
+ return elementSyntax . Content [ 0 ] . WithTriviaFrom ( rewrittenNode ) ;
141
+ }
142
+
143
+ private static bool IsUnnecessaryParaElement ( XmlElementSyntax elementSyntax )
144
+ {
145
+ if ( elementSyntax == null )
146
+ return false ;
147
+
148
+ if ( HasAttributes ( elementSyntax ) )
149
+ return false ;
150
+
151
+ if ( ! IsParaElement ( elementSyntax ) )
152
+ return false ;
153
+
154
+ if ( elementSyntax . Content . Count != 1 )
155
+ return false ;
156
+
157
+ if ( ! IsParaElement ( elementSyntax . Content [ 0 ] as XmlElementSyntax ) )
158
+ return false ;
159
+
160
+ return true ;
161
+ }
162
+
163
+ private static bool HasAttributes ( XmlElementSyntax syntax )
164
+ {
165
+ return syntax . StartTag ? . Attributes . Count > 0 ;
166
+ }
167
+
168
+ private static bool IsParaElement ( XmlElementSyntax syntax )
169
+ {
170
+ return string . Equals ( "para" , syntax ? . StartTag ? . Name ? . ToString ( ) , StringComparison . Ordinal ) ;
171
+ }
172
+
131
173
private SyntaxNode RenderBlockElementAsMarkdown ( SyntaxNode originalNode , SyntaxNode rewrittenNode )
132
174
{
133
175
XmlElementSyntax elementSyntax = rewrittenNode as XmlElementSyntax ;
0 commit comments