Skip to content

Commit 78f90b8

Browse files
committed
go/packages: do not nullify Fset when NeedSyntax is set
Resolves golang/go#48226.
1 parent 12d2c34 commit 78f90b8

File tree

2 files changed

+40
-2
lines changed

2 files changed

+40
-2
lines changed

go/packages/packages.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ const (
7676
// NeedTypes adds Types, Fset, and IllTyped.
7777
NeedTypes
7878

79-
// NeedSyntax adds Syntax.
79+
// NeedSyntax adds Syntax and Fset.
8080
NeedSyntax
8181

8282
// NeedTypesInfo adds TypesInfo.
@@ -961,12 +961,14 @@ func (ld *loader) refine(response *DriverResponse) ([]*Package, error) {
961961
}
962962
if ld.requestedMode&NeedTypes == 0 {
963963
ld.pkgs[i].Types = nil
964-
ld.pkgs[i].Fset = nil
965964
ld.pkgs[i].IllTyped = false
966965
}
967966
if ld.requestedMode&NeedSyntax == 0 {
968967
ld.pkgs[i].Syntax = nil
969968
}
969+
if ld.requestedMode&NeedTypes == 0 && ld.requestedMode&NeedSyntax == 0 {
970+
ld.pkgs[i].Fset = nil
971+
}
970972
if ld.requestedMode&NeedTypesInfo == 0 {
971973
ld.pkgs[i].TypesInfo = nil
972974
}

go/packages/packages_test.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2645,6 +2645,42 @@ func testTypecheckCgo(t *testing.T, exporter packagestest.Exporter) {
26452645
}
26462646
}
26472647

2648+
// TestIssue48226 ensures that when NeedSyntax is provided we do not nullify the
2649+
// Fset, which is needed to resolve the syntax tree element positions to files.
2650+
func TestIssue48226(t *testing.T) { testAllOrModulesParallel(t, testIssue48226) }
2651+
func testIssue48226(t *testing.T, exporter packagestest.Exporter) {
2652+
exported := packagestest.Export(t, exporter, []packagestest.Module{
2653+
{
2654+
Name: "golang.org/fake/syntax",
2655+
Files: map[string]interface{}{
2656+
"syntax.go": `package test`,
2657+
},
2658+
},
2659+
})
2660+
defer exported.Cleanup()
2661+
2662+
exported.Config.Mode = packages.NeedFiles | packages.NeedSyntax
2663+
2664+
initial, err := packages.Load(exported.Config, "golang.org/fake/syntax")
2665+
if err != nil {
2666+
t.Fatal(err)
2667+
}
2668+
if len(initial) != 1 {
2669+
t.Fatalf("exepected 1 package, got %d", len(initial))
2670+
}
2671+
pkg := initial[0]
2672+
2673+
if len(pkg.Errors) != 0 {
2674+
t.Fatalf("package has errors: %v", pkg.Errors)
2675+
}
2676+
2677+
fname := pkg.Fset.File(pkg.Syntax[0].Pos()).Name()
2678+
if filepath.Base(fname) != "syntax.go" {
2679+
t.Errorf("expected the package declaration position "+
2680+
"to resolve to \"syntax.go\", got %q instead", fname)
2681+
}
2682+
}
2683+
26482684
func TestModule(t *testing.T) {
26492685
testAllOrModulesParallel(t, testModule)
26502686
}

0 commit comments

Comments
 (0)