diff --git a/internal/lsp/code_action.go b/internal/lsp/code_action.go index fe8eef6008..3491e36beb 100644 --- a/internal/lsp/code_action.go +++ b/internal/lsp/code_action.go @@ -21,7 +21,11 @@ import ( 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 @@ func quickFixes(ctx context.Context, view source.View, gof source.GoFile) ([]pro 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 79f9aca891..c5283d62f2 100644 --- a/internal/lsp/completion.go +++ b/internal/lsp/completion.go @@ -19,7 +19,11 @@ import ( 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 52ae133073..07d5525051 100644 --- a/internal/lsp/definition.go +++ b/internal/lsp/definition.go @@ -15,7 +15,11 @@ import ( 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 @@ func (s *Server) definition(ctx context.Context, params *protocol.TextDocumentPo 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) definition(ctx context.Context, params *protocol.TextDocumentPo 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 @@ func (s *Server) typeDefinition(ctx context.Context, params *protocol.TextDocume 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 c3a897c239..fdf8d7493f 100644 --- a/internal/lsp/diagnostics.go +++ b/internal/lsp/diagnostics.go @@ -37,7 +37,7 @@ func (s *Server) Diagnostics(ctx context.Context, view source.View, uri span.URI 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 @@ func (s *Server) Diagnostics(ctx context.Context, view source.View, uri span.URI // 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) Diagnostics(ctx context.Context, view source.View, uri span.URI } } -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 9bbcc19a83..6e5f400cdc 100644 --- a/internal/lsp/format.go +++ b/internal/lsp/format.go @@ -27,12 +27,16 @@ func (s *Server) formatting(ctx context.Context, params *protocol.DocumentFormat 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 80007fc18c..44ce3ff755 100644 --- a/internal/lsp/highlight.go +++ b/internal/lsp/highlight.go @@ -17,7 +17,11 @@ import ( 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 7b4ac78c76..da7dde4a66 100644 --- a/internal/lsp/hover.go +++ b/internal/lsp/hover.go @@ -34,7 +34,11 @@ const ( 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 5357177c5e..67869191ca 100644 --- a/internal/lsp/link.go +++ b/internal/lsp/link.go @@ -23,7 +23,11 @@ import ( 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 79b542dc88..248f2932e7 100644 --- a/internal/lsp/lsp_test.go +++ b/internal/lsp/lsp_test.go @@ -275,9 +275,13 @@ func (r *runner) Format(t *testing.T, data tests.Formats) { } 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 @@ func (r *runner) Import(t *testing.T, data tests.Imports) { } 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 @@ func (r *runner) Rename(t *testing.T, data tests.Renames) { 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 e9d4dfbce5..589450cf7a 100644 --- a/internal/lsp/references.go +++ b/internal/lsp/references.go @@ -17,7 +17,11 @@ import ( 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 @@ func (s *Server) references(ctx context.Context, params *protocol.ReferenceParam } 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 e2f0ecb78d..8fb5e2cb8f 100644 --- a/internal/lsp/rename.go +++ b/internal/lsp/rename.go @@ -15,7 +15,11 @@ import ( 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 @@ func (s *Server) rename(ctx context.Context, params *protocol.RenameParams) (*pr } 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 1d53d9f13e..a608d99409 100644 --- a/internal/lsp/signature_help.go +++ b/internal/lsp/signature_help.go @@ -17,7 +17,11 @@ import ( 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 d1f2b68ab9..5081662b71 100644 --- a/internal/lsp/symbols.go +++ b/internal/lsp/symbols.go @@ -18,7 +18,11 @@ func (s *Server) documentSymbol(ctx context.Context, params *protocol.DocumentSy 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 d61ed33bf3..fa0e9d536a 100644 --- a/internal/lsp/text_synchronization.go +++ b/internal/lsp/text_synchronization.go @@ -149,7 +149,7 @@ func (s *Server) didClose(ctx context.Context, params *protocol.DidCloseTextDocu 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 cf5cf4599d..33890b7ab2 100644 --- a/internal/lsp/util.go +++ b/internal/lsp/util.go @@ -13,32 +13,26 @@ import ( 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 }