mirror of
https://github.com/golang/go
synced 2024-11-05 16:16:11 -07:00
internal/lsp/cache: don't invalidate dependents' metadata
Rerun of CL 210458. Only invalidate metadata for packages directly involving the changed file. Change-Id: Id28647851254a9bdcb3dbe7a762194bb025da913 Reviewed-on: https://go-review.googlesource.com/c/tools/+/211779 Run-TryBot: Heschi Kreinick <heschi@google.com> Reviewed-by: Rebecca Stambler <rstambler@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
parent
6f9e13bbec
commit
bc4a8d3946
24
internal/lsp/cache/snapshot.go
vendored
24
internal/lsp/cache/snapshot.go
vendored
@ -464,17 +464,17 @@ func (s *snapshot) clone(ctx context.Context, withoutFile source.File) *snapshot
|
|||||||
s.mu.Lock()
|
s.mu.Lock()
|
||||||
defer s.mu.Unlock()
|
defer s.mu.Unlock()
|
||||||
|
|
||||||
toInvalidate := map[packageID]struct{}{}
|
directIDs := map[packageID]struct{}{}
|
||||||
// Collect all of the package IDs that correspond to the given file.
|
// Collect all of the package IDs that correspond to the given file.
|
||||||
// TODO: if the file has moved into a new package, we should invalidate that too.
|
// TODO: if the file has moved into a new package, we should invalidate that too.
|
||||||
for _, id := range s.ids[withoutFile.URI()] {
|
for _, id := range s.ids[withoutFile.URI()] {
|
||||||
toInvalidate[id] = struct{}{}
|
directIDs[id] = struct{}{}
|
||||||
}
|
}
|
||||||
|
|
||||||
// If we are invalidating a go.mod file then we should invalidate all of the packages in the module
|
// If we are invalidating a go.mod file then we should invalidate all of the packages in the module
|
||||||
if withoutFile.Kind() == source.Mod {
|
if withoutFile.Kind() == source.Mod {
|
||||||
for id := range s.workspacePackages {
|
for id := range s.workspacePackages {
|
||||||
toInvalidate[id] = struct{}{}
|
directIDs[id] = struct{}{}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -492,7 +492,7 @@ func (s *snapshot) clone(ctx context.Context, withoutFile source.File) *snapshot
|
|||||||
if fdirStat, err := os.Stat(dir(uri.Filename())); err == nil {
|
if fdirStat, err := os.Stat(dir(uri.Filename())); err == nil {
|
||||||
if os.SameFile(dirStat, fdirStat) {
|
if os.SameFile(dirStat, fdirStat) {
|
||||||
for _, id := range s.ids[uri] {
|
for _, id := range s.ids[uri] {
|
||||||
toInvalidate[id] = struct{}{}
|
directIDs[id] = struct{}{}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -502,21 +502,22 @@ func (s *snapshot) clone(ctx context.Context, withoutFile source.File) *snapshot
|
|||||||
|
|
||||||
// If there is no known FileHandle and no known IDs for the given file,
|
// If there is no known FileHandle and no known IDs for the given file,
|
||||||
// there is nothing to invalidate.
|
// there is nothing to invalidate.
|
||||||
if len(toInvalidate) == 0 && originalFH == nil {
|
if len(directIDs) == 0 && originalFH == nil {
|
||||||
// TODO(heschi): clone anyway? Seems like this is just setting us up for trouble.
|
// TODO(heschi): clone anyway? Seems like this is just setting us up for trouble.
|
||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
|
|
||||||
// Invalidate reverse dependencies too.
|
// Invalidate reverse dependencies too.
|
||||||
// TODO(heschi): figure out the locking model and use transitiveReverseDeps?
|
// TODO(heschi): figure out the locking model and use transitiveReverseDeps?
|
||||||
|
transitiveIDs := make(map[packageID]struct{})
|
||||||
var addRevDeps func(packageID)
|
var addRevDeps func(packageID)
|
||||||
addRevDeps = func(id packageID) {
|
addRevDeps = func(id packageID) {
|
||||||
toInvalidate[id] = struct{}{}
|
transitiveIDs[id] = struct{}{}
|
||||||
for _, rid := range s.getImportedByLocked(id) {
|
for _, rid := range s.getImportedByLocked(id) {
|
||||||
addRevDeps(rid)
|
addRevDeps(rid)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for id := range toInvalidate {
|
for id := range directIDs {
|
||||||
addRevDeps(id)
|
addRevDeps(id)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -544,14 +545,14 @@ func (s *snapshot) clone(ctx context.Context, withoutFile source.File) *snapshot
|
|||||||
}
|
}
|
||||||
// Copy the package type information.
|
// Copy the package type information.
|
||||||
for k, v := range s.packages {
|
for k, v := range s.packages {
|
||||||
if _, ok := toInvalidate[k.id]; ok {
|
if _, ok := transitiveIDs[k.id]; ok {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
result.packages[k] = v
|
result.packages[k] = v
|
||||||
}
|
}
|
||||||
// Copy the package analysis information.
|
// Copy the package analysis information.
|
||||||
for k, v := range s.actions {
|
for k, v := range s.actions {
|
||||||
if _, ok := toInvalidate[k.pkg.id]; ok {
|
if _, ok := transitiveIDs[k.pkg.id]; ok {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
result.actions[k] = v
|
result.actions[k] = v
|
||||||
@ -568,9 +569,10 @@ func (s *snapshot) clone(ctx context.Context, withoutFile source.File) *snapshot
|
|||||||
// and if so, invalidate this file's packages' metadata.
|
// and if so, invalidate this file's packages' metadata.
|
||||||
invalidateMetadata := s.view.session.cache.shouldLoad(ctx, s, originalFH, currentFH)
|
invalidateMetadata := s.view.session.cache.shouldLoad(ctx, s, originalFH, currentFH)
|
||||||
|
|
||||||
// Copy the package metadata.
|
// Copy the package metadata. We only need to invalidate packages directly
|
||||||
|
// containing the affected file, and only if it changed in a relevant way.
|
||||||
for k, v := range s.metadata {
|
for k, v := range s.metadata {
|
||||||
if _, ok := toInvalidate[k]; invalidateMetadata && ok {
|
if _, ok := directIDs[k]; invalidateMetadata && ok {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
result.metadata[k] = v
|
result.metadata[k] = v
|
||||||
|
Loading…
Reference in New Issue
Block a user