Skip to content

Commit

Permalink
go/packages: fix load with NeedTypes but not NeedImports
Browse files Browse the repository at this point in the history
Fixes golang/go#45584.

Change-Id: I65238cc3bdc640bb044c615a5699e8d3cfa39db0
  • Loading branch information
rsc authored and AlekSi committed Jan 15, 2022
1 parent f29bdf1 commit be0454d
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 12 deletions.
15 changes: 3 additions & 12 deletions go/packages/packages.go
Original file line number Diff line number Diff line change
Expand Up @@ -1211,7 +1211,7 @@ func (ld *loader) loadFromExportData(lpkg *loaderPackage) (*types.Package, error
return nil, fmt.Errorf("reading %s: %v", lpkg.ExportFile, err)
}
if viewLen != len(view) {
log.Fatalf("Unexpected package creation during export data loading")
log.Panicf("golang.org/x/tools/go/packages: unexpected new packages during load of %s", lpkg.PkgPath)
}

lpkg.Types = tpkg
Expand All @@ -1222,17 +1222,8 @@ func (ld *loader) loadFromExportData(lpkg *loaderPackage) (*types.Package, error

// impliedLoadMode returns loadMode with its dependencies.
func impliedLoadMode(loadMode LoadMode) LoadMode {
if loadMode&NeedTypesInfo != 0 && loadMode&NeedImports == 0 {
// If NeedTypesInfo, go/packages needs to do typechecking itself so it can
// associate type info with the AST. To do so, we need the export data
// for dependencies, which means we need to ask for the direct dependencies.
// NeedImports is used to ask for the direct dependencies.
loadMode |= NeedImports
}

if loadMode&NeedDeps != 0 && loadMode&NeedImports == 0 {
// With NeedDeps we need to load at least direct dependencies.
// NeedImports is used to ask for the direct dependencies.
if loadMode&(NeedDeps|NeedTypes|NeedTypesInfo) != 0 {
// All these things require knowing the import graph.
loadMode |= NeedImports
}

Expand Down
7 changes: 7 additions & 0 deletions go/packages/packages_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2832,3 +2832,10 @@ func copyAll(srcPath, dstPath string) error {
return nil
})
}

func TestExportFile(t *testing.T) {
// This used to trigger the log.Fatal in loadFromExportData.
cfg := new(packages.Config)
cfg.Mode = packages.NeedTypes
packages.Load(cfg, "fmt")
}

0 comments on commit be0454d

Please sign in to comment.