-
Notifications
You must be signed in to change notification settings - Fork 2.3k
Commit
Because go/types is slightly more strict than gc about certain "soft" errors (ones that aren't necessary to interpret a Go program), gorename rejects programs that compile under gc. This change relaxes gorename's error checks so that they are weaker than gc's. This is a workaround for issue golang/go#14596 in gorename, whose underlying problem is issue golang/go#8560 in gc. Fixes golang/go#14596 Change-Id: Ica5006c2376c0564a575224269093c1497348ee6 Reviewed-on: https://go-review.googlesource.com/29853 Reviewed-by: Brad Fitzpatrick <[email protected]>
- Loading branch information
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -384,7 +384,41 @@ func loadProgram(ctxt *build.Context, pkgs map[string]bool) (*loader.Program, er | |
for pkg := range pkgs { | ||
conf.ImportWithTests(pkg) | ||
} | ||
return conf.Load() | ||
|
||
// Ideally we would just return conf.Load() here, but go/types | ||
// reports certain "soft" errors that gc does not (Go issue 14596). | ||
// As a workaround, we set AllowErrors=true and then duplicate | ||
// the loader's error checking but allow soft errors. | ||
// It would be nice if the loader API permitted "AllowErrors: soft". | ||
conf.AllowErrors = true | ||
prog, err := conf.Load() | ||
var errpkgs []string | ||
// Report hard errors in indirectly imported packages. | ||
for _, info := range prog.AllPackages { | ||
This comment has been minimized.
Sorry, something went wrong.
This comment has been minimized.
Sorry, something went wrong.
davidrjenni
Contributor
|
||
if containsHardErrors(info.Errors) { | ||
errpkgs = append(errpkgs, info.Pkg.Path()) | ||
} | ||
} | ||
if errpkgs != nil { | ||
var more string | ||
if len(errpkgs) > 3 { | ||
more = fmt.Sprintf(" and %d more", len(errpkgs)-3) | ||
errpkgs = errpkgs[:3] | ||
} | ||
return nil, fmt.Errorf("couldn't load packages due to errors: %s%s", | ||
strings.Join(errpkgs, ", "), more) | ||
} | ||
return prog, err | ||
} | ||
|
||
func containsHardErrors(errors []error) bool { | ||
for _, err := range errors { | ||
if err, ok := err.(types.Error); ok && err.Soft { | ||
continue | ||
} | ||
return true | ||
} | ||
return false | ||
} | ||
|
||
// requiresGlobalRename reports whether this renaming could potentially | ||
|
Need to check
err
before referencingprog
here otherwise it will panic as it did for a recent reddit user.