From ad473c03aa65297ab7b5c17f80d284b6a8d96504 Mon Sep 17 00:00:00 2001 From: Rohan Challa Date: Tue, 10 Dec 2019 11:51:34 -0500 Subject: [PATCH] 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 Run-TryBot: Rohan Challa TryBot-Result: Gobot Gobot --- internal/lsp/cache/snapshot.go | 5 +++++ internal/lsp/completion.go | 13 +++++++++++-- internal/lsp/definition.go | 6 ++++++ internal/lsp/folding_range.go | 10 +++++++++- internal/lsp/format.go | 14 +++++++++++++- internal/lsp/highlight.go | 10 +++++++++- internal/lsp/hover.go | 3 +++ internal/lsp/implementation.go | 5 +++-- internal/lsp/link.go | 7 +++++-- internal/lsp/references.go | 5 ++++- internal/lsp/rename.go | 8 +++++++- internal/lsp/signature_help.go | 3 +++ internal/lsp/symbols.go | 10 +++++++++- 13 files changed, 87 insertions(+), 12 deletions(-) diff --git a/internal/lsp/cache/snapshot.go b/internal/lsp/cache/snapshot.go index d18ae9d0cd..6fa803005d 100644 --- a/internal/lsp/cache/snapshot.go +++ b/internal/lsp/cache/snapshot.go @@ -62,6 +62,11 @@ func (s *snapshot) View() source.View { } 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 cc6aa87726..b4634dedf6 100644 --- a/internal/lsp/completion.go +++ b/internal/lsp/completion.go @@ -28,8 +28,17 @@ func (s *Server) completion(ctx context.Context, params *protocol.CompletionPara 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 ab2b44223d..df75d22c65 100644 --- a/internal/lsp/definition.go +++ b/internal/lsp/definition.go @@ -23,6 +23,9 @@ func (s *Server) definition(ctx context.Context, params *protocol.DefinitionPara 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 @@ func (s *Server) typeDefinition(ctx context.Context, params *protocol.TypeDefini 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 3800e62d92..f3eede0797 100644 --- a/internal/lsp/folding_range.go +++ b/internal/lsp/folding_range.go @@ -19,7 +19,15 @@ func (s *Server) foldingRange(ctx context.Context, params *protocol.FoldingRange 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 67c668e43f..51c7bcb952 100644 --- a/internal/lsp/format.go +++ b/internal/lsp/format.go @@ -23,5 +23,17 @@ func (s *Server) formatting(ctx context.Context, params *protocol.DocumentFormat 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 52a246c25e..59874f51bb 100644 --- a/internal/lsp/highlight.go +++ b/internal/lsp/highlight.go @@ -25,7 +25,15 @@ func (s *Server) documentHighlight(ctx context.Context, params *protocol.Documen 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 b8ab7025ce..cc0c3ba8c5 100644 --- a/internal/lsp/hover.go +++ b/internal/lsp/hover.go @@ -26,6 +26,9 @@ func (s *Server) hover(ctx context.Context, params *protocol.HoverParams) (*prot 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 010be7da43..37faeaf0aa 100644 --- a/internal/lsp/implementation.go +++ b/internal/lsp/implementation.go @@ -25,12 +25,13 @@ func (s *Server) implementation(ctx context.Context, params *protocol.Implementa 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 90d152fb34..777b91ee22 100644 --- a/internal/lsp/link.go +++ b/internal/lsp/link.go @@ -32,6 +32,9 @@ func (s *Server) documentLink(ctx context.Context, params *protocol.DocumentLink 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 @@ func findLinksInString(src string, pos token.Pos, view source.View, mapper *prot 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 ea6754b5a1..675889bdfe 100644 --- a/internal/lsp/references.go +++ b/internal/lsp/references.go @@ -26,9 +26,12 @@ func (s *Server) references(ctx context.Context, params *protocol.ReferenceParam 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 18f9c79464..96f3f4f25a 100644 --- a/internal/lsp/rename.go +++ b/internal/lsp/rename.go @@ -23,9 +23,12 @@ func (s *Server) rename(ctx context.Context, params *protocol.RenameParams) (*pr 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 @@ func (s *Server) prepareRename(ctx context.Context, params *protocol.PrepareRena 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 52f8a7a9ab..3068c3abc1 100644 --- a/internal/lsp/signature_help.go +++ b/internal/lsp/signature_help.go @@ -25,6 +25,9 @@ func (s *Server) signatureHelp(ctx context.Context, params *protocol.SignatureHe 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 00b441c92b..0855ace928 100644 --- a/internal/lsp/symbols.go +++ b/internal/lsp/symbols.go @@ -29,7 +29,15 @@ func (s *Server) documentSymbol(ctx context.Context, params *protocol.DocumentSy 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