use cancellationseries for editor document update

This commit is contained in:
Matt Parker
2025-11-24 23:50:48 +10:00
parent 44d7ee524d
commit 536d2bc479

View File

@@ -8,6 +8,7 @@ using Microsoft.CodeAnalysis.Rename.ConflictEngine;
using Microsoft.CodeAnalysis.Shared.Extensions; using Microsoft.CodeAnalysis.Shared.Extensions;
using Microsoft.CodeAnalysis.Tags; using Microsoft.CodeAnalysis.Tags;
using Microsoft.CodeAnalysis.Text; using Microsoft.CodeAnalysis.Text;
using Microsoft.CodeAnalysis.Threading;
using ObservableCollections; using ObservableCollections;
using R3; using R3;
using Roslyn.Utilities; using Roslyn.Utilities;
@@ -95,21 +96,19 @@ public partial class SharpIdeCodeEdit : CodeEdit
SetCodeRegionTags("#region", "#endregion"); SetCodeRegionTags("#region", "#endregion");
} }
private CancellationTokenSource _solutionAlteredCts = new(); private readonly CancellationSeries _solutionAlteredCancellationTokenSeries = new();
private async Task OnSolutionAltered() private async Task OnSolutionAltered()
{ {
using var _ = SharpIdeOtel.Source.StartActivity($"{nameof(SharpIdeCodeEdit)}.{nameof(OnSolutionAltered)}"); using var _ = SharpIdeOtel.Source.StartActivity($"{nameof(SharpIdeCodeEdit)}.{nameof(OnSolutionAltered)}");
if (_currentFile is null) return; if (_currentFile is null) return;
if (_fileDeleted) return; if (_fileDeleted) return;
GD.Print($"[{_currentFile.Name}] Solution altered, updating project diagnostics for file"); GD.Print($"[{_currentFile.Name}] Solution altered, updating project diagnostics for file");
await _solutionAlteredCts.CancelAsync(); var newCt = _solutionAlteredCancellationTokenSeries.CreateNext();
_solutionAlteredCts = new CancellationTokenSource(); var documentSyntaxHighlighting = _roslynAnalysis.GetDocumentSyntaxHighlighting(_currentFile, newCt);
var ct = _solutionAlteredCts.Token; var razorSyntaxHighlighting = _roslynAnalysis.GetRazorDocumentSyntaxHighlighting(_currentFile, newCt);
var documentSyntaxHighlighting = _roslynAnalysis.GetDocumentSyntaxHighlighting(_currentFile, ct);
var razorSyntaxHighlighting = _roslynAnalysis.GetRazorDocumentSyntaxHighlighting(_currentFile, ct);
await Task.WhenAll(documentSyntaxHighlighting, razorSyntaxHighlighting); await Task.WhenAll(documentSyntaxHighlighting, razorSyntaxHighlighting);
await this.InvokeAsync(async () => SetSyntaxHighlightingModel(await documentSyntaxHighlighting, await razorSyntaxHighlighting)); await this.InvokeAsync(async () => SetSyntaxHighlightingModel(await documentSyntaxHighlighting, await razorSyntaxHighlighting));
var documentDiagnostics = await _roslynAnalysis.GetDocumentDiagnostics(_currentFile, ct); var documentDiagnostics = await _roslynAnalysis.GetDocumentDiagnostics(_currentFile, newCt);
await this.InvokeAsync(() => SetDiagnostics(documentDiagnostics)); await this.InvokeAsync(() => SetDiagnostics(documentDiagnostics));
} }