예제 #1
0
        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)
            });
        }
예제 #2
0
        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, request.Column));
                var location = new TextSpan(position, 1);
                return(new CodeRefactoringContext(document, location, (a) => actionsDestination.Add(a), CancellationToken.None));
            }

            //todo, handle context creation issues
            return(null);
        }
예제 #3
0
        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);
        }