@@ -256,33 +256,44 @@ private async Task<CopilotCodeFixAnalysis> ComputeCodeFixAnalysisAsync(
256
256
var diagnosticIdToProviderName = new Dictionary < string , HashSet < string > > ( ) ;
257
257
var providerNameToApplicationTime = new Dictionary < string , TimeSpan > ( ) ;
258
258
var providerNameToHasConflict = new Dictionary < string , bool > ( ) ;
259
+ var providerNameToTotalCount = new Dictionary < string , int > ( ) ;
260
+ var providerNameToSuccessCount = new Dictionary < string , int > ( ) ;
259
261
260
262
var totalApplicationTimeStopWatch = SharedStopwatch . StartNew ( ) ;
261
- await ProducerConsumer < ( CodeFixCollection collection , TimeSpan elapsedTime ) > . RunParallelAsync (
263
+ await ProducerConsumer < ( CodeFixCollection collection , bool success , TimeSpan elapsedTime ) > . RunParallelAsync (
262
264
codeFixCollections ,
263
265
produceItems : static async ( codeFixCollection , callback , args , cancellationToken ) =>
264
266
{
265
- var ( @this , solution , _, _, _, _, _) = args ;
267
+ var ( @this , solution , _, _, _, _, _, _ , _ ) = args ;
266
268
var firstAction = GetFirstAction ( codeFixCollection . Fixes [ 0 ] ) ;
267
269
268
270
var applicationTimeStopWatch = SharedStopwatch . StartNew ( ) ;
269
- await firstAction
270
- . GetPreviewOperationsAsync ( solution , cancellationToken )
271
- . ReportNonFatalErrorUnlessCancelledAsync ( cancellationToken )
272
- . ConfigureAwait ( false ) ;
273
- callback ( ( codeFixCollection , applicationTimeStopWatch . Elapsed ) ) ;
271
+ var success = true ;
272
+ try
273
+ {
274
+ await firstAction
275
+ . GetPreviewOperationsAsync ( solution , cancellationToken )
276
+ . ConfigureAwait ( false ) ;
277
+ }
278
+ catch ( Exception e ) when ( FatalError . ReportAndCatchUnlessCanceled ( e , cancellationToken ) )
279
+ {
280
+ success = false ;
281
+ }
282
+
283
+ callback ( ( codeFixCollection , success , applicationTimeStopWatch . Elapsed ) ) ;
274
284
} ,
275
285
consumeItems : static async ( values , args , cancellationToken ) =>
276
286
{
277
- var ( @this , solution , diagnosticIdToCount , diagnosticIdToApplicationTime , diagnosticIdToProviderName , providerNameToApplicationTime , providerNameToHasConflict ) = args ;
287
+ var ( @this , solution , diagnosticIdToCount , diagnosticIdToApplicationTime , diagnosticIdToProviderName ,
288
+ providerNameToApplicationTime , providerNameToHasConflict , providerNameToTotalCount , providerNameToSuccessCount ) = args ;
278
289
279
290
// Track which text span each code fix says it will be fixing. We can use this to efficiently determine
280
291
// which codefixes 'conflict' with some other codefix (in that that multiple features think they can fix
281
292
// the same span of code). We would need some mechanism to determine which we would prefer to take in
282
293
// order to have a good experience in such a case.
283
294
var intervalTree = new SimpleMutableIntervalTree < CodeFixCollection , CodeFixCollectionIntervalIntrospector > ( new CodeFixCollectionIntervalIntrospector ( ) ) ;
284
295
285
- await foreach ( var ( codeFixCollection , applicationTime ) in values )
296
+ await foreach ( var ( codeFixCollection , success , applicationTime ) in values )
286
297
{
287
298
var diagnosticId = codeFixCollection . FirstDiagnostic . Id ;
288
299
var providerName = GetProviderName ( codeFixCollection ) ;
@@ -291,6 +302,10 @@ await firstAction
291
302
IncrementElapsedTime ( diagnosticIdToApplicationTime , diagnosticId , applicationTime ) ;
292
303
diagnosticIdToProviderName . MultiAdd ( diagnosticId , providerName ) ;
293
304
IncrementElapsedTime ( providerNameToApplicationTime , providerName , applicationTime ) ;
305
+ IncrementCount ( providerNameToTotalCount , providerName ) ;
306
+
307
+ if ( success )
308
+ IncrementCount ( providerNameToSuccessCount , providerName ) ;
294
309
295
310
intervalTree . AddIntervalInPlace ( codeFixCollection ) ;
296
311
}
@@ -315,7 +330,8 @@ await firstAction
315
330
providerNameToHasConflict [ providerName ] = storedHasConflictValue || newHasConflictValue ;
316
331
}
317
332
} ,
318
- args : ( @this : this , newDocument . Project . Solution , diagnosticIdToCount , diagnosticIdToApplicationTime , diagnosticIdToProviderName , providerNameToApplicationTime , providerNameToHasConflict ) ,
333
+ args : ( @this : this , newDocument . Project . Solution , diagnosticIdToCount , diagnosticIdToApplicationTime , diagnosticIdToProviderName ,
334
+ providerNameToApplicationTime , providerNameToHasConflict , providerNameToTotalCount , providerNameToSuccessCount ) ,
319
335
cancellationToken ) . ConfigureAwait ( false ) ;
320
336
var totalApplicationTime = totalApplicationTimeStopWatch . Elapsed ;
321
337
@@ -326,7 +342,9 @@ await firstAction
326
342
diagnosticIdToApplicationTime ,
327
343
diagnosticIdToProviderName ,
328
344
providerNameToApplicationTime ,
329
- providerNameToHasConflict ) ;
345
+ providerNameToHasConflict ,
346
+ providerNameToTotalCount ,
347
+ providerNameToSuccessCount ) ;
330
348
331
349
Task < ImmutableArray < CodeFixCollection > > ComputeCodeFixCollectionsAsync ( )
332
350
{
0 commit comments