1010using ICSharpCode . CodeConverter . CSharp ;
1111using ICSharpCode . CodeConverter . Util ;
1212using Microsoft . CodeAnalysis ;
13- using Microsoft . CodeAnalysis . Formatting ;
1413using Microsoft . CodeAnalysis . Text ;
15- using Microsoft . VisualStudio . Threading ;
1614
1715namespace ICSharpCode . CodeConverter . Shared
1816{
@@ -69,7 +67,7 @@ private ProjectConversion(IProjectContentsConverter projectContentsConverter, IE
6967 document = projectContentsConverter . SourceProject . GetDocument ( document . Id ) ;
7068
7169 var conversion = new ProjectConversion ( projectContentsConverter , new [ ] { document } , Enumerable . Empty < TextDocument > ( ) , languageConversion , cancellationToken , conversionOptions . ShowCompilationErrors , returnSelectedNode ) ;
72- var conversionResults = await conversion . Convert ( progress ) . ToArrayAsync ( ) ;
70+ var conversionResults = await conversion . Convert ( progress ) . ToArrayAsync ( cancellationToken ) ;
7371 return GetSingleResultForDocument ( conversionResults , document ) ;
7472 }
7573
@@ -93,7 +91,7 @@ public static async IAsyncEnumerable<ConversionResult> ConvertProject(Project pr
9391 var convertProjectContents = ConvertProjectContents ( projectContentsConverter , languageConversion , progress , cancellationToken ) ;
9492
9593 var results = WithProjectFile ( projectContentsConverter , languageConversion , sourceFilePaths , convertProjectContents , replacements ) ;
96- await foreach ( var result in results ) yield return result ;
94+ await foreach ( var result in results . WithCancellation ( cancellationToken ) ) yield return result ;
9795 }
9896
9997 /// <remarks>Perf: Keep lazy so that we don't keep an extra copy of all files in memory at once</remarks>
@@ -164,23 +162,23 @@ private static async IAsyncEnumerable<ConversionResult> ConvertProjectContents(
164162 {
165163 var documentsWithLengths = await projectContentsConverter . SourceProject . Documents
166164 . Where ( d => ! BannedPaths . Any ( d . FilePath . Contains ) )
167- . SelectAsync ( async d => ( Doc : d , Length : ( await d . GetTextAsync ( ) ) . Length ) ) ;
165+ . SelectAsync ( async d => ( Doc : d , Length : ( await d . GetTextAsync ( cancellationToken ) ) . Length ) ) ;
168166
169167 //Perf heuristic: Decrease memory pressure on the simplification phase by converting large files first https://github.com/icsharpcode/CodeConverter/issues/524#issuecomment-590301594
170168 var documentsToConvert = documentsWithLengths . OrderByDescending ( d => d . Length ) . Select ( d => d . Doc ) ;
171169
172170 var projectConversion = new ProjectConversion ( projectContentsConverter , documentsToConvert , projectContentsConverter . SourceProject . AdditionalDocuments , languageConversion , cancellationToken , false ) ;
173171
174172 var results = projectConversion . Convert ( progress ) ;
175- await foreach ( var result in results ) yield return result ;
173+ await foreach ( var result in results . WithCancellation ( cancellationToken ) ) yield return result ;
176174 }
177175
178176
179177 private async IAsyncEnumerable < ConversionResult > Convert ( IProgress < ConversionProgress > progress )
180178 {
181179 var phaseProgress = StartPhase ( progress , "Phase 1 of 2:" ) ;
182180 var firstPassResults = _documentsToConvert . ParallelSelectAwait ( d => FirstPassLoggedAsync ( d , phaseProgress ) , Env . MaxDop , _cancellationToken ) ;
183- var ( proj1 , docs1 ) = await _projectContentsConverter . GetConvertedProjectAsync ( await firstPassResults . ToArrayAsync ( ) ) ;
181+ var ( proj1 , docs1 ) = await _projectContentsConverter . GetConvertedProjectAsync ( await firstPassResults . ToArrayAsync ( _cancellationToken ) ) ;
184182
185183 var warnings = await GetProjectWarningsAsync ( _projectContentsConverter . SourceProject , proj1 ) ;
186184 if ( ! string . IsNullOrWhiteSpace ( warnings ) ) {
@@ -190,7 +188,7 @@ private async IAsyncEnumerable<ConversionResult> Convert(IProgress<ConversionPro
190188
191189 phaseProgress = StartPhase ( progress , "Phase 2 of 2:" ) ;
192190 var secondPassResults = proj1 . GetDocuments ( docs1 ) . ParallelSelectAwait ( d => SecondPassLoggedAsync ( d , phaseProgress ) , Env . MaxDop , _cancellationToken ) ;
193- await foreach ( var result in secondPassResults . Select ( CreateConversionResult ) ) {
191+ await foreach ( var result in secondPassResults . Select ( CreateConversionResult ) . WithCancellation ( _cancellationToken ) ) {
194192 yield return result ;
195193 }
196194 await foreach ( var result in _projectContentsConverter . GetAdditionalConversionResults ( _additionalDocumentsToConvert , _cancellationToken ) ) {
@@ -233,29 +231,29 @@ private async Task<WipFileConversion<SyntaxNode>> SecondPassLoggedAsync(WipFileC
233231 selectedNode = await GetSelectedNodeAsync ( document ) ;
234232 var extraLeadingTrivia = selectedNode . GetFirstToken ( ) . GetPreviousToken ( ) . TrailingTrivia ;
235233 var extraTrailingTrivia = selectedNode . GetLastToken ( ) . GetNextToken ( ) . LeadingTrivia ;
236- selectedNode = Formatter . Format ( selectedNode , document . Project . Solution . Workspace ) ;
234+ selectedNode = _projectContentsConverter . OptionalOperations . Format ( selectedNode , document ) ;
237235 if ( extraLeadingTrivia . Any ( t => ! t . IsWhitespaceOrEndOfLine ( ) ) ) selectedNode = selectedNode . WithPrependedLeadingTrivia ( extraLeadingTrivia ) ;
238236 if ( extraTrailingTrivia . Any ( t => ! t . IsWhitespaceOrEndOfLine ( ) ) ) selectedNode = selectedNode . WithAppendedTrailingTrivia ( extraTrailingTrivia ) ;
239237 } else {
240- selectedNode = await document . GetSyntaxRootAsync ( ) ;
241- selectedNode = Formatter . Format ( selectedNode , document . Project . Solution . Workspace ) ;
238+ selectedNode = await document . GetSyntaxRootAsync ( _cancellationToken ) ;
239+ selectedNode = _projectContentsConverter . OptionalOperations . Format ( selectedNode , document ) ;
242240 var convertedDoc = document . WithSyntaxRoot ( selectedNode ) ;
243- selectedNode = await convertedDoc . GetSyntaxRootAsync ( ) ;
241+ selectedNode = await convertedDoc . GetSyntaxRootAsync ( _cancellationToken ) ;
244242 }
245243 } catch ( Exception e ) {
246244 errors = new [ ] { e . ToString ( ) } ;
247245 }
248246
249- var convertedNode = selectedNode ?? await convertedDocument . GetSyntaxRootAsync ( ) ;
247+ var convertedNode = selectedNode ?? await convertedDocument . GetSyntaxRootAsync ( _cancellationToken ) ;
250248 return ( convertedNode , errors ) ;
251249 }
252250
253251 private async Task < string > GetProjectWarningsAsync ( Project source , Project converted )
254252 {
255253 if ( ! _showCompilationErrors ) return null ;
256254
257- var sourceCompilation = await source . GetCompilationAsync ( ) ;
258- var convertedCompilation = await converted . GetCompilationAsync ( ) ;
255+ var sourceCompilation = await source . GetCompilationAsync ( _cancellationToken ) ;
256+ var convertedCompilation = await converted . GetCompilationAsync ( _cancellationToken ) ;
259257 return CompilationWarnings . WarningsForCompilation ( sourceCompilation , "source" ) + CompilationWarnings . WarningsForCompilation ( convertedCompilation , "target" ) ;
260258 }
261259
@@ -297,7 +295,7 @@ private static async Task<Document> WithAnnotatedSelectionAsync(Document documen
297295
298296 private async Task < SyntaxNode > GetSelectedNodeAsync ( Document document )
299297 {
300- var resultNode = await document . GetSyntaxRootAsync ( ) ;
298+ var resultNode = await document . GetSyntaxRootAsync ( _cancellationToken ) ;
301299 var selectedNode = resultNode . GetAnnotatedNodes ( AnnotationConstants . SelectedNodeAnnotationKind )
302300 . FirstOrDefault ( ) ;
303301 if ( selectedNode != null ) {
0 commit comments