Skip to content

Commit 3b17702

Browse files
adonovangopherbot
authored andcommitted
[gopls-release-branch.0.14] go/packages: don't fail if GOPACKAGESDRIVER leaves Compiler/GOARCH=""
This change causes packages.Load to set TypesSizes to a fallback value whenever the external GOPACKAGESDRIVER fails to populate the Compiler and GOARCH fields of the response. Fixes golang/go#63700 Change-Id: I189ae97dde04f313f79e5db39a10b4a217cd8534 Reviewed-on: https://go-review.googlesource.com/c/tools/+/537876 Reviewed-by: Robert Findley <[email protected]> Auto-Submit: Alan Donovan <[email protected]> LUCI-TryBot-Result: Go LUCI <[email protected]> (cherry picked from commit ff1953b) Reviewed-on: https://go-review.googlesource.com/c/tools/+/537877 Reviewed-by: Alan Donovan <[email protected]> Auto-Submit: Robert Findley <[email protected]>
1 parent c405dc8 commit 3b17702

File tree

1 file changed

+29
-16
lines changed

1 file changed

+29
-16
lines changed

go/packages/packages.go

Lines changed: 29 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -259,17 +259,28 @@ type driverResponse struct {
259259
// provided for convenient display of all errors.
260260
func Load(cfg *Config, patterns ...string) ([]*Package, error) {
261261
ld := newLoader(cfg)
262-
response, err := defaultDriver(&ld.Config, patterns...)
262+
response, external, err := defaultDriver(&ld.Config, patterns...)
263263
if err != nil {
264264
return nil, err
265265
}
266266

267-
// If type size information is needed but unavailable.
268-
// reject the whole Load since the error is the same for every package.
269267
ld.sizes = types.SizesFor(response.Compiler, response.Arch)
270268
if ld.sizes == nil && ld.Config.Mode&(NeedTypes|NeedTypesSizes|NeedTypesInfo) != 0 {
271-
return nil, fmt.Errorf("can't determine type sizes for compiler %q on GOARCH %q",
272-
response.Compiler, response.Arch)
269+
// Type size information is needed but unavailable.
270+
if external {
271+
// An external driver may fail to populate the Compiler/GOARCH fields,
272+
// especially since they are relatively new (see #63700).
273+
// Provide a sensible fallback in this case.
274+
ld.sizes = types.SizesFor("gc", runtime.GOARCH)
275+
if ld.sizes == nil { // gccgo-only arch
276+
ld.sizes = types.SizesFor("gc", "amd64")
277+
}
278+
} else {
279+
// Go list should never fail to deliver accurate size information.
280+
// Reject the whole Load since the error is the same for every package.
281+
return nil, fmt.Errorf("can't determine type sizes for compiler %q on GOARCH %q",
282+
response.Compiler, response.Arch)
283+
}
273284
}
274285

275286
return ld.refine(response)
@@ -279,18 +290,20 @@ func Load(cfg *Config, patterns ...string) ([]*Package, error) {
279290
// It will try to request to an external driver, if one exists. If there's
280291
// no external driver, or the driver returns a response with NotHandled set,
281292
// defaultDriver will fall back to the go list driver.
282-
func defaultDriver(cfg *Config, patterns ...string) (*driverResponse, error) {
283-
driver := findExternalDriver(cfg)
284-
if driver == nil {
285-
driver = goListDriver
286-
}
287-
response, err := driver(cfg, patterns...)
288-
if err != nil {
289-
return response, err
290-
} else if response.NotHandled {
291-
return goListDriver(cfg, patterns...)
293+
// The boolean result indicates that an external driver handled the request.
294+
func defaultDriver(cfg *Config, patterns ...string) (*driverResponse, bool, error) {
295+
if driver := findExternalDriver(cfg); driver != nil {
296+
response, err := driver(cfg, patterns...)
297+
if err != nil {
298+
return nil, false, err
299+
} else if !response.NotHandled {
300+
return response, true, nil
301+
}
302+
// (fall through)
292303
}
293-
return response, nil
304+
305+
response, err := goListDriver(cfg, patterns...)
306+
return response, false, err
294307
}
295308

296309
// A Package describes a loaded Go package.

0 commit comments

Comments
 (0)