Skip to content

Commit a50f310

Browse files
Collect stats
1 parent 650ec49 commit a50f310

File tree

3 files changed

+34
-12
lines changed

3 files changed

+34
-12
lines changed

src/Features/Core/Portable/Copilot/CopilotChangeAnalysis.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,4 +55,6 @@ internal readonly record struct CopilotCodeFixAnalysis(
5555
[property: DataMember(Order = 3)] Dictionary<string, TimeSpan> DiagnosticIdToApplicationTime,
5656
[property: DataMember(Order = 4)] Dictionary<string, HashSet<string>> DiagnosticIdToProviderName,
5757
[property: DataMember(Order = 5)] Dictionary<string, TimeSpan> ProviderNameToApplicationTime,
58-
[property: DataMember(Order = 6)] Dictionary<string, bool> ProviderNameToHasConflict);
58+
[property: DataMember(Order = 6)] Dictionary<string, bool> ProviderNameToHasConflict,
59+
[property: DataMember(Order = 7)] Dictionary<string, int> ProviderNameToTotalCount,
60+
[property: DataMember(Order = 8)] Dictionary<string, int> ProviderNameToSuccessCount);

src/Features/Core/Portable/Copilot/CopilotChangeAnalysisUtilities.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,8 @@ public static IDisposable LogCopilotChangeAnalysis(
120120
d["CodeFixAnalysis_DiagnosticIdToProviderName"] = StringifyDictionary(analysisResult.CodeFixAnalysis.DiagnosticIdToProviderName);
121121
d["CodeFixAnalysis_ProviderNameToApplicationTime"] = StringifyDictionary(analysisResult.CodeFixAnalysis.ProviderNameToApplicationTime);
122122
d["CodeFixAnalysis_ProviderNameToHasConflict"] = StringifyDictionary(analysisResult.CodeFixAnalysis.ProviderNameToHasConflict);
123+
d["CodeFixAnalysis_ProviderNameToTotalCount"] = StringifyDictionary(analysisResult.CodeFixAnalysis.ProviderNameToTotalCount);
124+
d["CodeFixAnalysis_ProviderNameToSuccessCount"] = StringifyDictionary(analysisResult.CodeFixAnalysis.ProviderNameToSuccessCount);
123125
}, args: (featureId, accepted, proposalId, analysisResult)),
124126
cancellationToken);
125127
}

src/Features/Core/Portable/Copilot/ICopilotChangeAnalysisService.cs

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -256,33 +256,44 @@ private async Task<CopilotCodeFixAnalysis> ComputeCodeFixAnalysisAsync(
256256
var diagnosticIdToProviderName = new Dictionary<string, HashSet<string>>();
257257
var providerNameToApplicationTime = new Dictionary<string, TimeSpan>();
258258
var providerNameToHasConflict = new Dictionary<string, bool>();
259+
var providerNameToTotalCount = new Dictionary<string, int>();
260+
var providerNameToSuccessCount = new Dictionary<string, int>();
259261

260262
var totalApplicationTimeStopWatch = SharedStopwatch.StartNew();
261-
await ProducerConsumer<(CodeFixCollection collection, TimeSpan elapsedTime)>.RunParallelAsync(
263+
await ProducerConsumer<(CodeFixCollection collection, bool success, TimeSpan elapsedTime)>.RunParallelAsync(
262264
codeFixCollections,
263265
produceItems: static async (codeFixCollection, callback, args, cancellationToken) =>
264266
{
265-
var (@this, solution, _, _, _, _, _) = args;
267+
var (@this, solution, _, _, _, _, _, _, _) = args;
266268
var firstAction = GetFirstAction(codeFixCollection.Fixes[0]);
267269

268270
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));
274284
},
275285
consumeItems: static async (values, args, cancellationToken) =>
276286
{
277-
var (@this, solution, diagnosticIdToCount, diagnosticIdToApplicationTime, diagnosticIdToProviderName, providerNameToApplicationTime, providerNameToHasConflict) = args;
287+
var (@this, solution, diagnosticIdToCount, diagnosticIdToApplicationTime, diagnosticIdToProviderName,
288+
providerNameToApplicationTime, providerNameToHasConflict, providerNameToTotalCount, providerNameToSuccessCount) = args;
278289

279290
// Track which text span each code fix says it will be fixing. We can use this to efficiently determine
280291
// which codefixes 'conflict' with some other codefix (in that that multiple features think they can fix
281292
// the same span of code). We would need some mechanism to determine which we would prefer to take in
282293
// order to have a good experience in such a case.
283294
var intervalTree = new SimpleMutableIntervalTree<CodeFixCollection, CodeFixCollectionIntervalIntrospector>(new CodeFixCollectionIntervalIntrospector());
284295

285-
await foreach (var (codeFixCollection, applicationTime) in values)
296+
await foreach (var (codeFixCollection, success, applicationTime) in values)
286297
{
287298
var diagnosticId = codeFixCollection.FirstDiagnostic.Id;
288299
var providerName = GetProviderName(codeFixCollection);
@@ -291,6 +302,10 @@ await firstAction
291302
IncrementElapsedTime(diagnosticIdToApplicationTime, diagnosticId, applicationTime);
292303
diagnosticIdToProviderName.MultiAdd(diagnosticId, providerName);
293304
IncrementElapsedTime(providerNameToApplicationTime, providerName, applicationTime);
305+
IncrementCount(providerNameToTotalCount, providerName);
306+
307+
if (success)
308+
IncrementCount(providerNameToSuccessCount, providerName);
294309

295310
intervalTree.AddIntervalInPlace(codeFixCollection);
296311
}
@@ -315,7 +330,8 @@ await firstAction
315330
providerNameToHasConflict[providerName] = storedHasConflictValue || newHasConflictValue;
316331
}
317332
},
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),
319335
cancellationToken).ConfigureAwait(false);
320336
var totalApplicationTime = totalApplicationTimeStopWatch.Elapsed;
321337

@@ -326,7 +342,9 @@ await firstAction
326342
diagnosticIdToApplicationTime,
327343
diagnosticIdToProviderName,
328344
providerNameToApplicationTime,
329-
providerNameToHasConflict);
345+
providerNameToHasConflict,
346+
providerNameToTotalCount,
347+
providerNameToSuccessCount);
330348

331349
Task<ImmutableArray<CodeFixCollection>> ComputeCodeFixCollectionsAsync()
332350
{

0 commit comments

Comments
 (0)