diff --git a/internal/lsp/protocol/span.go b/internal/lsp/protocol/span.go index f41fba82..36ea0b55 100644 --- a/internal/lsp/protocol/span.go +++ b/internal/lsp/protocol/span.go @@ -23,14 +23,13 @@ func NewURI(uri span.URI) string { return string(uri) } -func NewColumnMapper(uri span.URI, fn string, fset *token.FileSet, f *token.File, content []byte) *ColumnMapper { +func NewColumnMapper(uri span.URI, filename string, fset *token.FileSet, f *token.File, content []byte) *ColumnMapper { var converter *span.TokenConverter if f == nil { - converter = span.NewContentConverter(fn, content) + converter = span.NewContentConverter(filename, content) } else { converter = span.NewTokenConverter(fset, f) } - return &ColumnMapper{ URI: uri, Converter: converter, diff --git a/internal/lsp/source/diagnostics.go b/internal/lsp/source/diagnostics.go index 29779284..f66e2786 100644 --- a/internal/lsp/source/diagnostics.go +++ b/internal/lsp/source/diagnostics.go @@ -88,10 +88,6 @@ func Diagnostics(ctx context.Context, v View, uri span.URI) (map[span.URI][]Diag } // Updates to the diagnostics for this package may need to be propagated. for _, f := range gof.GetActiveReverseDeps(ctx) { - if f == nil { - v.Session().Logger().Errorf(ctx, "nil file in reverse active dependencies for %s", f.URI()) - continue - } pkg := f.GetPackage(ctx) if pkg == nil { continue diff --git a/internal/lsp/text_synchronization.go b/internal/lsp/text_synchronization.go index d8c219e7..20a0ffa9 100644 --- a/internal/lsp/text_synchronization.go +++ b/internal/lsp/text_synchronization.go @@ -65,11 +65,16 @@ func (s *Server) applyChanges(ctx context.Context, params *protocol.DidChangeTex uri := span.NewURI(params.TextDocument.URI) view := s.session.ViewOf(uri) - file, m, err := getSourceFile(ctx, view, uri) + f, m, err := getSourceFile(ctx, view, uri) if err != nil { return "", jsonrpc2.NewErrorf(jsonrpc2.CodeInternalError, "file not found") } - content := file.GetContent(ctx) + fset := f.GetFileSet(ctx) + filename, err := f.URI().Filename() + if err != nil { + return "", jsonrpc2.NewErrorf(jsonrpc2.CodeInternalError, "no filename for %s", uri) + } + content := f.GetContent(ctx) for _, change := range params.ContentChanges { spn, err := m.RangeSpan(*change.Range) if err != nil { @@ -87,6 +92,9 @@ func (s *Server) applyChanges(ctx context.Context, params *protocol.DidChangeTex buf.WriteString(change.Text) buf.Write(content[end:]) content = buf.Bytes() + + // Update column mapper along with the content. + m = protocol.NewColumnMapper(f.URI(), filename, fset, nil, content) } return string(content), nil } diff --git a/internal/lsp/util.go b/internal/lsp/util.go index aa8be476..a41ba565 100644 --- a/internal/lsp/util.go +++ b/internal/lsp/util.go @@ -51,13 +51,11 @@ func getSourceFile(ctx context.Context, v source.View, uri span.URI) (source.Fil if err != nil { return nil, nil, err } - - fname, err := f.URI().Filename() + filename, err := f.URI().Filename() if err != nil { return nil, nil, err } - - m := protocol.NewColumnMapper(f.URI(), fname, f.GetFileSet(ctx), f.GetToken(ctx), f.GetContent(ctx)) + m := protocol.NewColumnMapper(f.URI(), filename, f.GetFileSet(ctx), f.GetToken(ctx), f.GetContent(ctx)) return f, m, nil }