gopls/internal/lsp/protocol: LocationTextDocumentPositionParams

A helper function for populating LSP requests.

Change-Id: Id9cbca56f8e32321680ba8ee4d7073d097789784
Reviewed-on: https://go-review.googlesource.com/c/tools/+/463683
Reviewed-by: Robert Findley <rfindley@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
gopls-CI: kokoro <noreply+kokoro@google.com>
Run-TryBot: Alan Donovan <adonovan@google.com>
Auto-Submit: Alan Donovan <adonovan@google.com>
diff --git a/gopls/internal/lsp/cmd/call_hierarchy.go b/gopls/internal/lsp/cmd/call_hierarchy.go
index 9892fdf..eb5d29d 100644
--- a/gopls/internal/lsp/cmd/call_hierarchy.go
+++ b/gopls/internal/lsp/cmd/call_hierarchy.go
@@ -58,10 +58,7 @@
 	}
 
 	p := protocol.CallHierarchyPrepareParams{
-		TextDocumentPositionParams: protocol.TextDocumentPositionParams{
-			TextDocument: protocol.TextDocumentIdentifier{URI: loc.URI},
-			Position:     loc.Range.Start,
-		},
+		TextDocumentPositionParams: protocol.LocationTextDocumentPositionParams(loc),
 	}
 
 	callItems, err := conn.PrepareCallHierarchy(ctx, &p)
diff --git a/gopls/internal/lsp/cmd/definition.go b/gopls/internal/lsp/cmd/definition.go
index 269172d..952f43b 100644
--- a/gopls/internal/lsp/cmd/definition.go
+++ b/gopls/internal/lsp/cmd/definition.go
@@ -88,12 +88,8 @@
 	if err != nil {
 		return err
 	}
-	tdpp := protocol.TextDocumentPositionParams{
-		TextDocument: protocol.TextDocumentIdentifier{URI: loc.URI},
-		Position:     loc.Range.Start,
-	}
 	p := protocol.DefinitionParams{
-		TextDocumentPositionParams: tdpp,
+		TextDocumentPositionParams: protocol.LocationTextDocumentPositionParams(loc),
 	}
 	locs, err := conn.Definition(ctx, &p)
 	if err != nil {
@@ -104,7 +100,7 @@
 		return fmt.Errorf("%v: not an identifier", from)
 	}
 	q := protocol.HoverParams{
-		TextDocumentPositionParams: tdpp,
+		TextDocumentPositionParams: protocol.LocationTextDocumentPositionParams(loc),
 	}
 	hover, err := conn.Hover(ctx, &q)
 	if err != nil {
diff --git a/gopls/internal/lsp/cmd/highlight.go b/gopls/internal/lsp/cmd/highlight.go
index bcb7149..60c04b2 100644
--- a/gopls/internal/lsp/cmd/highlight.go
+++ b/gopls/internal/lsp/cmd/highlight.go
@@ -57,10 +57,7 @@
 	}
 
 	p := protocol.DocumentHighlightParams{
-		TextDocumentPositionParams: protocol.TextDocumentPositionParams{
-			TextDocument: protocol.TextDocumentIdentifier{URI: loc.URI},
-			Position:     loc.Range.Start,
-		},
+		TextDocumentPositionParams: protocol.LocationTextDocumentPositionParams(loc),
 	}
 	highlights, err := conn.DocumentHighlight(ctx, &p)
 	if err != nil {
diff --git a/gopls/internal/lsp/cmd/implementation.go b/gopls/internal/lsp/cmd/implementation.go
index eed41ab..bb5b1c2 100644
--- a/gopls/internal/lsp/cmd/implementation.go
+++ b/gopls/internal/lsp/cmd/implementation.go
@@ -58,12 +58,8 @@
 	}
 
 	p := protocol.ImplementationParams{
-		TextDocumentPositionParams: protocol.TextDocumentPositionParams{
-			TextDocument: protocol.TextDocumentIdentifier{URI: loc.URI},
-			Position:     loc.Range.Start,
-		},
+		TextDocumentPositionParams: protocol.LocationTextDocumentPositionParams(loc),
 	}
