Skip to content

Commit 27e1a3a

Browse files
xrxtzzGo LUCI
authored andcommitted
go/packages: ensure TypesInfo is set when NeedTypesInfo is enabled
This fixes some cases when only NeedTypesInfo was set, no TypesInfo was produced. Under most circumstances NeedTypesInfo should work the same as NeedTypes, since Types and TypesInfo are produced together (except for cases when ExportFiles were included). Fixes #69931 Change-Id: I157143e93c459d8c52dea85fe1746881ed1978d3 GitHub-Last-Rev: e658e9f GitHub-Pull-Request: #536 Reviewed-on: https://go-review.googlesource.com/c/tools/+/621015 Commit-Queue: Tim King <[email protected]> LUCI-TryBot-Result: Go LUCI <[email protected]> Reviewed-by: Alan Donovan <[email protected]> Reviewed-by: Tim King <[email protected]> Reviewed-by: Michael Matloob <[email protected]>
1 parent 817c7bc commit 27e1a3a

File tree

3 files changed

+39
-6
lines changed

3 files changed

+39
-6
lines changed

go/packages/golist.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ func goListDriver(cfg *Config, patterns ...string) (_ *DriverResponse, err error
145145
}
146146

147147
// Fill in response.Sizes asynchronously if necessary.
148-
if cfg.Mode&NeedTypesSizes != 0 || cfg.Mode&NeedTypes != 0 {
148+
if cfg.Mode&NeedTypesSizes != 0 || cfg.Mode&(NeedTypes|NeedTypesInfo) != 0 {
149149
errCh := make(chan error)
150150
go func() {
151151
compiler, arch, err := getSizesForArgs(ctx, state.cfgInvocation(), cfg.gocmdRunner)
@@ -751,15 +751,15 @@ func jsonFlag(cfg *Config, goVersion int) string {
751751
}
752752
}
753753
addFields("Name", "ImportPath", "Error") // These fields are always needed
754-
if cfg.Mode&NeedFiles != 0 || cfg.Mode&NeedTypes != 0 {
754+
if cfg.Mode&NeedFiles != 0 || cfg.Mode&(NeedTypes|NeedTypesInfo) != 0 {
755755
addFields("Dir", "GoFiles", "IgnoredGoFiles", "IgnoredOtherFiles", "CFiles",
756756
"CgoFiles", "CXXFiles", "MFiles", "HFiles", "FFiles", "SFiles",
757757
"SwigFiles", "SwigCXXFiles", "SysoFiles")
758758
if cfg.Tests {
759759
addFields("TestGoFiles", "XTestGoFiles")
760760
}
761761
}
762-
if cfg.Mode&NeedTypes != 0 {
762+
if cfg.Mode&(NeedTypes|NeedTypesInfo) != 0 {
763763
// CompiledGoFiles seems to be required for the test case TestCgoNoSyntax,
764764
// even when -compiled isn't passed in.
765765
// TODO(#52435): Should we make the test ask for -compiled, or automatically

go/packages/packages.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -764,7 +764,7 @@ func newLoader(cfg *Config) *loader {
764764
ld.requestedMode = ld.Mode
765765
ld.Mode = impliedLoadMode(ld.Mode)
766766

767-
if ld.Mode&NeedTypes != 0 || ld.Mode&NeedSyntax != 0 {
767+
if ld.Mode&(NeedTypes|NeedSyntax|NeedTypesInfo) != 0 {
768768
if ld.Fset == nil {
769769
ld.Fset = token.NewFileSet()
770770
}
@@ -920,7 +920,7 @@ func (ld *loader) refine(response *DriverResponse) ([]*Package, error) {
920920

921921
// Load type data and syntax if needed, starting at
922922
// the initial packages (roots of the import DAG).
923-
if ld.Mode&NeedTypes != 0 || ld.Mode&NeedSyntax != 0 {
923+
if ld.Mode&(NeedTypes|NeedSyntax|NeedTypesInfo) != 0 {
924924
var wg sync.WaitGroup
925925
for _, lpkg := range initial {
926926
wg.Add(1)
@@ -1158,7 +1158,7 @@ func (ld *loader) loadPackage(lpkg *loaderPackage) {
11581158
}
11591159

11601160
lpkg.Syntax = files
1161-
if ld.Config.Mode&NeedTypes == 0 {
1161+
if ld.Config.Mode&(NeedTypes|NeedTypesInfo) == 0 {
11621162
return
11631163
}
11641164

go/packages/packages_test.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3176,3 +3176,36 @@ func TestIssue69606b(t *testing.T) {
31763176
t.Fatal("Expected to get an error because missing unsafe package but got a nil error")
31773177
}
31783178
}
3179+
3180+
// TestNeedTypesInfoOnly tests when NeedTypesInfo was set and NeedSyntax & NeedTypes were not,
3181+
// Load should include the TypesInfo of packages properly
3182+
func TestLoadTypesInfoWithoutSyntaxOrTypes(t *testing.T) {
3183+
testAllOrModulesParallel(t, testLoadTypesInfoWithoutSyntaxOrTypes)
3184+
}
3185+
3186+
func testLoadTypesInfoWithoutSyntaxOrTypes(t *testing.T, exporter packagestest.Exporter) {
3187+
exported := packagestest.Export(t, exporter, []packagestest.Module{{
3188+
Name: "golang.org/fake",
3189+
Files: map[string]interface{}{
3190+
"a/a.go": `package a;
3191+
3192+
func foo() int {
3193+
i := 0
3194+
s := "abc"
3195+
return i + len(s)
3196+
}
3197+
`,
3198+
}}})
3199+
defer exported.Cleanup()
3200+
exported.Config.Mode = packages.NeedTypesInfo
3201+
3202+
pkgs, err := packages.Load(exported.Config, "golang.org/fake/a")
3203+
if err != nil {
3204+
t.Fatal(err)
3205+
}
3206+
3207+
// check if types info is present
3208+
if pkgs[0].TypesInfo == nil {
3209+
t.Errorf("expected types info to be present but got nil")
3210+
}
3211+
}

0 commit comments

Comments
 (0)