public async override Task <CompletionList> Handle(CompletionParams request, CancellationToken token)
        {
            var omnisharpRequest = new AutoCompleteRequest()
            {
                FileName = Helpers.FromUri(request.TextDocument.Uri),
                Column   = Convert.ToInt32(request.Position.Character),
                Line     = Convert.ToInt32(request.Position.Line),
                WantKind = true,
                WantDocumentationForEveryCompletionResult = true,
                WantReturnType = true,
                WantSnippet    = Capability.CompletionItem?.SnippetSupport ?? false
            };

            var omnisharpResponse = await _autoCompleteHandler.Handle(omnisharpRequest);

            var completions = new Dictionary <string, List <CompletionItem> >();

            foreach (var response in omnisharpResponse)
            {
                var isSnippet  = !string.IsNullOrEmpty(response.Snippet);
                var text       = isSnippet ? response.Snippet : response.CompletionText;
                var textFormat = isSnippet ? InsertTextFormat.Snippet : InsertTextFormat.PlainText;

                var completionItem = new CompletionItem
                {
                    Label  = response.CompletionText,
                    Detail = string.IsNullOrEmpty(response.ReturnType) ?
                             response.DisplayText :
                             $"{response.ReturnType} {response.DisplayText}",
                    Documentation    = response.Description,
                    Kind             = GetCompletionItemKind(response.Kind),
                    InsertText       = text,
                    InsertTextFormat = textFormat,
                };

                if (!completions.ContainsKey(completionItem.Label))
                {
                    completions[completionItem.Label] = new List <CompletionItem>();
                }
                completions[completionItem.Label].Add(completionItem);
            }

            var result = new List <CompletionItem>();

            foreach (var key in completions.Keys)
            {
                var suggestion    = completions[key][0];
                var overloadCount = completions[key].Count - 1;

                if (overloadCount > 0)
                {
                    // indicate that there is more
                    suggestion.Detail = $"{suggestion.Detail} (+ {overloadCount} overload(s))";
                }

                result.Add(suggestion);
            }

            return(new CompletionList(result));
        }
        public async override Task <CommandOrCodeActionContainer> Handle(CodeActionParams request, CancellationToken cancellationToken)
        {
            var omnisharpRequest = new GetCodeActionsRequest {
                FileName  = Helpers.FromUri(request.TextDocument.Uri),
                Column    = (int)request.Range.Start.Character,
                Line      = (int)request.Range.Start.Line,
                Selection = Helpers.FromRange(request.Range),
            };

            var omnisharpResponse = await _getActionsHandler.Handle(omnisharpRequest);

            var codeActions = new List <CodeAction>();

            foreach (var ca in omnisharpResponse.CodeActions)
            {
                var omnisharpCaRequest = new RunCodeActionRequest {
                    Identifier       = ca.Identifier,
                    FileName         = Helpers.FromUri(request.TextDocument.Uri),
                    Column           = Convert.ToInt32(request.Range.Start.Character),
                    Line             = Convert.ToInt32(request.Range.Start.Line),
                    Selection        = Helpers.FromRange(request.Range),
                    ApplyTextChanges = false,
                    WantsTextChanges = true,
                };

                var omnisharpCaResponse = await _runActionHandler.Handle(omnisharpCaRequest);

                var changes = omnisharpCaResponse.Changes.ToDictionary(
                    x => Helpers.ToUri(x.FileName),
                    x => ((ModifiedFileResponse)x).Changes.Select(edit => new TextEdit
                {
                    NewText = edit.NewText,
                    Range   = Helpers.ToRange((edit.StartColumn, edit.StartLine), (edit.EndColumn, edit.EndLine))
                }));
Beispiel #3
0
 public Task Handle(DidCloseTextDocumentParams notification)
 {
     return(_closeHandler?.Handle(new FileCloseRequest()
     {
         FileName = Helpers.FromUri(notification.TextDocument.Uri)
     }) ?? Task.CompletedTask);
 }
        public async override Task <WorkspaceEdit> Handle(RenameParams request, CancellationToken token)
        {
            var omnisharpRequest = new RenameRequest
            {
                FileName         = Helpers.FromUri(request.TextDocument.Uri),
                RenameTo         = request.NewName,
                Column           = Convert.ToInt32(request.Position.Character),
                Line             = Convert.ToInt32(request.Position.Line),
                Buffer           = request.NewName,
                WantsTextChanges = true,
                ApplyTextChanges = false
            };

            var omnisharpResponse = await _renameHandler.Handle(omnisharpRequest);

            if (omnisharpResponse.ErrorMessage != null)
            {
                return(new WorkspaceEdit());
            }

            var changes = omnisharpResponse.Changes.ToDictionary(change =>
                                                                 Helpers.ToUri(change.FileName),
                                                                 x => x.Changes.Select(edit => new TextEdit
            {
                NewText = edit.NewText,
                Range   = Helpers.ToRange((edit.StartColumn, edit.StartLine), (edit.EndColumn, edit.EndLine))
            }));
        public override async Task <CommandOrCodeActionContainer> Handle(CodeActionParams request, CancellationToken cancellationToken)
        {
            var omnisharpRequest = new GetCodeActionsRequest
            {
                FileName  = Helpers.FromUri(request.TextDocument.Uri),
                Column    = request.Range.Start.Character,
                Line      = request.Range.Start.Line,
                Selection = Helpers.FromRange(request.Range),
            };

            var omnisharpResponse = await _getActionsHandler.Handle(omnisharpRequest);

            var codeActions = new List <CodeAction>();

            foreach (var ca in omnisharpResponse.CodeActions)
            {
                CodeActionKind kind;
                if (ca.Identifier.StartsWith("using "))
                {
                    kind = CodeActionKind.SourceOrganizeImports;
                }
                else if (ca.Identifier.StartsWith("Inline "))
                {
                    kind = CodeActionKind.RefactorInline;
                }
                else if (ca.Identifier.StartsWith("Extract "))
                {
                    kind = CodeActionKind.RefactorExtract;
                }
                else if (ca.Identifier.StartsWith("Change "))
                {
                    kind = CodeActionKind.QuickFix;
                }
                else
                {
                    kind = CodeActionKind.Refactor;
                }

                codeActions.Add(
                    new CodeAction
                {
                    Title       = ca.Name,
                    Kind        = kind,
                    Diagnostics = new Container <Diagnostic>(),
                    Edit        = new WorkspaceEdit(),
                    Command     = Command.Create("omnisharp/executeCodeAction")
                                  .WithTitle(ca.Name)
                                  .WithArguments(new CommandData()
                    {
                        Uri        = request.TextDocument.Uri,
                        Identifier = ca.Identifier,
                        Name       = ca.Name,
                        Range      = request.Range,
                    })
                });
            }

            return(new CommandOrCodeActionContainer(
                       codeActions.Select(ca => new CommandOrCodeAction(ca))));
        }
Beispiel #6
0
        public override async Task <CodeLens> Handle(CodeLens request, CancellationToken token)
        {
            var omnisharpRequest = new FindUsagesRequest
            {
                FileName          = Helpers.FromUri(request.Data.ToObject <Uri>()),
                Column            = (int)request.Range.Start.Character,
                Line              = (int)request.Range.Start.Line,
                OnlyThisFile      = false,
                ExcludeDefinition = true
            };

            var omnisharpResponse = await _findUsagesHandler.Handle(omnisharpRequest);

            var length = omnisharpResponse?.QuickFixes?.Count() ?? 0;

            var jsonCamelCaseContract = new JsonSerializer
            {
                ContractResolver = new CamelCasePropertyNamesContractResolver()
            };

            request = request with {
                Command = new Command
                {
                    Title     = length == 1 ? "1 reference" : $"{length} references",
                    Name      = "omnisharp/client/findReferences",
                    Arguments = new JArray(
                        new[]
Beispiel #7
0
 public Task Handle(DidOpenTextDocumentParams notification)
 {
     return(_openHandler?.Handle(new FileOpenRequest()
     {
         Buffer = notification.TextDocument.Text,
         FileName = Helpers.FromUri(notification.TextDocument.Uri)
     }) ?? Task.CompletedTask);
 }
Beispiel #8
0
        public async override Task <Unit> Handle(DidChangeTextDocumentParams notification, CancellationToken cancellationToken)
        {
            if (notification.ContentChanges == null)
            {
                return(Unit.Value);
            }
            var contentChanges = notification.ContentChanges.ToArray();

            if (contentChanges.Length == 1 && contentChanges[0].Range == null)
            {
                var change = contentChanges[0];
                await _bufferHandler.Handle(new UpdateBufferRequest()
                {
                    FileName = Helpers.FromUri(notification.TextDocument.Uri),
                    Buffer   = change.Text
                });

                return(Unit.Value);
            }

            var changes = contentChanges
                          .Select(change => new LinePositionSpanTextChange()
            {
                NewText     = change.Text,
                StartColumn = Convert.ToInt32(change.Range.Start.Character),
                StartLine   = Convert.ToInt32(change.Range.Start.Line),
                EndColumn   = Convert.ToInt32(change.Range.End.Character),
                EndLine     = Convert.ToInt32(change.Range.End.Line),
            })
                          .ToArray();

            await _bufferHandler.Handle(new UpdateBufferRequest()
            {
                FileName = Helpers.FromUri(notification.TextDocument.Uri),
                Changes  = changes
            });

            _documentVersions.Update(notification.TextDocument);

            return(Unit.Value);
        }
        public async override Task <Unit> Handle(DidCloseTextDocumentParams notification, CancellationToken cancellationToken)
        {
            if (_closeHandler != null)
            {
                await _closeHandler.Handle(new FileCloseRequest()
                {
                    FileName = Helpers.FromUri(notification.TextDocument.Uri)
                });
            }

            return(Unit.Value);
        }
        public async override Task <SymbolInformationOrDocumentSymbolContainer> Handle(DocumentSymbolParams request, CancellationToken token)
        {
            var omnisharpRequest = new CodeStructureRequest()
            {
                FileName = Helpers.FromUri(request.TextDocument.Uri),
            };

            var omnisharpResponse = await _codeStructureHandler.Handle(omnisharpRequest);

            return(omnisharpResponse.Elements?.Select(ToDocumentSymbolInformationOrDocumentSymbol).ToArray() ??
                   Array.Empty <SymbolInformationOrDocumentSymbol>());
        }
Beispiel #11
0
        public override async Task <CompletionItem> Handle(CompletionItem request, CancellationToken cancellationToken)
        {
            var resolveRequest = new CompletionResolveRequest
            {
                Item = ToOmnisharpCompletionItem(request)
            };

            var result = await _completionResolveHandler.Handle(resolveRequest);

            Debug.Assert(result.Item != null);
            return(ToLSPCompletionItem(result.Item !));
        }
        public async override Task <Unit> Handle(DidOpenTextDocumentParams notification, CancellationToken cancellationToken)
        {
            if (_openHandler != null)
            {
                await _openHandler.Handle(new FileOpenRequest()
                {
                    Buffer   = notification.TextDocument.Text,
                    FileName = Helpers.FromUri(notification.TextDocument.Uri)
                });
            }

            return(Unit.Value);
        }
Beispiel #13
0
        public override async Task <CompletionList> Handle(CompletionParams request, CancellationToken token)
        {
            var omnisharpRequest = new CompletionRequest()
            {
                FileName          = Helpers.FromUri(request.TextDocument.Uri),
                Column            = Convert.ToInt32(request.Position.Character),
                Line              = Convert.ToInt32(request.Position.Line),
                CompletionTrigger = ConvertEnum <CompletionTriggerKind, OmnisharpCompletionTriggerKind>(request.Context?.TriggerKind ?? CompletionTriggerKind.Invoked),
                TriggerCharacter  = request.Context?.TriggerCharacter is { Length : > 0 } str?str[0] : null
            };

            var omnisharpResponse = await _completionHandler.Handle(omnisharpRequest);

            return(new CompletionList(omnisharpResponse.Items.Select(ToLSPCompletionItem), isIncomplete: omnisharpResponse.IsIncomplete));
        }
        public async override Task <LocationOrLocationLinks> Handle(ImplementationParams request, CancellationToken token)
        {
            var omnisharpRequest = new FindImplementationsRequest()
            {
                FileName = FromUri(request.TextDocument.Uri),
                Column   = Convert.ToInt32(request.Position.Character),
                Line     = Convert.ToInt32(request.Position.Line)
            };

            var omnisharpResponse = await _findImplementationsHandler.Handle(omnisharpRequest);

            return(omnisharpResponse?.QuickFixes?.Select(x => new LocationOrLocationLink(new Location
            {
                Uri = ToUri(x.FileName),
                Range = ToRange((x.Column, x.Line))
            })).ToArray() ?? Array.Empty <LocationOrLocationLink>());
        public override async Task <TextEditContainer> Handle(DocumentFormattingParams request, CancellationToken cancellationToken)
        {
            var omnisharpRequest = new CodeFormatRequest()
            {
                FileName         = Helpers.FromUri(request.TextDocument.Uri),
                WantsTextChanges = true
            };

            var omnisharpResponse = await _codeFormatHandler.Handle(omnisharpRequest);

            return(omnisharpResponse.Changes.Select(change => new TextEdit()
            {
                NewText = change.NewText,
                Range = new Range(new Position(change.StartLine, change.StartColumn), new Position(change.EndLine, change.EndColumn))
            }).ToArray());
        }
        public async override Task <CodeLensContainer> Handle(CodeLensParams request, CancellationToken token)
        {
            var omnisharpRequest = new MembersTreeRequest()
            {
                FileName = Helpers.FromUri(request.TextDocument.Uri),
            };

            var omnisharpResponse = await _membersAsTreeHandler.Handle(omnisharpRequest);

            var codeLenseContainer = new List <CodeLens>();

            foreach (var node in omnisharpResponse.TopLevelTypeDefinitions)
            {
                ToCodeLens(request.TextDocument, node, codeLenseContainer);
            }

            return(codeLenseContainer);
        }
        public async Task <DocumentSymbolInformationContainer> Handle(DocumentSymbolParams request, CancellationToken token)
        {
            var omnisharpRequest = new MembersTreeRequest()
            {
                FileName = Helpers.FromUri(request.TextDocument.Uri),
            };

            var omnisharpResponse = await _membersAsTreeHandler.Handle(omnisharpRequest);

            var symbolInformationContainer = new List <DocumentSymbolInformation>();

            foreach (var node in omnisharpResponse.TopLevelTypeDefinitions)
            {
                ToDocumentSymbol(node, symbolInformationContainer);
            }

            return(symbolInformationContainer);
        }
        public async override Task <TextEditContainer> Handle(DocumentRangeFormattingParams request, CancellationToken cancellationToken)
        {
            var omnisharpRequest = new FormatRangeRequest()
            {
                FileName  = Helpers.FromUri(request.TextDocument.Uri),
                Line      = Convert.ToInt32(request.Range.Start.Line),
                Column    = Convert.ToInt32(request.Range.Start.Character),
                EndLine   = Convert.ToInt32(request.Range.End.Line),
                EndColumn = Convert.ToInt32(request.Range.End.Character),
            };

            var omnisharpResponse = await _formatRangeHandler.Handle(omnisharpRequest);

            return(omnisharpResponse.Changes.Select(change => new TextEdit()
            {
                NewText = change.NewText,
                Range = new Range(new Position(change.StartLine, change.StartColumn), new Position(change.EndLine, change.EndColumn))
            }).ToArray());
        }
        public async override Task <Hover> Handle(HoverParams request, CancellationToken token)
        {
            var omnisharpRequest = new TypeLookupRequest()
            {
                FileName             = Helpers.FromUri(request.TextDocument.Uri),
                Column               = Convert.ToInt32(request.Position.Character),
                Line                 = Convert.ToInt32(request.Position.Line),
                IncludeDocumentation = true
            };

            var omnisharpResponse = await _definitionHandler.Handle(omnisharpRequest);

            return(new Hover()
            {
                // TODO: Range?  We don't currently have that!
                // Range =
                Contents = new MarkedStringsOrMarkupContent(new Container <MarkedString>(Helpers.EscapeMarkdown(omnisharpResponse.Type), Helpers.EscapeMarkdown(omnisharpResponse.Documentation)))
            });
        }
        public override async Task <TextEditContainer> Handle(DocumentOnTypeFormattingParams request, CancellationToken cancellationToken)
        {
            // TODO: request.options
            var omnisharpRequest = new FormatAfterKeystrokeRequest()
            {
                Character = request.Character,
                Line      = Convert.ToInt32(request.Position.Line),
                Column    = Convert.ToInt32(request.Position.Character),
                FileName  = Helpers.FromUri(request.TextDocument.Uri),
            };

            var omnisharpResponse = await _formatAfterKeystrokeHandler.Handle(omnisharpRequest);

            return(omnisharpResponse.Changes.Select(change => new TextEdit()
            {
                NewText = change.NewText,
                Range = new Range(new Position(change.StartLine, change.StartColumn), new Position(change.EndLine, change.EndColumn))
            }).ToArray());
        }
Beispiel #21
0
        public async override Task <LocationContainer> Handle(ReferenceParams request, CancellationToken token)
        {
            var omnisharpRequest = new FindUsagesRequest
            {
                FileName          = Helpers.FromUri(request.TextDocument.Uri),
                Column            = Convert.ToInt32(request.Position.Character),
                Line              = Convert.ToInt32(request.Position.Line),
                OnlyThisFile      = false,
                ExcludeDefinition = !request.Context.IncludeDeclaration
            };

            var omnisharpResponse = await _findUsagesHandler.Handle(omnisharpRequest);

            return(omnisharpResponse.QuickFixes?.Select(x => new Location
            {
                Uri = Helpers.ToUri(x.FileName),
                Range = x.ToRange()
            }).ToArray());
        }
        public override async Task <Hover> Handle(HoverParams request, CancellationToken token)
        {
            var omnisharpRequest = new QuickInfoRequest()
            {
                FileName = Helpers.FromUri(request.TextDocument.Uri),
                Column   = Convert.ToInt32(request.Position.Character),
                Line     = Convert.ToInt32(request.Position.Line),
            };

            var omnisharpResponse = await _definitionHandler.Handle(omnisharpRequest);

            return(new Hover()
            {
                // TODO: Range?  We don't currently have that!
                // Range =
                Contents = new MarkedStringsOrMarkupContent(new MarkupContent()
                {
                    Value = omnisharpResponse.Markdown, Kind = MarkupKind.Markdown
                })
            });
        }
        public async Task <LocationOrLocations> Handle(DefinitionParams request, CancellationToken token)
        {
            var omnisharpRequest = new GotoDefinitionRequest()
            {
                FileName = FromUri(request.TextDocument.Uri),
                Column   = Convert.ToInt32(request.Position.Character),
                Line     = Convert.ToInt32(request.Position.Line)
            };

            var omnisharpResponse = await _definitionHandler.Handle(omnisharpRequest);

            if (string.IsNullOrWhiteSpace(omnisharpResponse.FileName))
            {
                return(new LocationOrLocations());
            }

            return(new LocationOrLocations(new Location()
            {
                Uri = ToUri(omnisharpResponse.FileName),
                Range = ToRange((omnisharpResponse.Column, omnisharpResponse.Line))
            }));
        public async Task <Unit> Handle(ExecuteCommandParams request, CancellationToken cancellationToken)
        {
            Debug.Assert(request.Command == "omnisharp/executeCodeAction");
            var data = request.Arguments[0].ToObject <CommandData>(_serializer.JsonSerializer);

            var omnisharpCaRequest = new RunCodeActionRequest {
                Identifier                   = data.Identifier,
                FileName                     = data.Uri.GetFileSystemPath(),
                Column                       = data.Range.Start.Character,
                Line                         = data.Range.Start.Line,
                Selection                    = Helpers.FromRange(data.Range),
                ApplyTextChanges             = false,
                WantsTextChanges             = true,
                WantsAllCodeActionOperations = true
            };

            var omnisharpCaResponse = await _runActionHandler.Handle(omnisharpCaRequest);

            if (omnisharpCaResponse.Changes != null)
            {
                var edit = Helpers.ToWorkspaceEdit(
                    omnisharpCaResponse.Changes,
                    _server.ClientSettings.Capabilities.Workspace.WorkspaceEdit.Value,
                    _documentVersions
                    );
                ;

                await _server.Workspace.ApplyWorkspaceEdit(new ApplyWorkspaceEditParams()
                {
                    Label = data.Name,
                    Edit  = edit
                }, cancellationToken);

                // Do something with response?
                //if (response.Applied)
            }

            return(Unit.Value);
        }
Beispiel #25
0
        public override async Task <LocationOrLocationLinks> Handle(DefinitionParams request, CancellationToken token)
        {
            var omnisharpRequest = new GotoDefinitionRequest()
            {
                FileName = FromUri(request.TextDocument.Uri),
                Column   = Convert.ToInt32(request.Position.Character),
                Line     = Convert.ToInt32(request.Position.Line)
            };

            var omnisharpResponse = await _definitionHandler.Handle(omnisharpRequest);

            if (omnisharpResponse.Definitions == null)
            {
                return(new LocationOrLocationLinks());
            }

            return(new LocationOrLocationLinks(omnisharpResponse.Definitions.Select <Definition, LocationOrLocationLink>(definition => new Location()
            {
                Uri = definition.Location.FileName,
                Range = ToRange(definition.Location.Range)
            })));
        }
        public async override Task <CodeLens> Handle(CodeLens request, CancellationToken token)
        {
            var omnisharpRequest = new FindUsagesRequest
            {
                FileName          = Helpers.FromUri(request.Data.ToObject <Uri>()),
                Column            = (int)request.Range.Start.Character,
                Line              = (int)request.Range.Start.Line,
                OnlyThisFile      = false,
                ExcludeDefinition = true
            };

            var omnisharpResponse = await _findUsagesHandler.Handle(omnisharpRequest);

            var length = omnisharpResponse?.QuickFixes?.Count() ?? 0;

            request.Command = new Command
            {
                Title = length == 1 ? "1 reference" : $"{length} references"
                        // TODO: Hook up command.
            };

            return(request);
        }
Beispiel #27
0
        public async Task <SignatureHelp> Handle(TextDocumentPositionParams request, CancellationToken token)
        {
            var omnisharpRequest = new SignatureHelpRequest
            {
                FileName = Helpers.FromUri(request.TextDocument.Uri),
                Column   = Convert.ToInt32(request.Position.Character),
                Line     = Convert.ToInt32(request.Position.Line)
            };

            var omnisharpResponse = await _signatureHandler.Handle(omnisharpRequest);

            if (!omnisharpResponse.Signatures.Any())
            {
                return(null);
            }

            var containerSignatures = omnisharpResponse.Signatures.Select(x => new SignatureInformation
            {
                Documentation = x.Documentation,
                Label         = x.Label,
                Parameters    = new Container <ParameterInformation>(x.Parameters.Select(param => new ParameterInformation
                {
                    Documentation = param.Documentation,
                    Label         = param.Label
                }))
            });

            var signatures = new Container <SignatureInformation>(containerSignatures);

            return(new SignatureHelp
            {
                ActiveParameter = omnisharpResponse.ActiveParameter,
                ActiveSignature = omnisharpResponse.ActiveSignature,
                Signatures = signatures
            });
        }