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