internal/lsp: separate out getMapper function

This is a super minimal change that will simplify the diffs for when I
actually delete the getMapper function.

Change-Id: I16984b344c87b3645fd451668b6ea747c5be12ab
Reviewed-on: https://go-review.googlesource.com/c/tools/+/190557
Run-TryBot: Rebecca Stambler <rstambler@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Cottrell <iancottrell@google.com>
diff --git a/internal/lsp/code_action.go b/internal/lsp/code_action.go
index fe8eef6..3491e36 100644
--- a/internal/lsp/code_action.go
+++ b/internal/lsp/code_action.go
@@ -21,7 +21,11 @@
 func (s *Server) codeAction(ctx context.Context, params *protocol.CodeActionParams) ([]protocol.CodeAction, error) {
 	uri := span.NewURI(params.TextDocument.URI)
 	view := s.session.ViewOf(uri)
-	f, m, err := getSourceFile(ctx, view, uri)
+	f, err := view.GetFile(ctx, uri)
+	if err != nil {
+		return nil, err
+	}
+	m, err := getMapper(ctx, f)
 	if err != nil {
 		return nil, err
 	}
@@ -229,7 +233,11 @@
 			return nil, err
 		}
 		for _, ca := range diag.SuggestedFixes {
-			_, m, err := getGoFile(ctx, view, diag.URI)
+			f, err := view.GetFile(ctx, diag.URI)
+			if err != nil {
+				return nil, err
+			}
+			m, err := getMapper(ctx, f)
 			if err != nil {
 				return nil, err
 			}
diff --git a/internal/lsp/completion.go b/internal/lsp/completion.go
index 79f9aca..c5283d6 100644
--- a/internal/lsp/completion.go
+++ b/internal/lsp/completion.go
@@ -19,7 +19,11 @@
 func (s *Server) completion(ctx context.Context, params *protocol.CompletionParams) (*protocol.CompletionList, error) {
 	uri := span.NewURI(params.TextDocument.URI)
 	view := s.session.ViewOf(uri)
-	f, m, err := getGoFile(ctx, view, uri)
+	f, err := getGoFile(ctx, view, uri)
+	if err != nil {
+		return nil, err
+	}
+	m, err := getMapper(ctx, f)
 	if err != nil {
 		return nil, err
 	}
diff --git a/internal/lsp/definition.go b/internal/lsp/definition.go
index 52ae133..07d5525 100644
--- a/internal/lsp/definition.go
+++ b/internal/lsp/definition.go
@@ -15,7 +15,11 @@
 func (s *Server) definition(ctx context.Context, params *protocol.TextDocumentPositionParams) ([]protocol.Location, error) {
 	uri := span.NewURI(params.TextDocument.URI)
 	view := s.session.ViewOf(uri)
-	f, m, err := getGoFile(ctx, view, uri)
+	f, err := getGoFile(ctx, view, uri)
+	if err != nil {
+		return nil, err
+	}
+	m, err := getMapper(ctx, f)
 	if err != nil {
 		return nil, err
 	}
@@ -35,7 +39,11 @@
 	if err != nil {
 		return nil, err
 	}
-	_, decM, err := getSourceFile(ctx, view, decSpan.URI())
+	decFile, err := getGoFile(ctx, view, decSpan.URI())
+	if err != nil {
+		return nil, err
+	}
+	decM, err := getMapper(ctx, decFile)
 	if err != nil {
 		return nil, err
 	}
@@ -49,7 +57,11 @@
 func (s *Server) typeDefinition(ctx context.Context, params *protocol.TextDocumentPositionParams) ([]protocol.Location, error) {
 	uri := span.NewURI(params.TextDocument.URI)
 	view := s.session.ViewOf(uri)
-	f, m, err := getGoFile(ctx, view, uri)
+	f, err := getGoFile(ctx, view, uri)
+	if err != nil {
+		return nil, err
+	}
+	m, err := getMapper(ctx, f)
 	if err != nil {
 		return nil, err
 	}
@@ -69,7 +81,11 @@
 	if err != nil {
 		return nil, err
 	}
-	_, identM, err := getSourceFile(ctx, view, identSpan.URI())
+	identFile, err := getGoFile(ctx, view, identSpan.URI())
+	if err != nil {
+		return nil, err
+	}
+	identM, err := getMapper(ctx, identFile)
 	if err != nil {
 		return nil, err
 	}
diff --git a/internal/lsp/diagnostics.go b/internal/lsp/diagnostics.go
index c3a897c..fdf8d74 100644
--- a/internal/lsp/diagnostics.go
+++ b/internal/lsp/diagnostics.go
@@ -37,7 +37,7 @@
 	defer s.undeliveredMu.Unlock()
 
 	for uri, diagnostics := range reports {
-		if err := s.publishDiagnostics(ctx, view, uri, diagnostics); err != nil {
+		if err := s.publishDiagnostics(ctx, uri, diagnostics); err != nil {
 			if s.undelivered == nil {
 				s.undelivered = make(map[span.URI][]source.Diagnostic)
 			}
@@ -51,7 +51,7 @@
 	// Anytime we compute diagnostics, make sure to also send along any
 	// undelivered ones (only for remaining URIs).
 	for uri, diagnostics := range s.undelivered {
-		if err := s.publishDiagnostics(ctx, view, uri, diagnostics); err != nil {
+		if err := s.publishDiagnostics(ctx, uri, diagnostics); err != nil {
 			log.Error(ctx, "failed to deliver diagnostic for (will not retry)", err, telemetry.File)
 		}
 		// If we fail to deliver the same diagnostics twice, just give up.
@@ -59,7 +59,7 @@
 	}
 }
 
-func (s *Server) publishDiagnostics(ctx context.Context, view source.View, uri span.URI, diagnostics []source.Diagnostic) error {
+func (s *Server) publishDiagnostics(ctx context.Context, uri span.URI, diagnostics []source.Diagnostic) error {
 	protocolDiagnostics, err := toProtocolDiagnostics(ctx, diagnostics)
 	if err != nil {
 		return err
diff --git a/internal/lsp/format.go b/internal/lsp/format.go
index 9bbcc19..6e5f400 100644
--- a/internal/lsp/format.go
+++ b/internal/lsp/format.go
@@ -27,12 +27,16 @@
 	return ToProtocolEdits(m, edits)
 }
 
-func spanToRange(ctx context.Context, view source.View, s span.Span) (source.GoFile, *protocol.ColumnMapper, span.Range, error) {
-	f, m, err := getGoFile(ctx, view, s.URI())
+func spanToRange(ctx context.Context, view source.View, spn span.Span) (source.GoFile, *protocol.ColumnMapper, span.Range, error) {
+	f, err := getGoFile(ctx, view, spn.URI())
 	if err != nil {
 		return nil, nil, span.Range{}, err
 	}
-	rng, err := s.Range(m.Converter)
+	m, err := getMapper(ctx, f)
+	if err != nil {
+		return nil, nil, span.Range{}, err
+	}
+	rng, err := spn.Range(m.Converter)
 	if err != nil {
 		return nil, nil, span.Range{}, err
 	}
diff --git a/internal/lsp/highlight.go b/internal/lsp/highlight.go
index 80007fc..44ce3ff 100644
--- a/internal/lsp/highlight.go
+++ b/internal/lsp/highlight.go
@@ -17,7 +17,11 @@
 func (s *Server) documentHighlight(ctx context.Context, params *protocol.TextDocumentPositionParams) ([]protocol.DocumentHighlight, error) {
 	uri := span.NewURI(params.TextDocument.URI)
 	view := s.session.ViewOf(uri)
-	f, m, err := getGoFile(ctx, view, uri)
+	f, err := getGoFile(ctx, view, uri)
+	if err != nil {
+		return nil, err
+	}
+	m, err := getMapper(ctx, f)
 	if err != nil {
 		return nil, err
 	}
diff --git a/internal/lsp/hover.go b/internal/lsp/hover.go
index 7b4ac78..da7dde4 100644
--- a/internal/lsp/hover.go
+++ b/internal/lsp/hover.go
@@ -34,7 +34,11 @@
 func (s *Server) hover(ctx context.Context, params *protocol.TextDocumentPositionParams) (*protocol.Hover, error) {
 	uri := span.NewURI(params.TextDocument.URI)
 	view := s.session.ViewOf(uri)
-	f, m, err := getGoFile(ctx, view, uri)
+	f, err := getGoFile(ctx, view, uri)
+	if err != nil {
+		return nil, err
+	}
+	m, err := getMapper(ctx, f)
 	if err != nil {
 		return nil, err
 	}
diff --git a/internal/lsp/link.go b/internal/lsp/link.go
index 5357177..6786919 100644
--- a/internal/lsp/link.go
+++ b/internal/lsp/link.go
@@ -23,7 +23,11 @@
 func (s *Server) documentLink(ctx context.Context, params *protocol.DocumentLinkParams) ([]protocol.DocumentLink, error) {
 	uri := span.NewURI(params.TextDocument.URI)
 	view := s.session.ViewOf(uri)
-	f, m, err := getGoFile(ctx, view, uri)
+	f, err := getGoFile(ctx, view, uri)
+	if err != nil {
+		return nil, err
+	}
+	m, err := getMapper(ctx, f)
 	if err != nil {
 		return nil, err
 	}
diff --git a/internal/lsp/lsp_test.go b/internal/lsp/lsp_test.go
index 79b542d..248f293 100644
--- a/internal/lsp/lsp_test.go
+++ b/internal/lsp/lsp_test.go
@@ -275,9 +275,13 @@
 			}
 			continue
 		}
-		_, m, err := getSourceFile(r.ctx, r.server.session.ViewOf(uri), uri)
+		f, err := getGoFile(r.ctx, r.server.session.ViewOf(uri), uri)
 		if err != nil {
-			t.Error(err)
+			t.Fatal(err)
+		}
+		m, err := getMapper(r.ctx, f)
+		if err != nil {
+			t.Fatal(err)
 		}
 		sedits, err := FromProtocolEdits(m, edits)
 		if err != nil {
@@ -312,9 +316,13 @@
 			}
 			continue
 		}
-		_, m, err := getSourceFile(r.ctx, r.server.session.ViewOf(uri), uri)
+		f, err := getGoFile(r.ctx, r.server.session.ViewOf(uri), uri)
 		if err != nil {
-			t.Error(err)
+			t.Fatal(err)
+		}
+		m, err := getMapper(r.ctx, f)
+		if err != nil {
+			t.Fatal(err)
 		}
 		var edits []protocol.TextEdit
 		for _, a := range actions {
@@ -501,9 +509,13 @@
 		var res []string
 		for uri, edits := range *workspaceEdits.Changes {
 			spnURI := span.URI(uri)
-			_, m, err := getSourceFile(r.ctx, r.server.session.ViewOf(span.URI(spnURI)), spnURI)
+			f, err := getGoFile(r.ctx, r.server.session.ViewOf(spnURI), spnURI)
 			if err != nil {
-				t.Error(err)
+				t.Fatal(err)
+			}
+			m, err := getMapper(r.ctx, f)
+			if err != nil {
+				t.Fatal(err)
 			}
 
 			sedits, err := FromProtocolEdits(m, edits)
diff --git a/internal/lsp/references.go b/internal/lsp/references.go
index e9d4dfb..589450c 100644
--- a/internal/lsp/references.go
+++ b/internal/lsp/references.go
@@ -17,7 +17,11 @@
 func (s *Server) references(ctx context.Context, params *protocol.ReferenceParams) ([]protocol.Location, error) {
 	uri := span.NewURI(params.TextDocument.URI)
 	view := s.session.ViewOf(uri)
-	f, m, err := getGoFile(ctx, view, uri)
+	f, err := getGoFile(ctx, view, uri)
+	if err != nil {
+		return nil, err
+	}
+	m, err := getMapper(ctx, f)
 	if err != nil {
 		return nil, err
 	}
@@ -63,7 +67,11 @@
 		}
 		seen[refSpan] = true
 
-		_, refM, err := getSourceFile(ctx, view, refSpan.URI())
+		refFile, err := getGoFile(ctx, view, refSpan.URI())
+		if err != nil {
+			return nil, err
+		}
+		refM, err := getMapper(ctx, refFile)
 		if err != nil {
 			return nil, err
 		}
diff --git a/internal/lsp/rename.go b/internal/lsp/rename.go
index e2f0ecb..8fb5e2c 100644
--- a/internal/lsp/rename.go
+++ b/internal/lsp/rename.go
@@ -15,7 +15,11 @@
 func (s *Server) rename(ctx context.Context, params *protocol.RenameParams) (*protocol.WorkspaceEdit, error) {
 	uri := span.NewURI(params.TextDocument.URI)
 	view := s.session.ViewOf(uri)
-	f, m, err := getGoFile(ctx, view, uri)
+	f, err := getGoFile(ctx, view, uri)
+	if err != nil {
+		return nil, err
+	}
+	m, err := getMapper(ctx, f)
 	if err != nil {
 		return nil, err
 	}
@@ -37,7 +41,11 @@
 	}
 	changes := make(map[string][]protocol.TextEdit)
 	for uri, textEdits := range edits {
-		_, m, err := getGoFile(ctx, view, uri)
+		f, err := getGoFile(ctx, view, uri)
+		if err != nil {
+			return nil, err
+		}
+		m, err := getMapper(ctx, f)
 		if err != nil {
 			return nil, err
 		}
diff --git a/internal/lsp/signature_help.go b/internal/lsp/signature_help.go
index 1d53d9f..a608d99 100644
--- a/internal/lsp/signature_help.go
+++ b/internal/lsp/signature_help.go
@@ -17,7 +17,11 @@
 func (s *Server) signatureHelp(ctx context.Context, params *protocol.TextDocumentPositionParams) (*protocol.SignatureHelp, error) {
 	uri := span.NewURI(params.TextDocument.URI)
 	view := s.session.ViewOf(uri)
-	f, m, err := getGoFile(ctx, view, uri)
+	f, err := getGoFile(ctx, view, uri)
+	if err != nil {
+		return nil, err
+	}
+	m, err := getMapper(ctx, f)
 	if err != nil {
 		return nil, err
 	}
diff --git a/internal/lsp/symbols.go b/internal/lsp/symbols.go
index d1f2b68..5081662 100644
--- a/internal/lsp/symbols.go
+++ b/internal/lsp/symbols.go
@@ -18,7 +18,11 @@
 	defer done()
 	uri := span.NewURI(params.TextDocument.URI)
 	view := s.session.ViewOf(uri)
-	f, m, err := getGoFile(ctx, view, uri)
+	f, err := getGoFile(ctx, view, uri)
+	if err != nil {
+		return nil, err
+	}
+	m, err := getMapper(ctx, f)
 	if err != nil {
 		return nil, err
 	}
diff --git a/internal/lsp/text_synchronization.go b/internal/lsp/text_synchronization.go
index d61ed33..fa0e9d5 100644
--- a/internal/lsp/text_synchronization.go
+++ b/internal/lsp/text_synchronization.go
@@ -149,7 +149,7 @@
 	clear := []span.URI{uri} // by default, clear the closed URI
 	defer func() {
 		for _, uri := range clear {
-			if err := s.publishDiagnostics(ctx, view, uri, []source.Diagnostic{}); err != nil {
+			if err := s.publishDiagnostics(ctx, uri, []source.Diagnostic{}); err != nil {
 				log.Error(ctx, "failed to clear diagnostics", err, telemetry.File)
 			}
 		}
diff --git a/internal/lsp/util.go b/internal/lsp/util.go
index cf5cf45..33890b7 100644
--- a/internal/lsp/util.go
+++ b/internal/lsp/util.go
@@ -13,32 +13,26 @@
 	errors "golang.org/x/xerrors"
 )
 
-func getSourceFile(ctx context.Context, v source.View, uri span.URI) (source.File, *protocol.ColumnMapper, error) {
-	f, err := v.GetFile(ctx, uri)
+func getGoFile(ctx context.Context, view source.View, uri span.URI) (source.GoFile, error) {
+	f, err := view.GetFile(ctx, uri)
 	if err != nil {
-		return nil, nil, err
-	}
-	data, _, err := f.Handle(ctx).Read(ctx)
-	if err != nil {
-		return nil, nil, err
-	}
-	tok, err := f.GetToken(ctx)
-	if err != nil {
-		return nil, nil, err
-	}
-	m := protocol.NewColumnMapper(f.URI(), f.URI().Filename(), f.FileSet(), tok, data)
-
-	return f, m, nil
-}
-
-func getGoFile(ctx context.Context, v source.View, uri span.URI) (source.GoFile, *protocol.ColumnMapper, error) {
-	f, m, err := getSourceFile(ctx, v, uri)
-	if err != nil {
-		return nil, nil, err
+		return nil, err
 	}
 	gof, ok := f.(source.GoFile)
 	if !ok {
-		return nil, nil, errors.Errorf("not a Go file %v", f.URI())
+		return nil, errors.Errorf("%s is not a Go file", uri)
 	}
-	return gof, m, nil
+	return gof, nil
+}
+
+func getMapper(ctx context.Context, f source.File) (*protocol.ColumnMapper, error) {
+	data, _, err := f.Handle(ctx).Read(ctx)
+	if err != nil {
+		return nil, err
+	}
+	tok, err := f.GetToken(ctx)
+	if err != nil {
+		return nil, err
+	}
+	return protocol.NewColumnMapper(f.URI(), f.URI().Filename(), f.FileSet(), tok, data), nil
 }