From a96101f168f4ff1e2cd559ba4f61dbd091684e41 Mon Sep 17 00:00:00 2001 From: Rebecca Stambler Date: Fri, 29 Mar 2019 18:16:43 -0400 Subject: [PATCH] internal/lsp: add a work-around for golang.org/issue/31090 Change-Id: I6be1a61bc0b573913ef86b7a47e9f71d036f84e3 Reviewed-on: https://go-review.googlesource.com/c/tools/+/170011 Run-TryBot: Rebecca Stambler TryBot-Result: Gobot Gobot Reviewed-by: Ian Cottrell --- internal/lsp/completion.go | 1 + internal/lsp/protocol/tsprotocol.go | 7 +++++-- internal/lsp/server.go | 11 ++++++++--- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/internal/lsp/completion.go b/internal/lsp/completion.go index f0d8bcb6..c2c8cda8 100644 --- a/internal/lsp/completion.go +++ b/internal/lsp/completion.go @@ -46,6 +46,7 @@ func toProtocolCompletionItems(candidates []source.CompletionItem, prefix string End: pos, }, }, + InsertTextFormat: insertTextFormat, // This is a hack so that the client sorts completion results in the order // according to their score. This can be removed upon the resolution of // https://github.com/Microsoft/language-server-protocol/issues/348. diff --git a/internal/lsp/protocol/tsprotocol.go b/internal/lsp/protocol/tsprotocol.go index c0cba77f..11962acf 100644 --- a/internal/lsp/protocol/tsprotocol.go +++ b/internal/lsp/protocol/tsprotocol.go @@ -1017,8 +1017,11 @@ type InnerClientCapabilities struct { Experimental interface{} `json:"experimental,omitempty"` } -// ClientCapabilities is: -type ClientCapabilities struct { +// TODO(rstambler): Remove this when golang.org/issue/31090 is resolved. +type ClientCapabilities map[string]interface{} + +// clientCapabilities is: +type clientCapabilities struct { InnerClientCapabilities ImplementationClientCapabilities TypeDefinitionClientCapabilities diff --git a/internal/lsp/server.go b/internal/lsp/server.go index c3e50905..0ea00852 100644 --- a/internal/lsp/server.go +++ b/internal/lsp/server.go @@ -93,9 +93,14 @@ func (s *Server) Initialize(ctx context.Context, params *protocol.InitializePara s.initialized = true // mark server as initialized now // Check if the client supports snippets in completion items. - capText := params.Capabilities.InnerClientCapabilities.TextDocument - if capText != nil && capText.Completion != nil && capText.Completion.CompletionItem != nil { - s.snippetsSupported = capText.Completion.CompletionItem.SnippetSupport + if x, ok := params.Capabilities["textDocument"].(map[string]interface{}); ok { + if x, ok := x["completion"].(map[string]interface{}); ok { + if x, ok := x["completionItem"].(map[string]interface{}); ok { + if x, ok := x["snippetSupport"].(bool); ok { + s.snippetsSupported = x + } + } + } } s.signatureHelpEnabled = true