From be0454d9dfd3d7ba7e814868b5720c633fe7582f Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Thu, 15 Apr 2021 12:39:54 -0400 Subject: [PATCH] go/packages: fix load with NeedTypes but not NeedImports Fixes golang/go#45584. Change-Id: I65238cc3bdc640bb044c615a5699e8d3cfa39db0 --- go/packages/packages.go | 15 +++------------ go/packages/packages_test.go | 7 +++++++ 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/go/packages/packages.go b/go/packages/packages.go index 1b5424e78f7..8ba6babc0cc 100644 --- a/go/packages/packages.go +++ b/go/packages/packages.go @@ -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 @@ -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 } diff --git a/go/packages/packages_test.go b/go/packages/packages_test.go index 6549fd6106c..36d90c71111 100644 --- a/go/packages/packages_test.go +++ b/go/packages/packages_test.go @@ -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") +}