77using System . Threading . Tasks ;
88using Microsoft . CodeAnalysis . CodeActions ;
99using Microsoft . CodeAnalysis . CodeFixes ;
10+ using Microsoft . CodeAnalysis . Editing ;
1011using Microsoft . CodeAnalysis . LanguageService ;
1112using Microsoft . CodeAnalysis . Rename ;
1213using Microsoft . CodeAnalysis . Shared . Extensions ;
@@ -24,8 +25,12 @@ internal abstract partial class AbstractMakeMethodAsynchronousCodeFixProvider :
2425
2526 protected abstract bool IsAsyncReturnType ( ITypeSymbol type , KnownTaskTypes knownTypes ) ;
2627
27- protected abstract SyntaxNode AddAsyncTokenAndFixReturnType (
28- bool keepVoid , IMethodSymbol methodSymbol , SyntaxNode node , KnownTaskTypes knownTypes ) ;
28+ protected abstract SyntaxNode FixMethodSignature (
29+ bool addAsyncModifier ,
30+ bool keepVoid ,
31+ IMethodSymbol methodSymbol ,
32+ SyntaxNode node ,
33+ KnownTaskTypes knownTypes ) ;
2934
3035 public override FixAllProvider GetFixAllProvider ( ) => WellKnownFixAllProviders . BatchFixer ;
3136
@@ -119,7 +124,7 @@ private async Task<Solution> FixNodeAsync(
119124
120125 return NeedsRename ( )
121126 ? await RenameThenAddAsyncTokenAsync ( keepVoid , document , node , methodSymbol , knownTypes , cancellationToken ) . ConfigureAwait ( false )
122- : await AddAsyncTokenAsync ( keepVoid , document , methodSymbol , knownTypes , node , cancellationToken ) . ConfigureAwait ( false ) ;
127+ : await FixRelatedSignaturesAsync ( keepVoid , document , methodSymbol , knownTypes , node , cancellationToken ) . ConfigureAwait ( false ) ;
123128
124129 bool NeedsRename ( )
125130 {
@@ -174,26 +179,39 @@ private async Task<Solution> RenameThenAddAsyncTokenAsync(
174179 {
175180 var semanticModel = await newDocument . GetRequiredSemanticModelAsync ( cancellationToken ) . ConfigureAwait ( false ) ;
176181 var newMethod = ( IMethodSymbol ) semanticModel . GetRequiredDeclaredSymbol ( newNode , cancellationToken ) ;
177- return await AddAsyncTokenAsync ( keepVoid , newDocument , newMethod , knownTypes , newNode , cancellationToken ) . ConfigureAwait ( false ) ;
182+ return await FixRelatedSignaturesAsync ( keepVoid , newDocument , newMethod , knownTypes , newNode , cancellationToken ) . ConfigureAwait ( false ) ;
178183 }
179184
180185 return newSolution ;
181186 }
182187
183- private async Task < Solution > AddAsyncTokenAsync (
188+ private async Task < Solution > FixRelatedSignaturesAsync (
184189 bool keepVoid ,
185190 Document document ,
186191 IMethodSymbol methodSymbol ,
187192 KnownTaskTypes knownTypes ,
188193 SyntaxNode node ,
189194 CancellationToken cancellationToken )
190195 {
191- var newNode = AddAsyncTokenAndFixReturnType ( keepVoid , methodSymbol , node , knownTypes ) ;
196+ var newNode = FixMethodSignature ( addAsyncModifier : true , keepVoid , methodSymbol , node , knownTypes ) ;
197+
198+ var solution = document . Project . Solution ;
199+ var solutionEditor = new SolutionEditor ( solution ) ;
200+ var mainDocumentEditor = await solutionEditor . GetDocumentEditorAsync ( document . Id , cancellationToken ) . ConfigureAwait ( false ) ;
192201
193- var root = await document . GetRequiredSyntaxRootAsync ( cancellationToken ) . ConfigureAwait ( false ) ;
194- var newRoot = root . ReplaceNode ( node , newNode ) ;
202+ mainDocumentEditor . ReplaceNode ( node , newNode ) ;
203+
204+ if ( ! keepVoid && methodSymbol . PartialDefinitionPart is { } partialDefinition )
205+ {
206+ var partialDefinitionNode = partialDefinition . Locations [ 0 ] . FindNode ( cancellationToken ) ;
207+ var fixedPartialDefinitionNode = FixMethodSignature ( addAsyncModifier : false , keepVoid , methodSymbol , partialDefinitionNode , knownTypes ) ;
208+
209+ var partialDefinitionDocument = solution . GetDocument ( partialDefinitionNode . SyntaxTree ) ;
210+ Contract . ThrowIfNull ( partialDefinitionDocument ) ;
211+ var partialDefinitionDocumentEditor = await solutionEditor . GetDocumentEditorAsync ( partialDefinitionDocument . Id , cancellationToken ) . ConfigureAwait ( false ) ;
212+ partialDefinitionDocumentEditor . ReplaceNode ( partialDefinitionNode , fixedPartialDefinitionNode ) ;
213+ }
195214
196- var newDocument = document . WithSyntaxRoot ( newRoot ) ;
197- return newDocument . Project . Solution ;
215+ return solutionEditor . GetChangedSolution ( ) ;
198216 }
199217}
0 commit comments