internal/lsp: add handling for go.mod files in internal/lsp functions
When we are processing a go.mod file, we are calling go/packages.load
when we should not be. It will always return 0 packages since it is
not a .go file. This CL adds branching inside each internal/lsp protocol
function and also adds a check in snapshot.PackageHandles for the file type
and returns an error. This will prevent `go list` from running on go.mod files for now.
Updates golang/go#31999
Change-Id: Ic6d0e9b7c81e1f404342b98e10b9c5387adde2ee
Reviewed-on: https://go-review.googlesource.com/c/tools/+/210757
Reviewed-by: Rebecca Stambler <rstambler@golang.org>
Run-TryBot: Rohan Challa <rohan@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
diff --git a/internal/lsp/cache/snapshot.go b/internal/lsp/cache/snapshot.go
index d18ae9d..6fa8030 100644
--- a/internal/lsp/cache/snapshot.go
+++ b/internal/lsp/cache/snapshot.go
@@ -62,6 +62,11 @@
}
func (s *snapshot) PackageHandles(ctx context.Context, fh source.FileHandle) ([]source.PackageHandle, error) {
+ // If the file is a go.mod file, go.Packages.Load will always return 0 packages.
+ if fh.Identity().Kind == source.Mod {
+ return nil, errors.Errorf("attempting to get PackageHandles of .mod file %s", fh.Identity().URI)
+ }
+
ctx = telemetry.File.With(ctx, fh.Identity().URI)
meta := s.getMetadataForURI(fh.Identity().URI)
// Determine if we need to type-check the package.
diff --git a/internal/lsp/completion.go b/internal/lsp/completion.go
index cc6aa87..b4634de 100644
--- a/internal/lsp/completion.go
+++ b/internal/lsp/completion.go
@@ -28,8 +28,17 @@
if err != nil {
return nil, err
}
- options.Completion.FullDocumentation = options.HoverKind == source.FullDocumentation
- candidates, surrounding, err := source.Completion(ctx, snapshot, f, params.Position, options.Completion)
+
+ var candidates []source.CompletionItem
+ var surrounding *source.Selection
+ switch f.Kind() {
+ case source.Go:
+ options.Completion.FullDocumentation = options.HoverKind == source.FullDocumentation
+ candidates, surrounding, err = source.Completion(ctx, snapshot, f, params.Position, options.Completion)
+ case source.Mod:
+ candidates, surrounding = nil, nil
+ }
+
if err != nil {
log.Print(ctx, "no completions found", tag.Of("At", params.Position), tag.Of("Failure", err))
}
diff --git a/internal/lsp/definition.go b/internal/lsp/definition.go
index ab2b442..df75d22 100644
--- a/internal/lsp/definition.go
+++ b/internal/lsp/definition.go
@@ -23,6 +23,9 @@
if err != nil {
return nil, err
}
+ if f.Kind() != source.Go {
+ return nil, nil
+ }
ident, err := source.Identifier(ctx, snapshot, f, params.Position, source.WidestCheckPackageHandle)
if err != nil {
return nil, err
@@ -50,6 +53,9 @@
if err != nil {
return nil, err
}
+ if f.Kind() != source.Go {
+ return nil, nil
+ }
ident, err := source.Identifier(ctx, snapshot, f, params.Position, source.WidestCheckPackageHandle)
if err != nil {
return nil, err
diff --git a/internal/lsp/folding_range.go b/internal/lsp/folding_range.go
index 3800e62..f3eede0 100644
--- a/internal/lsp/folding_range.go
+++ b/internal/lsp/folding_range.go
@@ -19,7 +19,15 @@
if err != nil {
return nil, err
}
- ranges, err := source.FoldingRange(ctx, snapshot, f, view.Options().LineFoldingOnly)
+
+ var ranges []*source.FoldingRangeInfo
+ switch f.Kind() {
+ case source.Go:
+ ranges, err = source.FoldingRange(ctx, snapshot, f, view.Options().LineFoldingOnly)
+ case source.Mod:
+ ranges = nil
+ }
+
if err != nil {
return nil, err
}
diff --git a/internal/lsp/format.go b/internal/lsp/format.go
index 67c668e..51c7bcb 100644
--- a/internal/lsp/format.go
+++ b/internal/lsp/format.go
@@ -23,5 +23,17 @@
if err != nil {
return nil, err
}
- return source.Format(ctx, snapshot, f)
+
+ var edits []protocol.TextEdit
+ switch f.Kind() {
+ case source.Go:
+ edits, err = source.Format(ctx, snapshot, f)
+ case source.Mod:
+ return nil, nil
+ }
+
+ if err != nil {
+ return nil, err
+ }
+ return edits, nil
}
diff --git a/internal/lsp/highlight.go b/internal/lsp/highlight.go
index 52a246c..59874f5 100644
--- a/internal/lsp/highlight.go
+++ b/internal/lsp/highlight.go
@@ -25,7 +25,15 @@
if err != nil {
return nil, err
}
- rngs, err := source.Highlight(ctx, snapshot, f, params.Position)
+
+ var rngs []protocol.Range
+ switch f.Kind() {
+ case source.Go:
+ rngs, err = source.Highlight(ctx, snapshot, f, params.Position)
+ case source.Mod:
+ return nil, nil
+ }
+
if err != nil {
log.Error(ctx, "no highlight", err, telemetry.URI.Of(uri))
}
diff --git a/internal/lsp/hover.go b/internal/lsp/hover.go
index b8ab702..cc0c3ba 100644
--- a/internal/lsp/hover.go
+++ b/internal/lsp/hover.go
@@ -26,6 +26,9 @@
if err != nil {
return nil, err
}
+ if f.Kind() != source.Go {
+ return nil, nil
+ }
ident, err := source.Identifier(ctx, snapshot, f, params.Position, source.WidestCheckPackageHandle)
if err != nil {
return nil, nil
diff --git a/internal/lsp/implementation.go b/internal/lsp/implementation.go
index 010be7d..37faeaf 100644
--- a/internal/lsp/implementation.go
+++ b/internal/lsp/implementation.go
@@ -25,12 +25,13 @@
if err != nil {
return nil, err
}
-
+ if f.Kind() != source.Go {
+ return nil, nil
+ }
phs, err := snapshot.PackageHandles(ctx, snapshot.Handle(ctx, f))
if err != nil {
return nil, err
}
-
var (
allLocs []protocol.Location
seen = make(map[protocol.Location]bool)
diff --git a/internal/lsp/link.go b/internal/lsp/link.go
index 90d152f..777b91e 100644
--- a/internal/lsp/link.go
+++ b/internal/lsp/link.go
@@ -32,6 +32,9 @@
return nil, err
}
fh := view.Snapshot().Handle(ctx, f)
+ if fh.Identity().Kind == source.Mod {
+ return nil, nil
+ }
file, m, _, err := view.Session().Cache().ParseGoHandle(fh, source.ParseFull).Parse(ctx)
if err != nil {
return nil, err
@@ -98,8 +101,8 @@
end := urlIndex[1]
startPos := token.Pos(int(pos) + start)
endPos := token.Pos(int(pos) + end)
- target = src[start:end]
- l, err := toProtocolLink(view, mapper, target, startPos, endPos)
+ target = src[start:end]
+ l, err := toProtocolLink(view, mapper, target, startPos, endPos)
if err != nil {
return nil, err
}
diff --git a/internal/lsp/references.go b/internal/lsp/references.go
index ea6754b..675889b 100644
--- a/internal/lsp/references.go
+++ b/internal/lsp/references.go
@@ -26,9 +26,12 @@
return nil, err
}
// Find all references to the identifier at the position.
+ if f.Kind() != source.Go {
+ return nil, nil
+ }
ident, err := source.Identifier(ctx, snapshot, f, params.Position, source.WidestCheckPackageHandle)
if err != nil {
- return nil, err
+ return nil, nil
}
references, err := ident.References(ctx)
if err != nil {
diff --git a/internal/lsp/rename.go b/internal/lsp/rename.go
index 18f9c79..96f3f4f 100644
--- a/internal/lsp/rename.go
+++ b/internal/lsp/rename.go
@@ -23,9 +23,12 @@
if err != nil {
return nil, err
}
+ if f.Kind() != source.Go {
+ return nil, nil
+ }
ident, err := source.Identifier(ctx, snapshot, f, params.Position, source.WidestCheckPackageHandle)
if err != nil {
- return nil, err
+ return nil, nil
}
edits, err := ident.Rename(ctx, params.NewName)
if err != nil {
@@ -56,6 +59,9 @@
if err != nil {
return nil, err
}
+ if f.Kind() != source.Go {
+ return nil, nil
+ }
ident, err := source.Identifier(ctx, snapshot, f, params.Position, source.WidestCheckPackageHandle)
if err != nil {
return nil, nil // ignore errors
diff --git a/internal/lsp/signature_help.go b/internal/lsp/signature_help.go
index 52f8a7a..3068c3a 100644
--- a/internal/lsp/signature_help.go
+++ b/internal/lsp/signature_help.go
@@ -25,6 +25,9 @@
if err != nil {
return nil, err
}
+ if f.Kind() != source.Go {
+ return nil, nil
+ }
info, err := source.SignatureHelp(ctx, snapshot, f, params.Position)
if err != nil {
log.Print(ctx, "no signature help", tag.Of("At", params.Position), tag.Of("Failure", err))
diff --git a/internal/lsp/symbols.go b/internal/lsp/symbols.go
index 00b441c..0855ace 100644
--- a/internal/lsp/symbols.go
+++ b/internal/lsp/symbols.go
@@ -29,7 +29,15 @@
if err != nil {
return nil, err
}
- symbols, err := source.DocumentSymbols(ctx, snapshot, f)
+
+ var symbols []protocol.DocumentSymbol
+ switch f.Kind() {
+ case source.Go:
+ symbols, err = source.DocumentSymbols(ctx, snapshot, f)
+ case source.Mod:
+ return []protocol.DocumentSymbol{}, nil
+ }
+
if err != nil {
log.Error(ctx, "DocumentSymbols failed", err, telemetry.URI.Of(uri))
return []protocol.DocumentSymbol{}, nil