forked from golang/tools
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
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
- Loading branch information
Showing
5 changed files
with
118 additions
and
15 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
// 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 { | ||
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 | ||
} |