diff --git a/internal/lsp/cmd/cmd.go b/internal/lsp/cmd/cmd.go index 0262c030..ffb02c88 100644 --- a/internal/lsp/cmd/cmd.go +++ b/internal/lsp/cmd/cmd.go @@ -150,9 +150,12 @@ func (app *Application) connect(ctx context.Context, client cmdClient) (protocol } go jc.Run(ctx) } + params := &protocol.InitializeParams{} params.RootURI = string(span.FileURI(app.Config.Dir)) params.Capabilities.Workspace.Configuration = true + params.Capabilities.TextDocument.Hover.ContentFormat = []protocol.MarkupKind{protocol.PlainText} + client.prepare(app, server) if _, err := server.Initialize(ctx, params); err != nil { return nil, err diff --git a/internal/lsp/cmd/definition.go b/internal/lsp/cmd/definition.go index c906dc21..4e9b97e3 100644 --- a/internal/lsp/cmd/definition.go +++ b/internal/lsp/cmd/definition.go @@ -100,13 +100,7 @@ func (d *definition) Run(ctx context.Context, args ...string) error { if err != nil { return fmt.Errorf("%v: %v", from, err) } - //TODO: either work out how to request plain text, or - //use a less kludgy way of cleaning the markdown - description := hover.Contents.Value - if v := strings.TrimPrefix(description, "```go"); v != description { - description = strings.TrimSuffix(v, "```") - } - description = strings.TrimSpace(description) + description := strings.TrimSpace(hover.Contents.Value) var result interface{} switch d.query.Emulate { case "": diff --git a/internal/lsp/general.go b/internal/lsp/general.go index 39915818..b97d46da 100644 --- a/internal/lsp/general.go +++ b/internal/lsp/general.go @@ -105,6 +105,12 @@ func (s *Server) setClientCapabilities(caps protocol.ClientCapabilities) { // Check if the client supports configuration messages. s.configurationSupported = caps.Workspace.Configuration s.dynamicConfigurationSupported = caps.Workspace.DidChangeConfiguration.DynamicRegistration + + // Check which types of content format are supported by this client. + s.preferredContentFormat = protocol.PlainText + if len(caps.TextDocument.Hover.ContentFormat) > 0 { + s.preferredContentFormat = caps.TextDocument.Hover.ContentFormat[0] + } } func (s *Server) initialized(ctx context.Context, params *protocol.InitializedParams) error { diff --git a/internal/lsp/hover.go b/internal/lsp/hover.go index 8348251b..8a8e2181 100644 --- a/internal/lsp/hover.go +++ b/internal/lsp/hover.go @@ -35,7 +35,6 @@ func (s *Server) hover(ctx context.Context, params *protocol.TextDocumentPositio if err != nil { return nil, err } - markdown := "```go\n" + content + "\n```" identSpan, err := ident.Range.Span() if err != nil { return nil, err @@ -45,10 +44,20 @@ func (s *Server) hover(ctx context.Context, params *protocol.TextDocumentPositio return nil, err } return &protocol.Hover{ - Contents: protocol.MarkupContent{ - Kind: protocol.Markdown, - Value: markdown, - }, - Range: &rng, + Contents: markupContent(content, s.preferredContentFormat), + Range: &rng, }, nil } + +func markupContent(content string, kind protocol.MarkupKind) protocol.MarkupContent { + result := protocol.MarkupContent{ + Kind: kind, + } + switch kind { + case protocol.PlainText: + result.Value = content + case protocol.Markdown: + result.Value = "```go\n" + content + "\n```" + } + return result +} diff --git a/internal/lsp/server.go b/internal/lsp/server.go index 2d7947e6..54bfd1ac 100644 --- a/internal/lsp/server.go +++ b/internal/lsp/server.go @@ -77,6 +77,7 @@ type Server struct { insertTextFormat protocol.InsertTextFormat configurationSupported bool dynamicConfigurationSupported bool + preferredContentFormat protocol.MarkupKind textDocumentSyncKind protocol.TextDocumentSyncKind