Skip to content

gopls integrator FAQ

Rebecca Stambler edited this page Aug 6, 2019 · 10 revisions

This page is meant to provide information to those who are developing LSP clients to integrate with gopls. Examples of such clients include VSCode-Go, vim-go, govim, emacs-lsp, and many others. For a more complete list, see all of the editors that support gopls here.

The best starting point for any integrator is the Language Service Protocol Specification. golang.org/x/tools/internal/lsp/protocol represents a Go definition of the spec.

Feel free to add additional questions and answers here as they come up. To ask a question that isn't answered here, please reach out to the gopls developers either by filing an issue in the Go issue tracker or by sending a message to the #gopls channel in the Gophers Slack.

Table of Contents

Supported features

The most accurate answer to this question is to examine the InitializeResult response to Initialize, specifically the capabilities field of type ServerCapabilities

UTF-8, UTF-16 and position information

As an example, the Hover method takes TextDocumentPositionParams which has a position field of type Position. The key point to note from that last link is the following:

A position inside a document (see Position definition below) is expressed as a zero-based line and character offset. The offsets are based on a UTF-16 string representation. So a string of the form a𐐀b the character offset of the character a is 0, the character offset of 𐐀 is 1 and the character offset of b is 3 since 𐐀 is represented using two code units in UTF-16.

i.e. integrators will need to calculate UTF-16 based column offsets. For Go-based integrators, the golang.org/x/tools/internal/span will be of use. #31080 tracks making span and other useful packages non-internal.

[]TextEdit responses

At the time of writing (2019-07-15) the []TextEdit response to textDocument/formatting and the WorkspaceEdit response to textDocument/rename comprises range-based deltas. The spec is not explicit about how these deltas should be applied, instead simply stating:

If multiple inserts have the same position, the order in the array defines the order in which the inserted strings appear in the resulting text.

All []TextEdit are sorted such that applying the array of deltas received in reverse order achieves the desired result that holds with the spec.

RPC response errors

https://go-review.googlesource.com/c/tools/+/170958 and related discussions are looking to help shape what it means for a server method to return an error. i.e.

  • Under what conditions would the Format method return an error?
  • On a syntax error, or just for low-level LSP/transport issues?
  • What should editors do in response to such errors?

This answer is therefore a WIP.

Files that change outside of the editor

For example, files that are created/modified/removed as a result of go generate. Per @ianthehat:

The plan is to have the client do all the work for us. Specifically we are going to start using workspace/didChangeWatchedFiles to monitor all the files we are caching AST's for

This is currently not implemented (see #31553).

Clone this wiki locally