mirror of
https://github.com/golang/go
synced 2024-11-19 05:04:43 -07:00
1f0dd0289f
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>
54 lines
1.3 KiB
Go
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
|
|
}
|