Skip to content

Commit 5f93517

Browse files
committed
internal/lsp: stop making background contexts everywhere
For all uses inside the lsp we use the detatch logic instead For tests we build it in the test harness instead This is in preparation for things on the context becomming important Change-Id: I7e6910e0d3581b82abbeeb09f9c22a99efb73142 Reviewed-on: https://go-review.googlesource.com/c/tools/+/185677 Run-TryBot: Ian Cottrell <iancottrell@google.com> Reviewed-by: Rebecca Stambler <rstambler@golang.org>
1 parent 2868181 commit 5f93517

16 files changed

Lines changed: 85 additions & 92 deletions

File tree

internal/lsp/cache/session.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
"golang.org/x/tools/internal/lsp/source"
1919
"golang.org/x/tools/internal/lsp/xlog"
2020
"golang.org/x/tools/internal/span"
21+
"golang.org/x/tools/internal/xcontext"
2122
)
2223

2324
type session struct {
@@ -64,11 +65,11 @@ func (s *session) Cache() source.Cache {
6465
return s.cache
6566
}
6667

67-
func (s *session) NewView(name string, folder span.URI) source.View {
68+
func (s *session) NewView(ctx context.Context, name string, folder span.URI) source.View {
6869
index := atomic.AddInt64(&viewIndex, 1)
6970
s.viewMu.Lock()
7071
defer s.viewMu.Unlock()
71-
ctx := context.Background()
72+
ctx = xcontext.Detach(ctx)
7273
backgroundCtx, cancel := context.WithCancel(ctx)
7374
v := &view{
7475
session: s,

internal/lsp/cmd/check_test.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
package cmd_test
66

77
import (
8-
"context"
98
"fmt"
109
"strings"
1110
"testing"
@@ -23,7 +22,7 @@ func (r *runner) Diagnostics(t *testing.T, data tests.Diagnostics) {
2322
fname := uri.Filename()
2423
args := []string{"-remote=internal", "check", fname}
2524
out := captureStdOut(t, func() {
26-
tool.Main(context.Background(), r.app, args)
25+
tool.Main(r.ctx, r.app, args)
2726
})
2827
// parse got into a collection of reports
2928
got := map[string]struct{}{}

internal/lsp/cmd/cmd.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import (
2626
"golang.org/x/tools/internal/lsp/source"
2727
"golang.org/x/tools/internal/span"
2828
"golang.org/x/tools/internal/tool"
29+
"golang.org/x/tools/internal/xcontext"
2930
)
3031

3132
// Application is the main application as passed to tool.Main
@@ -148,7 +149,7 @@ func (app *Application) connect(ctx context.Context) (*connection, error) {
148149
return c, nil
149150
}
150151
connection := newConnection(app)
151-
ctx := context.Background() //TODO:a way of shutting down the internal server
152+
ctx := xcontext.Detach(ctx) //TODO:a way of shutting down the internal server
152153
cr, sw, _ := os.Pipe()
153154
sr, cw, _ := os.Pipe()
154155
var jc *jsonrpc2.Conn

internal/lsp/cmd/cmd_test.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ package cmd_test
66

77
import (
88
"bytes"
9+
"context"
910
"io/ioutil"
1011
"os"
1112
"path/filepath"
@@ -24,6 +25,7 @@ type runner struct {
2425
exporter packagestest.Exporter
2526
data *tests.Data
2627
app *cmd.Application
28+
ctx context.Context
2729
}
2830

2931
func TestCommandLine(t *testing.T) {
@@ -38,6 +40,7 @@ func testCommandLine(t *testing.T, exporter packagestest.Exporter) {
3840
exporter: exporter,
3941
data: data,
4042
app: cmd.New(data.Config.Dir, data.Exported.Config.Env),
43+
ctx: tests.Context(t),
4144
}
4245
tests.Run(t, r, data)
4346
}

internal/lsp/cmd/definition_test.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
package cmd_test
66

77
import (
8-
"context"
98
"fmt"
109
"os"
1110
"path/filepath"
@@ -56,7 +55,7 @@ func TestDefinitionHelpExample(t *testing.T) {
5655
fmt.Sprintf("%v:#%v", thisFile, cmd.ExampleOffset)} {
5756
args := append(baseArgs, query)
5857
got := captureStdOut(t, func() {
59-
tool.Main(context.Background(), cmd.New("", nil), args)
58+
tool.Main(tests.Context(t), cmd.New("", nil), args)
6059
})
6160
if !expect.MatchString(got) {
6261
t.Errorf("test with %v\nexpected:\n%s\ngot:\n%s", args, expect, got)
@@ -84,7 +83,7 @@ func (r *runner) Definition(t *testing.T, data tests.Definitions) {
8483
uri := d.Src.URI()
8584
args = append(args, fmt.Sprint(d.Src))
8685
got := captureStdOut(t, func() {
87-
tool.Main(context.Background(), r.app, args)
86+
tool.Main(r.ctx, r.app, args)
8887
})
8988
got = normalizePaths(r.data, got)
9089
if mode&jsonGoDef != 0 && runtime.GOOS == "windows" {

internal/lsp/cmd/format_test.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
package cmd_test
66

77
import (
8-
"context"
98
"os/exec"
109
"regexp"
1110
"strings"
@@ -40,7 +39,7 @@ func (r *runner) Format(t *testing.T, data tests.Formats) {
4039
}
4140
app := cmd.New(r.data.Config.Dir, r.data.Config.Env)
4241
got := captureStdOut(t, func() {
43-
tool.Main(context.Background(), app, append([]string{"-remote=internal", "format"}, args...))
42+
tool.Main(r.ctx, app, append([]string{"-remote=internal", "format"}, args...))
4443
})
4544
got = normalizePaths(r.data, got)
4645
// check the first two lines are the expected file header

internal/lsp/lsp_test.go

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -32,18 +32,20 @@ func TestLSP(t *testing.T) {
3232
type runner struct {
3333
server *Server
3434
data *tests.Data
35+
ctx context.Context
3536
}
3637

3738
const viewName = "lsp_test"
3839

3940
func testLSP(t *testing.T, exporter packagestest.Exporter) {
41+
ctx := tests.Context(t)
4042
data := tests.Load(t, exporter, "testdata")
4143
defer data.Exported.Cleanup()
4244

4345
log := xlog.New(xlog.StdSink{})
4446
cache := cache.New()
4547
session := cache.NewSession(log)
46-
view := session.NewView(viewName, span.FileURI(data.Config.Dir))
48+
view := session.NewView(ctx, viewName, span.FileURI(data.Config.Dir))
4749
view.SetEnv(data.Config.Env)
4850
for filename, content := range data.Config.Overlay {
4951
session.SetOverlay(span.FileURI(filename), content)
@@ -59,6 +61,7 @@ func testLSP(t *testing.T, exporter packagestest.Exporter) {
5961
hoverKind: source.SynopsisDocumentation,
6062
},
6163
data: data,
64+
ctx: ctx,
6265
}
6366
tests.Run(t, r, data)
6467
}
@@ -67,15 +70,15 @@ func testLSP(t *testing.T, exporter packagestest.Exporter) {
6770
func (r *runner) Diagnostics(t *testing.T, data tests.Diagnostics) {
6871
v := r.server.session.View(viewName)
6972
for uri, want := range data {
70-
f, err := v.GetFile(context.Background(), uri)
73+
f, err := v.GetFile(r.ctx, uri)
7174
if err != nil {
7275
t.Fatalf("no file for %s: %v", f, err)
7376
}
7477
gof, ok := f.(source.GoFile)
7578
if !ok {
7679
t.Fatalf("%s is not a Go file: %v", uri, err)
7780
}
78-
results, err := source.Diagnostics(context.Background(), v, gof, nil)
81+
results, err := source.Diagnostics(r.ctx, v, gof, nil)
7982
if err != nil {
8083
t.Fatal(err)
8184
}
@@ -218,7 +221,7 @@ func (r *runner) Completion(t *testing.T, data tests.Completions, snippets tests
218221

219222
func (r *runner) runCompletion(t *testing.T, src span.Span) *protocol.CompletionList {
220223
t.Helper()
221-
list, err := r.server.Completion(context.Background(), &protocol.CompletionParams{
224+
list, err := r.server.Completion(r.ctx, &protocol.CompletionParams{
222225
TextDocumentPositionParams: protocol.TextDocumentPositionParams{
223226
TextDocument: protocol.TextDocumentIdentifier{
224227
URI: protocol.NewURI(src.URI()),
@@ -295,7 +298,6 @@ func summarizeCompletionItems(i int, want []source.CompletionItem, got []protoco
295298
}
296299

297300
func (r *runner) Format(t *testing.T, data tests.Formats) {
298-
ctx := context.Background()
299301
for _, spn := range data {
300302
uri := spn.URI()
301303
filename := uri.Filename()
@@ -305,7 +307,7 @@ func (r *runner) Format(t *testing.T, data tests.Formats) {
305307
return out, nil
306308
}))
307309

308-
edits, err := r.server.Formatting(context.Background(), &protocol.DocumentFormattingParams{
310+
edits, err := r.server.Formatting(r.ctx, &protocol.DocumentFormattingParams{
309311
TextDocument: protocol.TextDocumentIdentifier{
310312
URI: protocol.NewURI(uri),
311313
},
@@ -316,7 +318,7 @@ func (r *runner) Format(t *testing.T, data tests.Formats) {
316318
}
317319
continue
318320
}
319-
_, m, err := getSourceFile(ctx, r.server.session.ViewOf(uri), uri)
321+
_, m, err := getSourceFile(r.ctx, r.server.session.ViewOf(uri), uri)
320322
if err != nil {
321323
t.Error(err)
322324
}
@@ -333,7 +335,6 @@ func (r *runner) Format(t *testing.T, data tests.Formats) {
333335
}
334336

335337
func (r *runner) Import(t *testing.T, data tests.Imports) {
336-
ctx := context.Background()
337338
for _, spn := range data {
338339
uri := spn.URI()
339340
filename := uri.Filename()
@@ -343,7 +344,7 @@ func (r *runner) Import(t *testing.T, data tests.Imports) {
343344
return out, nil
344345
}))
345346

346-
actions, err := r.server.CodeAction(context.Background(), &protocol.CodeActionParams{
347+
actions, err := r.server.CodeAction(r.ctx, &protocol.CodeActionParams{
347348
TextDocument: protocol.TextDocumentIdentifier{
348349
URI: protocol.NewURI(uri),
349350
},
@@ -354,7 +355,7 @@ func (r *runner) Import(t *testing.T, data tests.Imports) {
354355
}
355356
continue
356357
}
357-
_, m, err := getSourceFile(ctx, r.server.session.ViewOf(uri), uri)
358+
_, m, err := getSourceFile(r.ctx, r.server.session.ViewOf(uri), uri)
358359
if err != nil {
359360
t.Error(err)
360361
}
@@ -393,13 +394,13 @@ func (r *runner) Definition(t *testing.T, data tests.Definitions) {
393394
var locs []protocol.Location
394395
var hover *protocol.Hover
395396
if d.IsType {
396-
locs, err = r.server.TypeDefinition(context.Background(), params)
397+
locs, err = r.server.TypeDefinition(r.ctx, params)
397398
} else {
398-
locs, err = r.server.Definition(context.Background(), params)
399+
locs, err = r.server.Definition(r.ctx, params)
399400
if err != nil {
400401
t.Fatalf("failed for %v: %v", d.Src, err)
401402
}
402-
hover, err = r.server.Hover(context.Background(), params)
403+
hover, err = r.server.Hover(r.ctx, params)
403404
}
404405
if err != nil {
405406
t.Fatalf("failed for %v: %v", d.Src, err)
@@ -446,7 +447,7 @@ func (r *runner) Highlight(t *testing.T, data tests.Highlights) {
446447
TextDocument: protocol.TextDocumentIdentifier{URI: loc.URI},
447448
Position: loc.Range.Start,
448449
}
449-
highlights, err := r.server.DocumentHighlight(context.Background(), params)
450+
highlights, err := r.server.DocumentHighlight(r.ctx, params)
450451
if err != nil {
451452
t.Fatal(err)
452453
}
@@ -492,7 +493,7 @@ func (r *runner) Reference(t *testing.T, data tests.References) {
492493
Position: loc.Range.Start,
493494
},
494495
}
495-
got, err := r.server.References(context.Background(), params)
496+
got, err := r.server.References(r.ctx, params)
496497
if err != nil {
497498
t.Fatalf("failed for %v: %v", src, err)
498499
}
@@ -509,7 +510,6 @@ func (r *runner) Reference(t *testing.T, data tests.References) {
509510
}
510511

511512
func (r *runner) Rename(t *testing.T, data tests.Renames) {
512-
ctx := context.Background()
513513
for spn, newText := range data {
514514
tag := fmt.Sprintf("%s-rename", newText)
515515

@@ -524,7 +524,7 @@ func (r *runner) Rename(t *testing.T, data tests.Renames) {
524524
t.Fatalf("failed for %v: %v", spn, err)
525525
}
526526

527-
workspaceEdits, err := r.server.Rename(ctx, &protocol.RenameParams{
527+
workspaceEdits, err := r.server.Rename(r.ctx, &protocol.RenameParams{
528528
TextDocument: protocol.TextDocumentIdentifier{
529529
URI: protocol.NewURI(uri),
530530
},
@@ -544,7 +544,7 @@ func (r *runner) Rename(t *testing.T, data tests.Renames) {
544544
var res []string
545545
for uri, edits := range *workspaceEdits.Changes {
546546
spnURI := span.URI(uri)
547-
_, m, err := getSourceFile(ctx, r.server.session.ViewOf(span.URI(spnURI)), spnURI)
547+
_, m, err := getSourceFile(r.ctx, r.server.session.ViewOf(span.URI(spnURI)), spnURI)
548548
if err != nil {
549549
t.Error(err)
550550
}
@@ -612,7 +612,7 @@ func (r *runner) Symbol(t *testing.T, data tests.Symbols) {
612612
URI: string(uri),
613613
},
614614
}
615-
symbols, err := r.server.DocumentSymbol(context.Background(), params)
615+
symbols, err := r.server.DocumentSymbol(r.ctx, params)
616616
if err != nil {
617617
t.Fatal(err)
618618
}
@@ -688,7 +688,7 @@ func (r *runner) SignatureHelp(t *testing.T, data tests.Signatures) {
688688
if err != nil {
689689
t.Fatalf("failed for %v: %v", loc, err)
690690
}
691-
gotSignatures, err := r.server.SignatureHelp(context.Background(), &protocol.TextDocumentPositionParams{
691+
gotSignatures, err := r.server.SignatureHelp(r.ctx, &protocol.TextDocumentPositionParams{
692692
TextDocument: protocol.TextDocumentIdentifier{
693693
URI: protocol.NewURI(spn.URI()),
694694
},
@@ -754,7 +754,7 @@ func (r *runner) Link(t *testing.T, data tests.Links) {
754754
if err != nil {
755755
t.Fatal(err)
756756
}
757-
gotLinks, err := r.server.DocumentLink(context.Background(), &protocol.DocumentLinkParams{
757+
gotLinks, err := r.server.DocumentLink(r.ctx, &protocol.DocumentLinkParams{
758758
TextDocument: protocol.TextDocumentIdentifier{
759759
URI: protocol.NewURI(uri),
760760
},

internal/lsp/protocol/detatch.go

Lines changed: 0 additions & 21 deletions
This file was deleted.

internal/lsp/protocol/protocol.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,14 @@ import (
1010
"golang.org/x/tools/internal/jsonrpc2"
1111
"golang.org/x/tools/internal/lsp/telemetry/trace"
1212
"golang.org/x/tools/internal/lsp/xlog"
13+
"golang.org/x/tools/internal/xcontext"
1314
)
1415

1516
const defaultMessageBufferSize = 20
1617
const defaultRejectIfOverloaded = false
1718

1819
func canceller(ctx context.Context, conn *jsonrpc2.Conn, id jsonrpc2.ID) {
19-
ctx = detatchContext(ctx)
20+
ctx = xcontext.Detach(ctx)
2021
ctx, span := trace.StartSpan(ctx, "protocol.canceller")
2122
defer span.End()
2223
conn.Notify(ctx, "$/cancelRequest", &CancelParams{ID: id})

0 commit comments

Comments
 (0)