aboutsummaryrefslogtreecommitdiff
path: root/internal/lsp/regtest/wrappers.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/lsp/regtest/wrappers.go')
-rw-r--r--internal/lsp/regtest/wrappers.go446
1 files changed, 0 insertions, 446 deletions
diff --git a/internal/lsp/regtest/wrappers.go b/internal/lsp/regtest/wrappers.go
deleted file mode 100644
index 9031e71f1..000000000
--- a/internal/lsp/regtest/wrappers.go
+++ /dev/null
@@ -1,446 +0,0 @@
-// Copyright 2020 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package regtest
-
-import (
- "encoding/json"
- "path"
- "testing"
-
- "golang.org/x/tools/internal/lsp/command"
- "golang.org/x/tools/internal/lsp/fake"
- "golang.org/x/tools/internal/lsp/protocol"
-)
-
-func (e *Env) ChangeFilesOnDisk(events []fake.FileEvent) {
- e.T.Helper()
- if err := e.Sandbox.Workdir.ChangeFilesOnDisk(e.Ctx, events); err != nil {
- e.T.Fatal(err)
- }
-}
-
-// RemoveWorkspaceFile deletes a file on disk but does nothing in the
-// editor. It calls t.Fatal on any error.
-func (e *Env) RemoveWorkspaceFile(name string) {
- e.T.Helper()
- if err := e.Sandbox.Workdir.RemoveFile(e.Ctx, name); err != nil {
- e.T.Fatal(err)
- }
-}
-
-// ReadWorkspaceFile reads a file from the workspace, calling t.Fatal on any
-// error.
-func (e *Env) ReadWorkspaceFile(name string) string {
- e.T.Helper()
- content, err := e.Sandbox.Workdir.ReadFile(name)
- if err != nil {
- e.T.Fatal(err)
- }
- return content
-}
-
-// WriteWorkspaceFile writes a file to disk but does nothing in the editor.
-// It calls t.Fatal on any error.
-func (e *Env) WriteWorkspaceFile(name, content string) {
- e.T.Helper()
- if err := e.Sandbox.Workdir.WriteFile(e.Ctx, name, content); err != nil {
- e.T.Fatal(err)
- }
-}
-
-// WriteWorkspaceFiles deletes a file on disk but does nothing in the
-// editor. It calls t.Fatal on any error.
-func (e *Env) WriteWorkspaceFiles(files map[string]string) {
- e.T.Helper()
- if err := e.Sandbox.Workdir.WriteFiles(e.Ctx, files); err != nil {
- e.T.Fatal(err)
- }
-}
-
-// OpenFile opens a file in the editor, calling t.Fatal on any error.
-func (e *Env) OpenFile(name string) {
- e.T.Helper()
- if err := e.Editor.OpenFile(e.Ctx, name); err != nil {
- e.T.Fatal(err)
- }
-}
-
-// CreateBuffer creates a buffer in the editor, calling t.Fatal on any error.
-func (e *Env) CreateBuffer(name string, content string) {
- e.T.Helper()
- if err := e.Editor.CreateBuffer(e.Ctx, name, content); err != nil {
- e.T.Fatal(err)
- }
-}
-
-// CloseBuffer closes an editor buffer without saving, calling t.Fatal on any
-// error.
-func (e *Env) CloseBuffer(name string) {
- e.T.Helper()
- if err := e.Editor.CloseBuffer(e.Ctx, name); err != nil {
- e.T.Fatal(err)
- }
-}
-
-// EditBuffer applies edits to an editor buffer, calling t.Fatal on any error.
-func (e *Env) EditBuffer(name string, edits ...fake.Edit) {
- e.T.Helper()
- if err := e.Editor.EditBuffer(e.Ctx, name, edits); err != nil {
- e.T.Fatal(err)
- }
-}
-
-func (e *Env) SetBufferContent(name string, content string) {
- e.T.Helper()
- if err := e.Editor.SetBufferContent(e.Ctx, name, content); err != nil {
- e.T.Fatal(err)
- }
-}
-
-// RegexpRange returns the range of the first match for re in the buffer
-// specified by name, calling t.Fatal on any error. It first searches for the
-// position in open buffers, then in workspace files.
-func (e *Env) RegexpRange(name, re string) (fake.Pos, fake.Pos) {
- e.T.Helper()
- start, end, err := e.Editor.RegexpRange(name, re)
- if err == fake.ErrUnknownBuffer {
- start, end, err = e.Sandbox.Workdir.RegexpRange(name, re)
- }
- if err != nil {
- e.T.Fatalf("RegexpRange: %v, %v", name, err)
- }
- return start, end
-}
-
-// RegexpSearch returns the starting position of the first match for re in the
-// buffer specified by name, calling t.Fatal on any error. It first searches
-// for the position in open buffers, then in workspace files.
-func (e *Env) RegexpSearch(name, re string) fake.Pos {
- e.T.Helper()
- pos, err := e.Editor.RegexpSearch(name, re)
- if err == fake.ErrUnknownBuffer {
- pos, err = e.Sandbox.Workdir.RegexpSearch(name, re)
- }
- if err != nil {
- e.T.Fatalf("RegexpSearch: %v, %v", name, err)
- }
- return pos
-}
-
-// RegexpReplace replaces the first group in the first match of regexpStr with
-// the replace text, calling t.Fatal on any error.
-func (e *Env) RegexpReplace(name, regexpStr, replace string) {
- e.T.Helper()
- if err := e.Editor.RegexpReplace(e.Ctx, name, regexpStr, replace); err != nil {
- e.T.Fatalf("RegexpReplace: %v", err)
- }
-}
-
-// SaveBuffer saves an editor buffer, calling t.Fatal on any error.
-func (e *Env) SaveBuffer(name string) {
- e.T.Helper()
- if err := e.Editor.SaveBuffer(e.Ctx, name); err != nil {
- e.T.Fatal(err)
- }
-}
-
-func (e *Env) SaveBufferWithoutActions(name string) {
- e.T.Helper()
- if err := e.Editor.SaveBufferWithoutActions(e.Ctx, name); err != nil {
- e.T.Fatal(err)
- }
-}
-
-// GoToDefinition goes to definition in the editor, calling t.Fatal on any
-// error. It returns the path and position of the resulting jump.
-func (e *Env) GoToDefinition(name string, pos fake.Pos) (string, fake.Pos) {
- e.T.Helper()
- n, p, err := e.Editor.GoToDefinition(e.Ctx, name, pos)
- if err != nil {
- e.T.Fatal(err)
- }
- return n, p
-}
-
-// Symbol returns symbols matching query
-func (e *Env) Symbol(query string) []fake.SymbolInformation {
- e.T.Helper()
- r, err := e.Editor.Symbol(e.Ctx, query)
- if err != nil {
- e.T.Fatal(err)
- }
- return r
-}
-
-// FormatBuffer formats the editor buffer, calling t.Fatal on any error.
-func (e *Env) FormatBuffer(name string) {
- e.T.Helper()
- if err := e.Editor.FormatBuffer(e.Ctx, name); err != nil {
- e.T.Fatal(err)
- }
-}
-
-// OrganizeImports processes the source.organizeImports codeAction, calling
-// t.Fatal on any error.
-func (e *Env) OrganizeImports(name string) {
- e.T.Helper()
- if err := e.Editor.OrganizeImports(e.Ctx, name); err != nil {
- e.T.Fatal(err)
- }
-}
-
-// ApplyQuickFixes processes the quickfix codeAction, calling t.Fatal on any error.
-func (e *Env) ApplyQuickFixes(path string, diagnostics []protocol.Diagnostic) {
- e.T.Helper()
- if err := e.Editor.ApplyQuickFixes(e.Ctx, path, nil, diagnostics); err != nil {
- e.T.Fatal(err)
- }
-}
-
-// ApplyCodeAction applies the given code action.
-func (e *Env) ApplyCodeAction(action protocol.CodeAction) {
- e.T.Helper()
- if err := e.Editor.ApplyCodeAction(e.Ctx, action); err != nil {
- e.T.Fatal(err)
- }
-}
-
-// GetQuickFixes returns the available quick fix code actions.
-func (e *Env) GetQuickFixes(path string, diagnostics []protocol.Diagnostic) []protocol.CodeAction {
- e.T.Helper()
- actions, err := e.Editor.GetQuickFixes(e.Ctx, path, nil, diagnostics)
- if err != nil {
- e.T.Fatal(err)
- }
- return actions
-}
-
-// Hover in the editor, calling t.Fatal on any error.
-func (e *Env) Hover(name string, pos fake.Pos) (*protocol.MarkupContent, fake.Pos) {
- e.T.Helper()
- c, p, err := e.Editor.Hover(e.Ctx, name, pos)
- if err != nil {
- e.T.Fatal(err)
- }
- return c, p
-}
-
-func (e *Env) DocumentLink(name string) []protocol.DocumentLink {
- e.T.Helper()
- links, err := e.Editor.DocumentLink(e.Ctx, name)
- if err != nil {
- e.T.Fatal(err)
- }
- return links
-}
-
-func (e *Env) DocumentHighlight(name string, pos fake.Pos) []protocol.DocumentHighlight {
- e.T.Helper()
- highlights, err := e.Editor.DocumentHighlight(e.Ctx, name, pos)
- if err != nil {
- e.T.Fatal(err)
- }
- return highlights
-}
-
-// RunGenerate runs go:generate on the given dir, calling t.Fatal on any error.
-// It waits for the generate command to complete and checks for file changes
-// before returning.
-func (e *Env) RunGenerate(dir string) {
- e.T.Helper()
- if err := e.Editor.RunGenerate(e.Ctx, dir); err != nil {
- e.T.Fatal(err)
- }
- e.Await(NoOutstandingWork())
- // Ideally the fake.Workspace would handle all synthetic file watching, but
- // we help it out here as we need to wait for the generate command to
- // complete before checking the filesystem.
- e.CheckForFileChanges()
-}
-
-// RunGoCommand runs the given command in the sandbox's default working
-// directory.
-func (e *Env) RunGoCommand(verb string, args ...string) {
- e.T.Helper()
- if err := e.Sandbox.RunGoCommand(e.Ctx, "", verb, args, true); err != nil {
- e.T.Fatal(err)
- }
-}
-
-// RunGoCommandInDir is like RunGoCommand, but executes in the given
-// relative directory of the sandbox.
-func (e *Env) RunGoCommandInDir(dir, verb string, args ...string) {
- e.T.Helper()
- if err := e.Sandbox.RunGoCommand(e.Ctx, dir, verb, args, true); err != nil {
- e.T.Fatal(err)
- }
-}
-
-// DumpGoSum prints the correct go.sum contents for dir in txtar format,
-// for use in creating regtests.
-func (e *Env) DumpGoSum(dir string) {
- e.T.Helper()
-
- if err := e.Sandbox.RunGoCommand(e.Ctx, dir, "list", []string{"-mod=mod", "..."}, true); err != nil {
- e.T.Fatal(err)
- }
- sumFile := path.Join(dir, "/go.sum")
- e.T.Log("\n\n-- " + sumFile + " --\n" + e.ReadWorkspaceFile(sumFile))
- e.T.Fatal("see contents above")
-}
-
-// CheckForFileChanges triggers a manual poll of the workspace for any file
-// changes since creation, or since last polling. It is a workaround for the
-// lack of true file watching support in the fake workspace.
-func (e *Env) CheckForFileChanges() {
- e.T.Helper()
- if err := e.Sandbox.Workdir.CheckForFileChanges(e.Ctx); err != nil {
- e.T.Fatal(err)
- }
-}
-
-// CodeLens calls textDocument/codeLens for the given path, calling t.Fatal on
-// any error.
-func (e *Env) CodeLens(path string) []protocol.CodeLens {
- e.T.Helper()
- lens, err := e.Editor.CodeLens(e.Ctx, path)
- if err != nil {
- e.T.Fatal(err)
- }
- return lens
-}
-
-// ExecuteCodeLensCommand executes the command for the code lens matching the
-// given command name.
-func (e *Env) ExecuteCodeLensCommand(path string, cmd command.Command) {
- e.T.Helper()
- lenses := e.CodeLens(path)
- var lens protocol.CodeLens
- var found bool
- for _, l := range lenses {
- if l.Command.Command == cmd.ID() {
- lens = l
- found = true
- }
- }
- if !found {
- e.T.Fatalf("found no command with the ID %s", cmd.ID())
- }
- e.ExecuteCommand(&protocol.ExecuteCommandParams{
- Command: lens.Command.Command,
- Arguments: lens.Command.Arguments,
- }, nil)
-}
-
-func (e *Env) ExecuteCommand(params *protocol.ExecuteCommandParams, result interface{}) {
- e.T.Helper()
- response, err := e.Editor.ExecuteCommand(e.Ctx, params)
- if err != nil {
- e.T.Fatal(err)
- }
- if result == nil {
- return
- }
- // Hack: The result of an executeCommand request will be unmarshaled into
- // maps. Re-marshal and unmarshal into the type we expect.
- //
- // This could be improved by generating a jsonrpc2 command client from the
- // command.Interface, but that should only be done if we're consolidating
- // this part of the tsprotocol generation.
- data, err := json.Marshal(response)
- if err != nil {
- e.T.Fatal(err)
- }
- if err := json.Unmarshal(data, result); err != nil {
- e.T.Fatal(err)
- }
-}
-
-// WorkspaceSymbol calls workspace/symbol
-func (e *Env) WorkspaceSymbol(sym string) []protocol.SymbolInformation {
- e.T.Helper()
- ans, err := e.Editor.Symbols(e.Ctx, sym)
- if err != nil {
- e.T.Fatal(err)
- }
- return ans
-}
-
-// References calls textDocument/references for the given path at the given
-// position.
-func (e *Env) References(path string, pos fake.Pos) []protocol.Location {
- e.T.Helper()
- locations, err := e.Editor.References(e.Ctx, path, pos)
- if err != nil {
- e.T.Fatal(err)
- }
- return locations
-}
-
-func (e *Env) Rename(path string, pos fake.Pos, newName string) {
- e.T.Helper()
- if err := e.Editor.Rename(e.Ctx, path, pos, newName); err != nil {
- e.T.Fatal(err)
- }
-}
-
-// Completion executes a completion request on the server.
-func (e *Env) Completion(path string, pos fake.Pos) *protocol.CompletionList {
- e.T.Helper()
- completions, err := e.Editor.Completion(e.Ctx, path, pos)
- if err != nil {
- e.T.Fatal(err)
- }
- return completions
-}
-
-// AcceptCompletion accepts a completion for the given item at the given
-// position.
-func (e *Env) AcceptCompletion(path string, pos fake.Pos, item protocol.CompletionItem) {
- e.T.Helper()
- if err := e.Editor.AcceptCompletion(e.Ctx, path, pos, item); err != nil {
- e.T.Fatal(err)
- }
-}
-
-// CodeAction calls testDocument/codeAction for the given path, and calls
-// t.Fatal if there are errors.
-func (e *Env) CodeAction(path string, diagnostics []protocol.Diagnostic) []protocol.CodeAction {
- e.T.Helper()
- actions, err := e.Editor.CodeAction(e.Ctx, path, nil, diagnostics)
- if err != nil {
- e.T.Fatal(err)
- }
- return actions
-}
-
-func (e *Env) ChangeConfiguration(t *testing.T, config *fake.EditorConfig) {
- e.Editor.Config = *config
- if err := e.Editor.Server.DidChangeConfiguration(e.Ctx, &protocol.DidChangeConfigurationParams{
- // gopls currently ignores the Settings field
- }); err != nil {
- t.Fatal(err)
- }
-}
-
-// ChangeEnv modifies the editor environment and reconfigures the LSP client.
-// TODO: extend this to "ChangeConfiguration", once we refactor the way editor
-// configuration is defined.
-func (e *Env) ChangeEnv(overlay map[string]string) {
- e.T.Helper()
- // TODO: to be correct, this should probably be synchronized, but right now
- // configuration is only ever modified synchronously in a regtest, so this
- // correctness can wait for the previously mentioned refactoring.
- if e.Editor.Config.Env == nil {
- e.Editor.Config.Env = make(map[string]string)
- }
- for k, v := range overlay {
- e.Editor.Config.Env[k] = v
- }
- var params protocol.DidChangeConfigurationParams
- if err := e.Editor.Server.DidChangeConfiguration(e.Ctx, &params); err != nil {
- e.T.Fatal(err)
- }
-}