-
 	implementations, err := conn.Implementation(ctx, &p)
 	if err != nil {
 		return err
diff --git a/gopls/internal/lsp/cmd/prepare_rename.go b/gopls/internal/lsp/cmd/prepare_rename.go
index 774433d..5e9d732 100644
--- a/gopls/internal/lsp/cmd/prepare_rename.go
+++ b/gopls/internal/lsp/cmd/prepare_rename.go
@@ -60,10 +60,7 @@
 		return err
 	}
 	p := protocol.PrepareRenameParams{
-		TextDocumentPositionParams: protocol.TextDocumentPositionParams{
-			TextDocument: protocol.TextDocumentIdentifier{URI: loc.URI},
-			Position:     loc.Range.Start,
-		},
+		TextDocumentPositionParams: protocol.LocationTextDocumentPositionParams(loc),
 	}
 	result, err := conn.PrepareRename(ctx, &p)
 	if err != nil {
diff --git a/gopls/internal/lsp/cmd/references.go b/gopls/internal/lsp/cmd/references.go
index 533fcc1..6db5ce3 100644
--- a/gopls/internal/lsp/cmd/references.go
+++ b/gopls/internal/lsp/cmd/references.go
@@ -63,10 +63,7 @@
 		Context: protocol.ReferenceContext{
 			IncludeDeclaration: r.IncludeDeclaration,
 		},
-		TextDocumentPositionParams: protocol.TextDocumentPositionParams{
-			TextDocument: protocol.TextDocumentIdentifier{URI: loc.URI},
-			Position:     loc.Range.Start,
-		},
+		TextDocumentPositionParams: protocol.LocationTextDocumentPositionParams(loc),
 	}
 	locations, err := conn.References(ctx, &p)
 	if err != nil {
diff --git a/gopls/internal/lsp/cmd/signature.go b/gopls/internal/lsp/cmd/signature.go
index 2f34b9b..64c892e 100644
--- a/gopls/internal/lsp/cmd/signature.go
+++ b/gopls/internal/lsp/cmd/signature.go
@@ -56,14 +56,8 @@
 		return err
 	}
 
-	tdpp := protocol.TextDocumentPositionParams{
-		TextDocument: protocol.TextDocumentIdentifier{
-			URI: protocol.URIFromSpanURI(from.URI()),
-		},
-		Position: loc.Range.Start,
-	}
 	p := protocol.SignatureHelpParams{
-		TextDocumentPositionParams: tdpp,
+		TextDocumentPositionParams: protocol.LocationTextDocumentPositionParams(loc),
 	}
 
 	s, err := conn.SignatureHelp(ctx, &p)
diff --git a/gopls/internal/lsp/fake/editor.go b/gopls/internal/lsp/fake/editor.go
index 9a1f0dd..70d5e5e 100644
--- a/gopls/internal/lsp/fake/editor.go
+++ b/gopls/internal/lsp/fake/editor.go
@@ -1047,10 +1047,7 @@
 		return nil, fmt.Errorf("buffer %q is not open", path)
 	}
 	params := &protocol.CompletionParams{
-		TextDocumentPositionParams: protocol.TextDocumentPositionParams{
-			TextDocument: e.TextDocumentIdentifier(path),
-			Position:     loc.Range.Start,
-		},
+		TextDocumentPositionParams: protocol.LocationTextDocumentPositionParams(loc),
 	}
 	completions, err := e.Server.Completion(ctx, params)
 	if err != nil {
@@ -1122,10 +1119,7 @@
 		return nil, fmt.Errorf("buffer %q is not open", path)
 	}
 	params := &protocol.ReferenceParams{
-		TextDocumentPositionParams: protocol.TextDocumentPositionParams{
-			TextDocument: e.TextDocumentIdentifier(path),
-			Position:     loc.Range.Start,
-		},
+		TextDocumentPositionParams: protocol.LocationTextDocumentPositionParams(loc),
 		Context: protocol.ReferenceContext{
 			IncludeDeclaration: true,
 		},
@@ -1185,10 +1179,7 @@
 		return nil, fmt.Errorf("buffer %q is not open", path)
 	}
 	params := &protocol.ImplementationParams{
-		TextDocumentPositionParams: protocol.TextDocumentPositionParams{
-			TextDocument: e.TextDocumentIdentifier(path),
-			Position:     loc.Range.Start,
-		},
+		TextDocumentPositionParams: protocol.LocationTextDocumentPositionParams(loc),
 	}
 	return e.Server.Implementation(ctx, params)
 }
