gopls/internal/lsp/tests: eliminate several old marker types

This CL is the unraveling of a single thread, which ended up spanning
many different tests and markers. The goal was to eliminate the three
remaining diagnostic markers in the old test framework, but due to the
tightly bound nature of the old marker tests, that led to the
elimination of Diagnostics, Definitions, TypeDefinitions, and
UnimportedCompletions, along with the definition of several new markers
in the new marker tests.

The new tests are perhaps cleaner in some areas, but still a tangle: my
goal is to delete the old marker tests ASAP, and it's easier to port
them more-or-less faithfully rather than read through and fix bugs /
broken assertions, verbose APIs, unexpected diagnostics, etc.

To this end, the -ignore_extra_diags flag is introduced as some of the
old tests had too many diagnostics for me to annotate. At least this
looseness is contained only to the tests in which the flag is set.

Also, the @rank and @snippet markers didn't make a ton of sense to me
(they refer to completion items but only care about labels), but I
didn't want to fix that. At a later time, I may go back through and
change the way completion items are represented: the current style is
rather verbose.

Some completion markers in the old framework were changing settings for
each mark, sometimes applying _multiple_ settings (see signatureHelp).
The new marker framework does not support this (rightly so, in my opinion),
and so where appropriate certain tests such as unimported completion
had to be moved into a different test file so that they can use
different settings.

As for the tests themselves: they are _mostly_ the same as before,
though I had to tweak them in various small ways to make them work. For
example annotating diagnostics, redefining an import, changing the
marker signature, etc. I don't think I meaningfully changed the test
assertions, but I don't expect this to be carefully verified during
review. I can only hope that the new state is slightly more maintainable
than the old; and provides us a platform to eventually make the tests
significantly more maintainable.

For golang/go#54845

Change-Id: I701bfcbfecf32cd780caba9e324a134e2d9bd048
Reviewed-by: Alan Donovan <>
LUCI-TryBot-Result: Go LUCI <>
60 files changed
tree: 98ca6d3f206b1bbf843ffb0642aa11fc3516a585
  1. benchmark/
  2. blog/
  3. cmd/
  4. container/
  5. copyright/
  6. cover/
  7. go/
  8. godoc/
  9. gopls/
  10. imports/
  11. internal/
  12. playground/
  13. present/
  14. refactor/
  15. txtar/
  16. .gitattributes
  17. .gitignore
  18. .prettierrc
  19. codereview.cfg
  21. go.mod
  22. go.sum

Go Tools


This repository provides the module, comprising various tools and packages mostly for static analysis of Go programs, some of which are listed below. Use the “Go reference” link above for more information about any package.

It also contains the module, whose root package is a language-server protocol (LSP) server for Go. An LSP server analyses the source code of a project and responds to requests from a wide range of editors such as VSCode and Vim, allowing them to support IDE-like functionality.

Selected commands:

  • cmd/goimports formats a Go program like go fmt and additionally inserts import statements for any packages required by the file after it is edited.
  • cmd/callgraph prints the call graph of a Go program.
  • cmd/digraph is a utility for manipulating directed graphs in textual notation.
  • cmd/stringer generates declarations (including a String method) for “enum” types.
  • cmd/toolstash is a utility to simplify working with multiple versions of the Go toolchain.

These commands may be fetched with a command such as

go install

Selected packages:

  • go/ssa provides a static single-assignment form (SSA) intermediate representation (IR) for Go programs, similar to a typical compiler, for use by analysis tools.

  • go/packages provides a simple interface for loading, parsing, and type checking a complete Go program from source code.

  • go/analysis provides a framework for modular static analysis of Go programs.

  • go/callgraph provides call graphs of Go programs using a variety of algorithms with different trade-offs.

  • go/ast/inspector provides an optimized means of traversing a Go parse tree for use in analysis tools.

  • go/cfg provides a simple control-flow graph (CFG) for a Go function.

  • go/expect reads Go source files used as test inputs and interprets special comments within them as queries or assertions for testing.

  • go/gcexportdata and go/gccgoexportdata read and write the binary files containing type information used by the standard and gccgo compilers.

  • go/types/objectpath provides a stable naming scheme for named entities (“objects”) in the go/types API.

Numerous other packages provide more esoteric functionality.


This repository uses Gerrit for code changes. To learn how to submit changes, see

The main issue tracker for the tools repository is located at Prefix your issue with “x/tools/(your subdir):” in the subject line, so it is easy to find.

JavaScript and CSS Formatting

This repository uses prettier to format JS and CSS files.

The version of prettier used is 1.18.2.

It is encouraged that all JS and CSS code be run through this before submitting a change. However, it is not a strict requirement enforced by CI.