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 <rstambler@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Ian Cottrell <iancottrell@google.com>
This commit is contained in:
parent
f98590f1bf
commit
d850aa06e8
|
@ -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 {
|
if f, _ := v.getFile(span.FileURI(filename)); f != nil {
|
||||||
gof, ok := f.(*goFile)
|
gof, ok := f.(*goFile)
|
||||||
if !ok {
|
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
|
continue
|
||||||
}
|
}
|
||||||
gof.meta = m
|
gof.meta = m
|
||||||
|
|
|
@ -54,6 +54,7 @@ func (f *fileBase) View() source.View {
|
||||||
func (f *fileBase) Content(ctx context.Context) *source.FileContent {
|
func (f *fileBase) Content(ctx context.Context) *source.FileContent {
|
||||||
f.view.mu.Lock()
|
f.view.mu.Lock()
|
||||||
defer f.view.mu.Unlock()
|
defer f.view.mu.Unlock()
|
||||||
|
|
||||||
f.read(ctx)
|
f.read(ctx)
|
||||||
return f.fc
|
return f.fc
|
||||||
}
|
}
|
||||||
|
|
|
@ -94,12 +94,11 @@ func (s *session) ViewOf(uri span.URI) source.View {
|
||||||
s.viewMu.Lock()
|
s.viewMu.Lock()
|
||||||
defer s.viewMu.Unlock()
|
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 {
|
if v, found := s.viewMap[uri]; found {
|
||||||
return v
|
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)
|
v := s.bestView(uri)
|
||||||
s.viewMap[uri] = v
|
s.viewMap[uri] = v
|
||||||
return v
|
return v
|
||||||
|
@ -175,13 +174,10 @@ func (s *session) IsOpen(uri span.URI) bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *session) ReadFile(uri span.URI) *source.FileContent {
|
func (s *session) ReadFile(uri span.URI) *source.FileContent {
|
||||||
s.overlayMu.Lock()
|
if overlay := s.readOverlay(uri); overlay != nil {
|
||||||
defer s.overlayMu.Unlock()
|
|
||||||
// We might have the content saved in an overlay.
|
|
||||||
if overlay, ok := s.overlays[uri]; ok {
|
|
||||||
return overlay
|
return overlay
|
||||||
}
|
}
|
||||||
// fall back to the cache level file system
|
// Fall back to the cache-level file system.
|
||||||
return s.Cache().ReadFile(uri)
|
return s.Cache().ReadFile(uri)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -191,6 +187,7 @@ func (s *session) SetOverlay(uri span.URI, data []byte) {
|
||||||
s.overlayMu.Unlock()
|
s.overlayMu.Unlock()
|
||||||
s.filesWatchMap.Notify(uri)
|
s.filesWatchMap.Notify(uri)
|
||||||
}()
|
}()
|
||||||
|
|
||||||
if data == nil {
|
if data == nil {
|
||||||
delete(s.overlays, uri)
|
delete(s.overlays, uri)
|
||||||
return
|
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 {
|
func (s *session) buildOverlay() map[string][]byte {
|
||||||
s.overlayMu.Lock()
|
s.overlayMu.Lock()
|
||||||
defer s.overlayMu.Unlock()
|
defer s.overlayMu.Unlock()
|
||||||
|
|
||||||
overlays := make(map[string][]byte)
|
overlays := make(map[string][]byte)
|
||||||
for uri, overlay := range s.overlays {
|
for uri, overlay := range s.overlays {
|
||||||
if overlay.Error != nil {
|
if overlay.Error != nil {
|
||||||
|
|
|
@ -36,7 +36,6 @@ type runner struct {
|
||||||
const viewName = "lsp_test"
|
const viewName = "lsp_test"
|
||||||
|
|
||||||
func testLSP(t *testing.T, exporter packagestest.Exporter) {
|
func testLSP(t *testing.T, exporter packagestest.Exporter) {
|
||||||
ctx := context.Background()
|
|
||||||
data := tests.Load(t, exporter, "testdata")
|
data := tests.Load(t, exporter, "testdata")
|
||||||
defer data.Exported.Cleanup()
|
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 := session.NewView(viewName, span.FileURI(data.Config.Dir))
|
||||||
view.SetEnv(data.Config.Env)
|
view.SetEnv(data.Config.Env)
|
||||||
for filename, content := range data.Config.Overlay {
|
for filename, content := range data.Config.Overlay {
|
||||||
view.SetContent(ctx, span.FileURI(filename), content)
|
session.SetOverlay(span.FileURI(filename), content)
|
||||||
}
|
}
|
||||||
r := &runner{
|
r := &runner{
|
||||||
server: &Server{
|
server: &Server{
|
||||||
|
|
|
@ -71,7 +71,7 @@ func getGoFile(ctx context.Context, v source.View, uri span.URI) (source.GoFile,
|
||||||
}
|
}
|
||||||
gof, ok := f.(source.GoFile)
|
gof, ok := f.(source.GoFile)
|
||||||
if !ok {
|
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
|
return gof, m, nil
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue