@@ -52,11 +52,11 @@ public override async Task ComputeFixesAsync(CodeFixContext context)
5252
5353 private async Task < Document > CreateChangedDocument ( CodeFixContext context , PropertyDeclarationSyntax propertyDeclarationSyntax , CancellationToken cancellationToken )
5454 {
55- DocumentationCommentTriviaSyntax documentationComment = DocumentValueFromSummaryAnalyzer . GetDocumentationCommentTriviaSyntax ( propertyDeclarationSyntax ) ;
55+ DocumentationCommentTriviaSyntax documentationComment = propertyDeclarationSyntax . GetDocumentationCommentTriviaSyntax ( ) ;
5656 if ( documentationComment == null )
5757 return context . Document ;
5858
59- XmlElementSyntax summaryElement = ( XmlElementSyntax ) DocumentValueFromSummaryAnalyzer . GetXmlElement ( documentationComment . Content , "summary" ) ;
59+ XmlElementSyntax summaryElement = ( XmlElementSyntax ) documentationComment . Content . GetFirstXmlElement ( "summary" ) ;
6060 if ( summaryElement == null )
6161 return context . Document ;
6262
@@ -111,15 +111,15 @@ private async Task<Document> CreateChangedDocument(CodeFixContext context, Prope
111111 if ( propertySymbol != null )
112112 {
113113 ITypeSymbol propertyType = propertySymbol . Type ;
114- if ( string . Equals ( "ImmutableArray`1" , propertyType ? . MetadataName , StringComparison . Ordinal ) )
114+ if ( propertyType . IsImmutableArray ( ) )
115115 defaultValueToken = "DefaultArrayIfNotIncluded" ;
116116 }
117117
118118 XmlElementSyntax valueElement =
119119 XmlSyntaxFactory . MultiLineElement (
120120 "value" ,
121121 XmlSyntaxFactory . List (
122- XmlSyntaxFactory . ParaElement ( XmlSyntaxFactory . PlaceholderElement ( RemoveFirstAndListNewlines ( summaryContent ) ) ) ,
122+ XmlSyntaxFactory . ParaElement ( XmlSyntaxFactory . PlaceholderElement ( summaryContent . WithoutFirstAndLastNewlines ( ) ) ) ,
123123 XmlSyntaxFactory . NewLine ( ) ,
124124 XmlSyntaxFactory . TokenElement ( defaultValueToken ) ) ) ;
125125
@@ -131,8 +131,8 @@ private async Task<Document> CreateChangedDocument(CodeFixContext context, Prope
131131 SyntaxTrivia exteriorTrivia = GetLastDocumentationCommentExteriorTrivia ( documentationComment ) ;
132132 if ( ! exteriorTrivia . Token . IsMissing )
133133 {
134- leadingNewLine = ReplaceExteriorTrivia ( leadingNewLine , exteriorTrivia ) ;
135- valueElement = ReplaceExteriorTrivia ( valueElement , exteriorTrivia ) ;
134+ leadingNewLine = leadingNewLine . ReplaceExteriorTrivia ( exteriorTrivia ) ;
135+ valueElement = valueElement . ReplaceExteriorTrivia ( exteriorTrivia ) ;
136136 }
137137
138138 DocumentationCommentTriviaSyntax newDocumentationComment = documentationComment . WithContent (
@@ -168,142 +168,5 @@ private SyntaxTrivia GetLastDocumentationCommentExteriorTrivia(SyntaxNode node)
168168 . Where ( trivia => trivia . IsKind ( SyntaxKind . DocumentationCommentExteriorTrivia ) )
169169 . LastOrDefault ( ) ;
170170 }
171-
172- private T ReplaceExteriorTrivia < T > ( T node , SyntaxTrivia trivia )
173- where T : SyntaxNode
174- {
175- // Make sure to include a space after the '///' characters.
176- SyntaxTrivia triviaWithSpace = SyntaxFactory . DocumentationCommentExterior ( trivia . ToString ( ) + " " ) ;
177-
178- return node . ReplaceTrivia (
179- node . DescendantTrivia ( descendIntoTrivia : true ) . Where ( i => i . IsKind ( SyntaxKind . DocumentationCommentExteriorTrivia ) ) ,
180- ( originalTrivia , rewrittenTrivia ) => SelectExteriorTrivia ( rewrittenTrivia , trivia , triviaWithSpace ) ) ;
181- }
182-
183- private SyntaxTrivia SelectExteriorTrivia ( SyntaxTrivia rewrittenTrivia , SyntaxTrivia trivia , SyntaxTrivia triviaWithSpace )
184- {
185- // if the trivia had a trailing space, make sure to preserve it
186- if ( rewrittenTrivia . ToString ( ) . EndsWith ( " " ) )
187- return triviaWithSpace ;
188-
189- // otherwise the space is part of the leading trivia of the following token, so don't add an extra one to
190- // the exterior trivia
191- return trivia ;
192- }
193-
194- private SyntaxList < XmlNodeSyntax > RemoveFirstAndListNewlines ( SyntaxList < XmlNodeSyntax > summaryContent )
195- {
196- if ( summaryContent . Count == 0 )
197- return summaryContent ;
198-
199- XmlTextSyntax firstSyntax = summaryContent [ 0 ] as XmlTextSyntax ;
200- if ( firstSyntax == null )
201- return summaryContent ;
202-
203- XmlTextSyntax lastSyntax = summaryContent [ summaryContent . Count - 1 ] as XmlTextSyntax ;
204- if ( lastSyntax == null )
205- return summaryContent ;
206-
207- SyntaxTokenList firstSyntaxTokens = firstSyntax . TextTokens ;
208-
209- int removeFromStart ;
210- if ( IsNewLine ( firstSyntaxTokens [ 0 ] ) )
211- {
212- removeFromStart = 1 ;
213- }
214- else
215- {
216- if ( ! IsWhitespace ( firstSyntaxTokens [ 0 ] ) )
217- return summaryContent ;
218-
219- if ( ! IsNewLine ( firstSyntaxTokens [ 1 ] ) )
220- return summaryContent ;
221-
222- removeFromStart = 2 ;
223- }
224-
225- SyntaxTokenList lastSyntaxTokens = lastSyntax . TextTokens ;
226-
227- int removeFromEnd ;
228- if ( IsNewLine ( lastSyntaxTokens [ lastSyntaxTokens . Count - 1 ] ) )
229- {
230- removeFromEnd = 1 ;
231- }
232- else
233- {
234- if ( ! IsWhitespace ( lastSyntaxTokens [ lastSyntaxTokens . Count - 1 ] ) )
235- return summaryContent ;
236-
237- if ( ! IsNewLine ( lastSyntaxTokens [ lastSyntaxTokens . Count - 2 ] ) )
238- return summaryContent ;
239-
240- removeFromEnd = 2 ;
241- }
242-
243- for ( int i = 0 ; i < removeFromStart ; i ++ )
244- {
245- firstSyntaxTokens = firstSyntaxTokens . RemoveAt ( 0 ) ;
246- }
247-
248- if ( firstSyntax == lastSyntax )
249- {
250- lastSyntaxTokens = firstSyntaxTokens ;
251- }
252-
253- for ( int i = 0 ; i < removeFromEnd ; i ++ )
254- {
255- lastSyntaxTokens = lastSyntaxTokens . RemoveAt ( lastSyntaxTokens . Count - 1 ) ;
256- }
257-
258- summaryContent = summaryContent . RemoveAt ( summaryContent . Count - 1 ) ;
259- if ( lastSyntaxTokens . Count != 0 )
260- summaryContent = summaryContent . Add ( lastSyntax . WithTextTokens ( lastSyntaxTokens ) ) ;
261-
262- if ( firstSyntax != lastSyntax )
263- {
264- summaryContent = summaryContent . RemoveAt ( 0 ) ;
265- if ( firstSyntaxTokens . Count != 0 )
266- summaryContent = summaryContent . Insert ( 0 , firstSyntax . WithTextTokens ( firstSyntaxTokens ) ) ;
267- }
268-
269- if ( summaryContent . Count > 0 )
270- {
271- // Make sure to remove the leading trivia
272- summaryContent = summaryContent . Replace ( summaryContent [ 0 ] , summaryContent [ 0 ] . WithLeadingTrivia ( ) ) ;
273-
274- // Remove leading spaces (between the <para> start tag and the start of the paragraph content)
275- XmlTextSyntax firstTextSyntax = summaryContent [ 0 ] as XmlTextSyntax ;
276- if ( firstTextSyntax != null && firstTextSyntax . TextTokens . Count > 0 )
277- {
278- SyntaxToken firstTextToken = firstTextSyntax . TextTokens [ 0 ] ;
279- string firstTokenText = firstTextToken . Text ;
280- string trimmed = firstTokenText . TrimStart ( ) ;
281- if ( trimmed != firstTokenText )
282- {
283- SyntaxToken newFirstToken = SyntaxFactory . Token (
284- firstTextToken . LeadingTrivia ,
285- firstTextToken . CSharpKind ( ) ,
286- trimmed ,
287- firstTextToken . ValueText . TrimStart ( ) ,
288- firstTextToken . TrailingTrivia ) ;
289-
290- summaryContent = summaryContent . Replace ( firstTextSyntax , firstTextSyntax . ReplaceToken ( firstTextToken , newFirstToken ) ) ;
291- }
292- }
293- }
294-
295- return summaryContent ;
296- }
297-
298- private bool IsNewLine ( SyntaxToken node )
299- {
300- return node . IsKind ( SyntaxKind . XmlTextLiteralNewLineToken ) ;
301- }
302-
303- private bool IsWhitespace ( SyntaxToken node )
304- {
305- return node . IsKind ( SyntaxKind . XmlTextLiteralToken )
306- && string . IsNullOrWhiteSpace ( node . Text ) ;
307- }
308171 }
309172}
0 commit comments