diff --git a/gopls/internal/lsp/lsp_test.go b/gopls/internal/lsp/lsp_test.go
index 212ba0f..5290e61 100644
--- a/gopls/internal/lsp/lsp_test.go
+++ b/gopls/internal/lsp/lsp_test.go
@@ -154,10 +154,7 @@
 	}
 
 	params := &protocol.CallHierarchyPrepareParams{
-		TextDocumentPositionParams: protocol.TextDocumentPositionParams{
-			TextDocument: protocol.TextDocumentIdentifier{URI: loc.URI},
-			Position:     loc.Range.Start,
-		},
+		TextDocumentPositionParams: protocol.LocationTextDocumentPositionParams(loc),
 	}
 
 	items, err := r.server.PrepareCallHierarchy(r.ctx, params)
@@ -678,10 +675,7 @@
 	if err != nil {
 		t.Fatalf("failed for %v: %v", d.Src, err)
 	}
-	tdpp := protocol.TextDocumentPositionParams{
-		TextDocument: protocol.TextDocumentIdentifier{URI: loc.URI},
-		Position:     loc.Range.Start,
-	}
+	tdpp := protocol.LocationTextDocumentPositionParams(loc)
 	var locs []protocol.Location
 	var hover *protocol.Hover
 	if d.IsType {
@@ -749,10 +743,7 @@
 		t.Fatal(err)
 	}
 	gotImpls, err := r.server.Implementation(r.ctx, &protocol.ImplementationParams{
-		TextDocumentPositionParams: protocol.TextDocumentPositionParams{
-			TextDocument: protocol.TextDocumentIdentifier{URI: loc.URI},
-			Position:     loc.Range.Start,
-		},
+		TextDocumentPositionParams: protocol.LocationTextDocumentPositionParams(loc),
 	})
 	if err != nil {
 		t.Fatalf("Server.Implementation(%s): %v", spn, err)
@@ -780,17 +771,8 @@
 	if err != nil {
 		t.Fatal(err)
 	}
-	tdpp := protocol.TextDocumentPositionParams{
-		TextDocument: protocol.TextDocumentIdentifier{
-			URI: loc.URI,
-		},
-		Position: loc.Range.Start,
-	}
-	if err != nil {
-		t.Fatalf("Mapper.SpanDocumentPosition(%v) failed: %v", src, err)
-	}
 	params := &protocol.DocumentHighlightParams{
-		TextDocumentPositionParams: tdpp,
+		TextDocumentPositionParams: protocol.LocationTextDocumentPositionParams(loc),
 	}
 	highlights, err := r.server.DocumentHighlight(r.ctx, params)
 	if err != nil {
@@ -833,12 +815,8 @@
 	if err != nil {
 		t.Fatalf("failed for %v", err)
 	}
-	tdpp := protocol.TextDocumentPositionParams{
-		TextDocument: protocol.TextDocumentIdentifier{URI: loc.URI},
-		Position:     loc.Range.Start,
-	}
 	params := &protocol.HoverParams{
-		TextDocumentPositionParams: tdpp,
+		TextDocumentPositionParams: protocol.LocationTextDocumentPositionParams(loc),
 	}
 	hover, err := r.server.Hover(r.ctx, params)
 	if err != nil {
@@ -894,10 +872,7 @@
 				want[loc] = true
 			}
 			params := &protocol.ReferenceParams{
-				TextDocumentPositionParams: protocol.TextDocumentPositionParams{
-					TextDocument: protocol.TextDocumentIdentifier{URI: loc.URI},
-					Position:     loc.Range.Start,
-				},
+				TextDocumentPositionParams: protocol.LocationTextDocumentPositionParams(loc),
 				Context: protocol.ReferenceContext{
 					IncludeDeclaration: includeDeclaration,
 				},
@@ -1065,12 +1040,8 @@
 	if err != nil {
 		t.Fatalf("failed for %v: %v", src, err)
 	}
-	tdpp := protocol.TextDocumentPositionParams{
-		TextDocument: protocol.TextDocumentIdentifier{URI: loc.URI},
-		Position:     loc.Range.Start,
-	}
 	params := &protocol.PrepareRenameParams{
-		TextDocumentPositionParams: tdpp,
+		TextDocumentPositionParams: protocol.LocationTextDocumentPositionParams(loc),
 	}
 	got, err := r.server.PrepareRename(context.Background(), params)
 	if err != nil {
@@ -1206,14 +1177,8 @@
 	if err != nil {
 		t.Fatalf("failed for %v: %v", loc, err)
 	}
-	tdpp := protocol.TextDocumentPositionParams{
-		TextDocument: protocol.TextDocumentIdentifier{
-			URI: protocol.URIFromSpanURI(spn.URI()),
-		},
-		Position: loc.Range.Start,
-	}
 	params := &protocol.SignatureHelpParams{
-		TextDocumentPositionParams: tdpp,
+		TextDocumentPositionParams: protocol.LocationTextDocumentPositionParams(loc),
 	}
 	got, err := r.server.SignatureHelp(r.ctx, params)
 	if err != nil {
diff --git a/gopls/internal/lsp/protocol/mapper.go b/gopls/internal/lsp/protocol/mapper.go
index e1e2578..63f28d1 100644
--- a/gopls/internal/lsp/protocol/mapper.go
+++ b/gopls/internal/lsp/protocol/mapper.go
@@ -502,3 +502,11 @@
 func (mr MappedRange) String() string {
 	return fmt.Sprint(mr.Span())
 }
+
+// LocationTextDocumentPositionParams converts its argument to its result.
+func LocationTextDocumentPositionParams(loc Location) TextDocumentPositionParams {
+	return TextDocumentPositionParams{
+		TextDocument: TextDocumentIdentifier{URI: loc.URI},
+		Position:     loc.Range.Start,
+	}
+}
diff --git a/gopls/internal/regtest/misc/rename_test.go b/gopls/internal/regtest/misc/rename_test.go
index 833d3db..ba5cf7a 100644
--- a/gopls/internal/regtest/misc/rename_test.go
+++ b/gopls/internal/regtest/misc/rename_test.go
@@ -35,13 +35,8 @@
 	Run(t, files, func(t *testing.T, env *Env) {
 		env.OpenFile("main.go")
 		loc := env.RegexpSearch("main.go", `main`)
-		// TODO(adonovan): define a helper from Location to TextDocumentPositionParams.
-		tdpp := protocol.TextDocumentPositionParams{
-			TextDocument: env.Editor.TextDocumentIdentifier("main.go"),
-			Position:     loc.Range.Start,
-		}
 		params := &protocol.PrepareRenameParams{
-			TextDocumentPositionParams: tdpp,
+			TextDocumentPositionParams: protocol.LocationTextDocumentPositionParams(loc),
 		}
 		_, err := env.Editor.Server.PrepareRename(env.Ctx, params)
 		if err == nil {
@@ -142,12 +137,8 @@
 	const wantErr = "can't rename package: missing module information for package"
 	Run(t, files, func(t *testing.T, env *Env) {
 		loc := env.RegexpSearch("lib/a.go", "lib")
-		tdpp := protocol.TextDocumentPositionParams{
-			TextDocument: env.Editor.TextDocumentIdentifier("lib/a.go"),
-			Position:     loc.Range.Start,
-		}
 		params := &protocol.PrepareRenameParams{
-			TextDocumentPositionParams: tdpp,
+			TextDocumentPositionParams: protocol.LocationTextDocumentPositionParams(loc),
 		}
 		_, err := env.Editor.Server.PrepareRename(env.Ctx, params)
 		if err == nil || !strings.Contains(err.Error(), wantErr) {