in src/PortingAssistantExtensionServer/Handlers/PortingAssistantCodeActionHandler.cs [55:123]
public async Task<CommandOrCodeActionContainer> Handle(CodeActionParams request, CancellationToken cancellationToken)
{
var codeActions = new List<CommandOrCodeAction>();
if (_solutionAnalysisService.HasSolutionAnalysisResult())
{
_solutionAnalysisService._openDocuments.TryGetValue(request.TextDocument.Uri, out var document);
if (document == null) return codeActions;
var result = await _solutionAnalysisService.AssessFileAsync(document, true);
result.ForEach(sourceFileAnalysisResult =>
{
sourceFileAnalysisResult.RecommendedActions.ForEach(recommendedAction =>
{
_solutionAnalysisService.UpdateCodeAction(recommendedAction.Description,
_solutionAnalysisService.GetRange(recommendedAction.TextSpan),
document.DocumentUri.Path,
recommendedAction.TextChanges);
});
});
}
await Task.Run(() =>
{
foreach (var diagnostic in request.Context.Diagnostics)
{
var diagnosticHash = _solutionAnalysisService.HashDiagnostic(diagnostic.Message, diagnostic.Range, request.TextDocument.Uri.Path);
if (_solutionAnalysisService.CodeActions.ContainsKey(diagnosticHash))
{
var textEdits = _solutionAnalysisService.CodeActions[diagnosticHash]
.Where(t => _solutionAnalysisService.TrimFilePath(t.FileLinePositionSpan.Path) == _solutionAnalysisService.TrimFilePath(request.TextDocument.Uri.Path))
.Select(t => new TextEdit()
{
NewText = t.NewText,
Range = new OmniSharp.Extensions.LanguageServer.Protocol.Models.Range(
t.FileLinePositionSpan.StartLinePosition.Line,
t.FileLinePositionSpan.StartLinePosition.Character,
t.FileLinePositionSpan.EndLinePosition.Line,
t.FileLinePositionSpan.EndLinePosition.Character)
});
;
codeActions.Add(new CodeAction
{
Title = diagnostic.Message,
Kind = CodeActionKind.QuickFix,
Diagnostics = new List<Diagnostic>() { diagnostic },
Edit = new WorkspaceEdit
{
DocumentChanges = new Container<WorkspaceEditDocumentChange>(
new WorkspaceEditDocumentChange(
new TextDocumentEdit
{
TextDocument = new VersionedTextDocumentIdentifier
{
Uri = request.TextDocument.Uri
},
Edits = new TextEditContainer(
textEdits
)
}))
}
});
}
}
});
return codeActions;
}