blob: 6c962bf3f81b0099ae564cee81b52bc552749063 [file] [log] [blame]
// 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 {
options := s.session.Options()
if !options.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
}