From e6ce0ddf03215642dccfd6f6193d16f0408bd310 Mon Sep 17 00:00:00 2001 From: Rebecca Stambler Date: Fri, 7 Jun 2019 11:34:41 -0400 Subject: [PATCH] internal/lsp: add an implementation for textDocument/didSave This change marks the overlay for a saved file as "on disk". This will reduce the number of overlays we provide to go/packages, which can be expensive. Updates golang/go#31796, golang/go#32457 Change-Id: I8e69503ab80bba29caf4e42491d87e643bf17f1a Reviewed-on: https://go-review.googlesource.com/c/tools/+/181123 Reviewed-by: Ian Cottrell Reviewed-by: Peter Weinberger --- internal/lsp/cache/session.go | 13 +++++++++++++ internal/lsp/text_synchronization.go | 5 ++--- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/internal/lsp/cache/session.go b/internal/lsp/cache/session.go index 4dd169fc..2c3b2422 100644 --- a/internal/lsp/cache/session.go +++ b/internal/lsp/cache/session.go @@ -42,6 +42,10 @@ type overlay struct { uri span.URI data []byte hash string + + // onDisk is true if a file has been saved on disk, + // and therefore does not need to be part of the overlay sent to go/packages. + onDisk bool } func (s *session) Shutdown(ctx context.Context) { @@ -181,6 +185,12 @@ func (s *session) DidOpen(uri span.URI) { } func (s *session) DidSave(uri span.URI) { + s.overlayMu.Lock() + defer s.overlayMu.Unlock() + + if overlay, ok := s.overlays[uri]; ok { + overlay.onDisk = true + } } func (s *session) DidClose(uri span.URI) { @@ -236,6 +246,9 @@ func (s *session) buildOverlay() map[string][]byte { overlays := make(map[string][]byte) for uri, overlay := range s.overlays { + if overlay.onDisk { + continue + } if filename, err := uri.Filename(); err == nil { overlays[filename] = overlay.data } diff --git a/internal/lsp/text_synchronization.go b/internal/lsp/text_synchronization.go index edf7dfa7..55176198 100644 --- a/internal/lsp/text_synchronization.go +++ b/internal/lsp/text_synchronization.go @@ -100,9 +100,8 @@ func (s *Server) applyChanges(ctx context.Context, params *protocol.DidChangeTex } func (s *Server) didSave(ctx context.Context, params *protocol.DidSaveTextDocumentParams) error { - uri := span.NewURI(params.TextDocument.URI) - s.session.DidSave(uri) - return nil // ignore + s.session.DidSave(span.NewURI(params.TextDocument.URI)) + return nil } func (s *Server) didClose(ctx context.Context, params *protocol.DidCloseTextDocumentParams) error {