Reproducer (using the x/tools/go/packages testing API):
func TestReproducer(t *testing.T) {
exported := packagestest.Export(t, packagestest.Modules, []packagestest.Module{
{
Name: "test",
Files: map[string]any{
"test.go": `package test; import "test/other"; var _ = other.Test;`,
"other/file.go": `package other
//line other.go:1:1
var Test int
`,
},
},
})
t.Cleanup(exported.Cleanup)
exported.Config.Mode = packages.LoadSyntax
exported.Config.Fset = token.NewFileSet()
pkgs, err := packages.Load(exported.Config, "test")
if err != nil {
t.Fatal(err)
}
packages.PrintErrors(pkgs)
p := pkgs[0].Imports["test/other"]
pos := p.Types.Scope().Lookup("Test").Pos()
t.Log(exported.Config.Fset.Position(pos)) // other.go:4:1
}
The Mode is set to packages.LoadSyntax, thus go/packages is going to load test/other from the ExportFile.
$ go test ./go/packages/ -run TestReproducer -v
=== RUN TestReproducer
(....)
packages_test.go:3455: other.go:4:1
--- PASS: TestReproducer (0.15s)
The file name (other.go) comes from the line directive, but the line/col (4:1) information does not.
I think that the issue is somewhere in cmd/go, while debugging, i saw the same values here (i.e. other.go:4:1):
https://github.com/golang/tools/blob/4f820dbaf9859eaafa01a17d133583f4d8c5a73c/internal/gcimporter/ureader_yes.go#L201-L205
Reproducer (using the
x/tools/go/packagestesting API):The
Modeis set topackages.LoadSyntax, thusgo/packagesis going to loadtest/otherfrom theExportFile.$ go test ./go/packages/ -run TestReproducer -v === RUN TestReproducer (....) packages_test.go:3455: other.go:4:1 --- PASS: TestReproducer (0.15s)The file name (
other.go) comes from the line directive, but the line/col (4:1) information does not.I think that the issue is somewhere in
cmd/go, while debugging, i saw the same values here (i.e. other.go:4:1):https://github.com/golang/tools/blob/4f820dbaf9859eaafa01a17d133583f4d8c5a73c/internal/gcimporter/ureader_yes.go#L201-L205