From d850aa06e894b69b09ba5701bd8d0cba5bd438aa Mon Sep 17 00:00:00 2001 From: Rebecca Stambler Date: Wed, 29 May 2019 14:37:11 -0400 Subject: [PATCH] internal/lsp: fix setting overlays in tests This change fixes the test failure that has appeared in a few TryBot runs. Change-Id: If583555250d63b7f446ec7d8eb09810b842633ae Reviewed-on: https://go-review.googlesource.com/c/tools/+/179437 Run-TryBot: Rebecca Stambler TryBot-Result: Gobot Gobot Reviewed-by: Ian Cottrell --- internal/lsp/cache/check.go | 2 +- internal/lsp/cache/file.go | 1 + internal/lsp/cache/session.go | 27 ++++++++++++++++++--------- internal/lsp/lsp_test.go | 3 +-- internal/lsp/util.go | 2 +- 5 files changed, 22 insertions(+), 13 deletions(-) diff --git a/internal/lsp/cache/check.go b/internal/lsp/cache/check.go index bc687755..e6d8c278 100644 --- a/internal/lsp/cache/check.go +++ b/internal/lsp/cache/check.go @@ -141,7 +141,7 @@ func (v *view) link(ctx context.Context, pkgPath string, pkg *packages.Package, if f, _ := v.getFile(span.FileURI(filename)); f != nil { gof, ok := f.(*goFile) if !ok { - v.Session().Logger().Errorf(ctx, "not a go file: %v", f.URI()) + v.Session().Logger().Errorf(ctx, "not a Go file: %v", f.URI()) continue } gof.meta = m diff --git a/internal/lsp/cache/file.go b/internal/lsp/cache/file.go index f71a15e5..36ec9e4e 100644 --- a/internal/lsp/cache/file.go +++ b/internal/lsp/cache/file.go @@ -54,6 +54,7 @@ func (f *fileBase) View() source.View { func (f *fileBase) Content(ctx context.Context) *source.FileContent { f.view.mu.Lock() defer f.view.mu.Unlock() + f.read(ctx) return f.fc } diff --git a/internal/lsp/cache/session.go b/internal/lsp/cache/session.go index aa4ea323..57735b2b 100644 --- a/internal/lsp/cache/session.go +++ b/internal/lsp/cache/session.go @@ -94,12 +94,11 @@ func (s *session) ViewOf(uri span.URI) source.View { s.viewMu.Lock() defer s.viewMu.Unlock() - // check if we already know this file + // Check if we already know this file. if v, found := s.viewMap[uri]; found { return v } - - // pick the best view for this file and memoize the result + // Pick the best view for this file and memoize the result. v := s.bestView(uri) s.viewMap[uri] = v return v @@ -131,7 +130,7 @@ func (s *session) bestView(uri span.URI) source.View { if longest != nil { return longest } - //TODO: are there any more heuristics we can use? + // TODO: are there any more heuristics we can use? return s.views[0] } @@ -175,13 +174,10 @@ func (s *session) IsOpen(uri span.URI) bool { } func (s *session) ReadFile(uri span.URI) *source.FileContent { - s.overlayMu.Lock() - defer s.overlayMu.Unlock() - // We might have the content saved in an overlay. - if overlay, ok := s.overlays[uri]; ok { + if overlay := s.readOverlay(uri); overlay != nil { return overlay } - // fall back to the cache level file system + // Fall back to the cache-level file system. return s.Cache().ReadFile(uri) } @@ -191,6 +187,7 @@ func (s *session) SetOverlay(uri span.URI, data []byte) { s.overlayMu.Unlock() s.filesWatchMap.Notify(uri) }() + if data == nil { delete(s.overlays, uri) return @@ -202,9 +199,21 @@ func (s *session) SetOverlay(uri span.URI, data []byte) { } } +func (s *session) readOverlay(uri span.URI) *source.FileContent { + s.overlayMu.Lock() + defer s.overlayMu.Unlock() + + // We might have the content saved in an overlay. + if overlay, ok := s.overlays[uri]; ok { + return overlay + } + return nil +} + func (s *session) buildOverlay() map[string][]byte { s.overlayMu.Lock() defer s.overlayMu.Unlock() + overlays := make(map[string][]byte) for uri, overlay := range s.overlays { if overlay.Error != nil { diff --git a/internal/lsp/lsp_test.go b/internal/lsp/lsp_test.go index 61156f25..d4a0d542 100644 --- a/internal/lsp/lsp_test.go +++ b/internal/lsp/lsp_test.go @@ -36,7 +36,6 @@ type runner struct { const viewName = "lsp_test" func testLSP(t *testing.T, exporter packagestest.Exporter) { - ctx := context.Background() data := tests.Load(t, exporter, "testdata") defer data.Exported.Cleanup() @@ -46,7 +45,7 @@ func testLSP(t *testing.T, exporter packagestest.Exporter) { view := session.NewView(viewName, span.FileURI(data.Config.Dir)) view.SetEnv(data.Config.Env) for filename, content := range data.Config.Overlay { - view.SetContent(ctx, span.FileURI(filename), content) + session.SetOverlay(span.FileURI(filename), content) } r := &runner{ server: &Server{ diff --git a/internal/lsp/util.go b/internal/lsp/util.go index 8acf535e..b931078e 100644 --- a/internal/lsp/util.go +++ b/internal/lsp/util.go @@ -71,7 +71,7 @@ func getGoFile(ctx context.Context, v source.View, uri span.URI) (source.GoFile, } gof, ok := f.(source.GoFile) if !ok { - return nil, nil, fmt.Errorf("not a go file %v", f.URI()) + return nil, nil, fmt.Errorf("not a Go file %v", f.URI()) } return gof, m, nil }