1
0
mirror of https://github.com/golang/go synced 2024-11-19 00:04:40 -07:00
go/internal/lsp/watched_files.go
Muir Manders 1f0dd0289f internal/lsp: start handling watched file change events
Now we register for and handle didChangeWatchedFiles "change"
events. We don't handle "create" or "delete" yet.

When a file changes on disk, there are two basic cases. If the editor
has the file open, we want to ignore the change since we need to
respect the file contents in the editor. If the file isn't open in the
editor then we need to re-type check (and re-diagnose) any packages it
belongs to.

We will need special handling of go.mod changes, but start with
just *.go files for now.

I'm putting the new behavior behind an initialization flag while it is
under development.

Updates golang/go#31553

Change-Id: I81a767ebe12f5f82657752dcdfb069c5820cbaa0
Reviewed-on: https://go-review.googlesource.com/c/tools/+/190857
Reviewed-by: Ian Cottrell <iancottrell@google.com>
Run-TryBot: Ian Cottrell <iancottrell@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
2019-08-26 19:00:32 +00:00

54 lines
1.3 KiB
Go

// Copyright 2019 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 lsp
import (
"context"
"golang.org/x/tools/internal/lsp/protocol"
"golang.org/x/tools/internal/span"
"golang.org/x/tools/internal/telemetry/log"
"golang.org/x/tools/internal/telemetry/tag"
)
func (s *Server) didChangeWatchedFiles(ctx context.Context, params *protocol.DidChangeWatchedFilesParams) error {
if !s.watchFileChanges {
return nil
}
for _, change := range params.Changes {
uri := span.NewURI(change.URI)
switch change.Type {
case protocol.Changed:
view := s.session.ViewOf(uri)
// If we have never seen this file before, there is nothing to do.
if view.FindFile(ctx, uri) == nil {
break
}
log.Print(ctx, "watched file changed", tag.Of("uri", uri))
// If client has this file open, don't do anything. The client's contents
// must remain the source of truth.
if s.session.IsOpen(uri) {
break
}
s.session.DidChangeOutOfBand(uri)
// Refresh diagnostics to reflect updated file contents.
s.Diagnostics(ctx, view, uri)
case protocol.Created:
log.Print(ctx, "watched file created", tag.Of("uri", uri))
case protocol.Deleted:
log.Print(ctx, "watched file deleted", tag.Of("uri", uri))
}
}
return nil
}