Skip to content

Commit a7157e2

Browse files
committed
update project diagnostics for active document immediately
1 parent 6ad66d0 commit a7157e2

File tree

3 files changed

+28
-5
lines changed

3 files changed

+28
-5
lines changed

src/SharpIDE.Application/Features/Analysis/RoslynAnalysis.cs

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -301,15 +301,27 @@ public async Task UpdateSolutionDiagnostics(CancellationToken cancellationToken
301301
// Performance improvements of ~15% have been observed with a large solution (100+ projects) by parallelizing this with Task.WhenAll, however it seems much heavier (14700K crashes sometimes 😅) so re-evaluate later
302302
foreach (var project in _sharpIdeSolutionModel!.AllProjects)
303303
{
304-
var projectDiagnostics = await GetProjectDiagnostics(project, cancellationToken);
305-
// TODO: only add and remove diffs
306-
project.Diagnostics.RemoveRange(project.Diagnostics);
307-
project.Diagnostics.AddRange(projectDiagnostics);
304+
await UpdateProjectDiagnostics(project, cancellationToken);
308305
}
309306
timer.Stop();
310307
_logger.LogInformation("RoslynAnalysis: Solution diagnostics updated in {ElapsedMilliseconds}ms", timer.ElapsedMilliseconds);
311308
}
312309

310+
public async Task UpdateProjectDiagnostics(SharpIdeProjectModel project, CancellationToken cancellationToken = default)
311+
{
312+
var projectDiagnostics = await GetProjectDiagnostics(project, cancellationToken);
313+
// TODO: only add and remove diffs
314+
project.Diagnostics.RemoveRange(project.Diagnostics);
315+
project.Diagnostics.AddRange(projectDiagnostics);
316+
}
317+
318+
public async Task UpdateProjectDiagnosticsForFile(SharpIdeFile sharpIdeFile, CancellationToken cancellationToken = default)
319+
{
320+
var project = ((IChildSharpIdeNode) sharpIdeFile).GetNearestProjectNode();
321+
Guard.Against.Null(project);
322+
await UpdateProjectDiagnostics(project, cancellationToken);
323+
}
324+
313325
public async Task<ImmutableArray<SharpIdeDiagnostic>> GetProjectDiagnostics(SharpIdeProjectModel projectModel, CancellationToken cancellationToken = default)
314326
{
315327
using var _ = SharpIdeOtel.Source.StartActivity($"{nameof(RoslynAnalysis)}.{nameof(GetProjectDiagnostics)}");

src/SharpIDE.Godot/Features/CodeEditor/SharpIdeCodeEdit.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,16 +104,22 @@ private async Task OnSolutionAltered()
104104
if (_fileDeleted) return;
105105
GD.Print($"[{_currentFile.Name}] Solution altered, updating project diagnostics for file");
106106
var newCt = _solutionAlteredCancellationTokenSeries.CreateNext();
107+
var hasFocus = this.InvokeAsync(HasFocus);
107108
var documentSyntaxHighlighting = _roslynAnalysis.GetDocumentSyntaxHighlighting(_currentFile, newCt);
108109
var razorSyntaxHighlighting = _roslynAnalysis.GetRazorDocumentSyntaxHighlighting(_currentFile, newCt);
109110
await Task.WhenAll(documentSyntaxHighlighting, razorSyntaxHighlighting).WaitAsync(newCt).ConfigureAwait(ConfigureAwaitOptions.SuppressThrowing);
110111
if (newCt.IsCancellationRequested) return;
111112
var documentDiagnosticsTask = _roslynAnalysis.GetDocumentDiagnostics(_currentFile, newCt);
112113
await this.InvokeAsync(async () => SetSyntaxHighlightingModel(await documentSyntaxHighlighting, await razorSyntaxHighlighting));
113-
await ((Task)documentDiagnosticsTask).ConfigureAwait(ConfigureAwaitOptions.SuppressThrowing);
114+
await documentDiagnosticsTask.AsTask().ConfigureAwait(ConfigureAwaitOptions.SuppressThrowing);
114115
if (newCt.IsCancellationRequested) return;
115116
var documentDiagnostics = await documentDiagnosticsTask;
116117
await this.InvokeAsync(() => SetDiagnostics(documentDiagnostics));
118+
if (await hasFocus)
119+
{
120+
await _roslynAnalysis.UpdateProjectDiagnosticsForFile(_currentFile, newCt).ConfigureAwait(ConfigureAwaitOptions.SuppressThrowing);
121+
if (newCt.IsCancellationRequested) return;
122+
}
117123
}
118124

119125
public enum LineEditOrigin

src/SharpIDE.Godot/NodeExtensions.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,11 @@ public Task InvokeDeferredAsync(Func<Task> workItem)
174174

175175
public static class GodotTask
176176
{
177+
extension<T>(Task<T> task)
178+
{
179+
public Task AsTask() => task;
180+
}
181+
177182
extension(Task task)
178183
{
179184
public static async Task GodotRun(Action action)

0 commit comments

Comments
 (0)