public async Task<GetCodeActionsResponse> GetCodeActions(CodeActionRequest request) { var actions = new List<CodeAction>(); var context = await GetContext(request, actions); await GetContextualCodeActions(context); return new GetCodeActionsResponse() { CodeActions = actions.Select(a => a.Title) }; }
private async Task<CodeRefactoringContext?> GetContext(CodeActionRequest request, List<CodeAction> actionsDestination) { var document = _workspace.GetDocument(request.FileName); if (document != null) { var sourceText = await document.GetTextAsync(); var position = sourceText.Lines.GetPosition(new LinePosition(request.Line - 1, request.Column - 1)); var location = new TextSpan(position, 1); return new CodeRefactoringContext(document, location, (a) => actionsDestination.Add(a), CancellationToken.None); } //todo, handle context creation issues return null; }
public async Task<RunCodeActionResponse> RunCodeAction(CodeActionRequest request) { var actions = new List<CodeAction>(); var context = await GetContext(request, actions); await GetContextualCodeActions(context); if (request.CodeAction > actions.Count()) { return new RunCodeActionResponse(); } var action = actions.ElementAt(request.CodeAction); var operations = await action.GetOperationsAsync(CancellationToken.None); foreach (var o in operations) { o.Apply(_workspace, CancellationToken.None); } var originalDocument = context.Value.Document; var response = new RunCodeActionResponse(); if (!request.WantsTextChanges) { // return the new document var sourceText = await _workspace.CurrentSolution.GetDocument(originalDocument.Id).GetTextAsync(); response.Text = sourceText.ToString(); } else { // return the text changes var changes = await _workspace.CurrentSolution.GetDocument(originalDocument.Id).GetTextChangesAsync(originalDocument); response.Changes = await LinePositionSpanTextChange.Convert(originalDocument, changes); } return response; }