Skip to content

Commit 3540c02

Browse files
committed
go/packages: save requested load mode
Save the actually requested fields in loader.requestedMode. loader.Mode contains the implied mode (see implyLoadMode): all the fields we need the data for. Zero out unrequested fields before returning packages to the user by checking loader.requestedMode.
1 parent 271b1bd commit 3540c02

File tree

2 files changed

+60
-19
lines changed

2 files changed

+60
-19
lines changed

go/packages/packages.go

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,6 @@ const (
4949
NeedImports
5050

5151
// NeedDeps adds the fields requested by the LoadMode in the packages in Imports.
52-
// If NeedImports is not set, it will be added automatically.
5352
NeedDeps
5453

5554
// NeedExportsFile adds ExportsFile.
@@ -61,7 +60,7 @@ const (
6160
// NeedSyntax adds Syntax.
6261
NeedSyntax
6362

64-
// NeedTypesInfo adds TypesInfo. If NeedImports is not set, it will be added automatically.
63+
// NeedTypesInfo adds TypesInfo.
6564
NeedTypesInfo
6665

6766
// NeedTypesSizes adds TypesSizes.
@@ -416,11 +415,13 @@ type loader struct {
416415
parseCacheMu sync.Mutex
417416
exportMu sync.Mutex // enforces mutual exclusion of exportdata operations
418417

419-
// TODO(matloob): Add an implied mode here and use that instead of mode.
420-
// Implied mode would contain all the fields we need the data for so we can
421-
// get the actually requested fields. We'll zero them out before returning
422-
// packages to the user. This will make it easier for us to get the conditions
423-
// where we need certain modes right.
418+
// Config.Mode contains the implied mode (see implyLoadMode).
419+
// Implied mode contains all the fields we need the data for.
420+
// In requestedMode there are the actually requested fields.
421+
// We'll zero them out before returning packages to the user.
422+
// This makes it easier for us to get the conditions where
423+
// we need certain modes right.
424+
requestedMode LoadMode
424425
}
425426

426427
type parseValue struct {
@@ -477,7 +478,9 @@ func newLoader(cfg *Config) *loader {
477478
}
478479
}
479480

480-
ld.addDependingLoadModes()
481+
// Save the actually requested fields. We'll zero them out before returning packages to the user.
482+
ld.requestedMode = ld.Mode
483+
ld.implyLoadMode()
481484
return ld
482485
}
483486

@@ -625,35 +628,35 @@ func (ld *loader) refine(roots []string, list ...*Package) ([]*Package, error) {
625628
}
626629
for i := range ld.pkgs {
627630
// Clear all unrequested fields, for extra de-Hyrum-ization.
628-
if ld.Mode&NeedName == 0 {
631+
if ld.requestedMode&NeedName == 0 {
629632
ld.pkgs[i].Name = ""
630633
ld.pkgs[i].PkgPath = ""
631634
}
632-
if ld.Mode&NeedFiles == 0 {
635+
if ld.requestedMode&NeedFiles == 0 {
633636
ld.pkgs[i].GoFiles = nil
634637
ld.pkgs[i].OtherFiles = nil
635638
}
636-
if ld.Mode&NeedCompiledGoFiles == 0 {
639+
if ld.requestedMode&NeedCompiledGoFiles == 0 {
637640
ld.pkgs[i].CompiledGoFiles = nil
638641
}
639-
if ld.Mode&NeedImports == 0 {
642+
if ld.requestedMode&NeedImports == 0 {
640643
ld.pkgs[i].Imports = nil
641644
}
642-
if ld.Mode&NeedExportsFile == 0 {
645+
if ld.requestedMode&NeedExportsFile == 0 {
643646
ld.pkgs[i].ExportFile = ""
644647
}
645-
if ld.Mode&NeedTypes == 0 {
648+
if ld.requestedMode&NeedTypes == 0 {
646649
ld.pkgs[i].Types = nil
647650
ld.pkgs[i].Fset = nil
648651
ld.pkgs[i].IllTyped = false
649652
}
650-
if ld.Mode&NeedSyntax == 0 {
653+
if ld.requestedMode&NeedSyntax == 0 {
651654
ld.pkgs[i].Syntax = nil
652655
}
653-
if ld.Mode&NeedTypesInfo == 0 {
656+
if ld.requestedMode&NeedTypesInfo == 0 {
654657
ld.pkgs[i].TypesInfo = nil
655658
}
656-
if ld.Mode&NeedTypesSizes == 0 {
659+
if ld.requestedMode&NeedTypesSizes == 0 {
657660
ld.pkgs[i].TypesSizes = nil
658661
}
659662
}
@@ -1077,8 +1080,8 @@ func (ld *loader) loadFromExportData(lpkg *loaderPackage) (*types.Package, error
10771080
return tpkg, nil
10781081
}
10791082

1080-
// addDependingLoadModes adds dependencies for choosed LoadMode in ld.Mode
1081-
func (ld *loader) addDependingLoadModes() {
1083+
// implyLoadMode adds dependencies for choosed LoadMode in ld.Mode
1084+
func (ld *loader) implyLoadMode() {
10821085
if ld.Mode&NeedTypesInfo != 0 && ld.Mode&NeedImports == 0 {
10831086
// If NeedTypesInfo, go/packages needs to do typechecking itself so it can
10841087
// associate type info with the AST. To do so, we need the export data

go/packages/packages_test.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2261,6 +2261,44 @@ func testLoadWithNeedDeps(t *testing.T, exporter packagestest.Exporter) {
22612261
}
22622262
}
22632263

2264+
func TestImpliedLoadMode(t *testing.T) {
2265+
packagestest.TestAll(t, testImpliedLoadMode)
2266+
}
2267+
func testImpliedLoadMode(t *testing.T, exporter packagestest.Exporter) {
2268+
exported := packagestest.Export(t, exporter, []packagestest.Module{{
2269+
Name: "golang.org/fake",
2270+
Files: map[string]interface{}{
2271+
"a/a.go": `package a; import _ "golang.org/fake/b"`,
2272+
"b/b.go": `package b`,
2273+
}}})
2274+
defer exported.Cleanup()
2275+
2276+
exported.Config.Mode = packages.NeedTypes | packages.NeedTypesInfo
2277+
pkgs, err := packages.Load(exported.Config, "golang.org/fake/a")
2278+
if err != nil {
2279+
t.Fatal(err)
2280+
}
2281+
if len(pkgs) != 1 {
2282+
t.Fatalf("Expected 1 package, got %d", len(pkgs))
2283+
}
2284+
2285+
pkg := pkgs[0]
2286+
if pkg.IllTyped {
2287+
t.Fatalf("Loaded package is ill typed: %v", pkg.Errors)
2288+
}
2289+
2290+
// Check that packages.NeedTypesInfo worked well.
2291+
if !pkg.Types.Complete() {
2292+
t.Fatalf("Loaded package types are incomplete")
2293+
}
2294+
2295+
// Check that implied packages.NeedImports by packages.NeedTypesInfo
2296+
// didn't add Imports.
2297+
if len(pkg.Imports) != 0 {
2298+
t.Fatalf("Package imports weren't requested but were returned: %v", pkg.Imports)
2299+
}
2300+
}
2301+
22642302
func errorMessages(errors []packages.Error) []string {
22652303
var msgs []string
22662304
for _, err := range errors {

0 commit comments

Comments
 (0)