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