go/loader: normalize cycle to remove flake
Fixes golang/go#31279 Change-Id: Idd1eead3b1e9a90ba39d04019ef32200deb4c983 Reviewed-on: https://go-review.googlesource.com/c/tools/+/185984 Run-TryBot: Michael Matloob <matloob@golang.org> Reviewed-by: Ian Cottrell <iancottrell@google.com>
This commit is contained in:
parent
607ca053a1
commit
9e48ab1d90
|
@ -811,7 +811,15 @@ func (imp *importer) doImport(from *PackageInfo, to string) (*types.Package, err
|
||||||
// Import of incomplete package: this indicates a cycle.
|
// Import of incomplete package: this indicates a cycle.
|
||||||
fromPath := from.Pkg.Path()
|
fromPath := from.Pkg.Path()
|
||||||
if cycle := imp.findPath(path, fromPath); cycle != nil {
|
if cycle := imp.findPath(path, fromPath); cycle != nil {
|
||||||
cycle = append([]string{fromPath}, cycle...)
|
// Normalize cycle: start from alphabetically largest node.
|
||||||
|
pos, start := -1, ""
|
||||||
|
for i, s := range cycle {
|
||||||
|
if pos < 0 || s > start {
|
||||||
|
pos, start = i, s
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cycle = append(cycle, cycle[:pos]...)[pos:] // rotate cycle to start from largest
|
||||||
|
cycle = append(cycle, cycle[0]) // add start node to end to show cycliness
|
||||||
return nil, fmt.Errorf("import cycle: %s", strings.Join(cycle, " -> "))
|
return nil, fmt.Errorf("import cycle: %s", strings.Join(cycle, " -> "))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue