refactor file update handling

This commit is contained in:
Matt Parker
2025-10-19 11:27:06 +10:00
parent 100ea2c5b4
commit 5bd689fa92
11 changed files with 139 additions and 123 deletions

View File

@@ -0,0 +1,19 @@
using Microsoft.CodeAnalysis.CodeActions;
using SharpIDE.Application.Features.FileWatching;
namespace SharpIDE.Application.Features.Analysis;
public class CodeActionService(RoslynAnalysis roslynAnalysis, FileChangedService fileChangedService)
{
private readonly RoslynAnalysis _roslynAnalysis = roslynAnalysis;
private readonly FileChangedService _fileChangedService = fileChangedService;
public async Task ApplyCodeAction(CodeAction codeAction)
{
var affectedFiles = await _roslynAnalysis.GetCodeActionApplyChanges(codeAction);
foreach (var (affectedFile, updatedText) in affectedFiles)
{
await _fileChangedService.SharpIdeFileChanged(affectedFile, updatedText, FileChangeType.CodeActionChange);
}
}
}

View File

@@ -296,6 +296,7 @@ public class RoslynAnalysis
{
using var _ = SharpIdeOtel.Source.StartActivity($"{nameof(RoslynAnalysis)}.{nameof(GetProjectDiagnosticsForFile)}");
await _solutionLoadedTcs.Task;
if (sharpIdeFile.IsRoslynWorkspaceFile is false) return [];
var cancellationToken = CancellationToken.None;
var project = _workspace!.CurrentSolution.Projects.Single(s => s.FilePath == ((IChildSharpIdeNode)sharpIdeFile).GetNearestProjectNode()!.FilePath);
var compilation = await project.GetCompilationAsync(cancellationToken);
@@ -316,6 +317,7 @@ public class RoslynAnalysis
if (fileModel.IsRoslynWorkspaceFile is false) return [];
using var _ = SharpIdeOtel.Source.StartActivity($"{nameof(RoslynAnalysis)}.{nameof(GetDocumentDiagnostics)}");
await _solutionLoadedTcs.Task;
if (fileModel.IsRoslynWorkspaceFile is false) return [];
var document = await GetDocumentForSharpIdeFile(fileModel);
Guard.Against.Null(document, nameof(document));
@@ -575,14 +577,15 @@ public class RoslynAnalysis
return completions;
}
/// Returns the list of files modified by applying the code action
public async Task<List<(SharpIdeFile File, string UpdatedText)>> ApplyCodeActionAsync(CodeAction codeAction)
/// Returns the list of files that would be modified by applying the code action. Does not apply the changes to the workspace sln
public async Task<List<(SharpIdeFile File, string UpdatedText)>> GetCodeActionApplyChanges(CodeAction codeAction)
{
using var _ = SharpIdeOtel.Source.StartActivity($"{nameof(RoslynAnalysis)}.{nameof(ApplyCodeActionAsync)}");
using var _ = SharpIdeOtel.Source.StartActivity($"{nameof(RoslynAnalysis)}.{nameof(GetCodeActionApplyChanges)}");
await _solutionLoadedTcs.Task;
var cancellationToken = CancellationToken.None;
var operations = await codeAction.GetOperationsAsync(cancellationToken);
var changedDocumentIds = new List<DocumentId>();
var originalSolution = _workspace!.CurrentSolution;
foreach (var operation in operations)
{
if (operation is ApplyChangesOperation applyChangesOperation)
@@ -616,6 +619,8 @@ public class RoslynAnalysis
})
.ToListAsync(cancellationToken);
_workspace.TryApplyChanges(originalSolution);
return changedFilesWithText;
}