@@ -120,6 +120,9 @@ private async Task<Document> CreateChangedDocument(CodeFixContext context, Docum
120120 . ReplaceExteriorTrivia ( contentsOnly , leadingTrivia )
121121 . WithLeadingTrivia ( SyntaxFactory . DocumentationCommentExterior ( "///" ) ) ;
122122
123+ // Remove unnecessary nested paragraph elements
124+ contentsOnly = contentsOnly . ReplaceNodes ( contentsOnly . DescendantNodes ( ) . OfType < XmlElementSyntax > ( ) , RemoveNestedParagraphs ) ;
125+
123126 SyntaxNode root = await context . Document . GetSyntaxRootAsync ( cancellationToken ) ;
124127 SyntaxNode newRoot = root . ReplaceNode ( documentationCommentTriviaSyntax , contentsOnly ) ;
125128 if ( documentationCommentTriviaSyntax . IsEquivalentTo ( contentsOnly ) )
@@ -128,6 +131,45 @@ private async Task<Document> CreateChangedDocument(CodeFixContext context, Docum
128131 return context . Document . WithSyntaxRoot ( newRoot ) ;
129132 }
130133
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+
131173 private SyntaxNode RenderBlockElementAsMarkdown ( SyntaxNode originalNode , SyntaxNode rewrittenNode )
132174 {
133175 XmlElementSyntax elementSyntax = rewrittenNode as XmlElementSyntax ;
0 commit comments