From 328c41bf046cfcada38e5480cd49fd35401a7dfb Mon Sep 17 00:00:00 2001 From: Heschi Kreinick Date: Wed, 20 Nov 2019 13:59:03 -0500 Subject: [PATCH] internal: avoid use of (*token.File).Name When line directives are in use, we want the logical file name, not the one we found the bytes in. This matters most for cgo, where the file we parsed is not the one the user wants to see. Updates golang/go#35720. Change-Id: I495328071d8865e6895cb731467f1601f11e93db Reviewed-on: https://go-review.googlesource.com/c/tools/+/208100 Run-TryBot: Heschi Kreinick Reviewed-by: Rebecca Stambler TryBot-Result: Gobot Gobot --- internal/lsp/cache/view.go | 2 +- internal/span/token.go | 12 +++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/internal/lsp/cache/view.go b/internal/lsp/cache/view.go index 4ff2fcb4e8..5ba18e2e02 100644 --- a/internal/lsp/cache/view.go +++ b/internal/lsp/cache/view.go @@ -450,7 +450,7 @@ func (v *view) FindPosInPackage(searchpkg source.Package, pos token.Pos) (*ast.F if tok == nil { return nil, nil, nil, errors.Errorf("no file for pos in package %s", searchpkg.ID()) } - uri := span.FileURI(tok.Name()) + uri := span.FileURI(tok.Position(pos).Filename) // Special case for ignored files. var ( diff --git a/internal/span/token.go b/internal/span/token.go index ce44541b2f..01b5ed2d0a 100644 --- a/internal/span/token.go +++ b/internal/span/token.go @@ -64,7 +64,7 @@ func (r Range) Span() (Span, error) { if f == nil { return Span{}, fmt.Errorf("file not found in FileSet") } - s := Span{v: span{URI: FileURI(f.Name())}} + s := Span{} var err error s.v.Start.Offset, err = offset(f, r.Start) if err != nil { @@ -76,6 +76,16 @@ func (r Range) Span() (Span, error) { return Span{}, err } } + // In the presence of line directives, a single File can have sections from + // multiple file names. + filename := f.Position(r.Start).Filename + if r.End.IsValid() { + if endFilename := f.Position(r.End).Filename; filename != endFilename { + return Span{}, fmt.Errorf("span begins in file %q but ends in %q", filename, endFilename) + } + } + s.v.URI = FileURI(filename) + s.v.Start.clean() s.v.End.clean() s.v.clean()