aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMatthew Dempsky <mdempsky@google.com>2022-07-27 14:24:46 -0700
committerMatthew Dempsky <mdempsky@google.com>2022-07-28 07:31:58 +0000
commitc8d5ccf82ec24ff3855c1717d46df6a0c60684de (patch)
tree7a6a4fbd30fc6c37ba3012d84d384be81fa23f6e /src
parentac0844ec274bf6cfd64bc8fa1e2cc8b24c789dee (diff)
downloadgo-c8d5ccf82ec24ff3855c1717d46df6a0c60684de.tar.xz
[dev.unified] go/internal/gcimporter: flatten imports
The current documentation for go/types.(*Packages).Imports requires that the import graph be flattened when read from export data. I think this is a documentation bug (incorrectly codifying the existing behavior, rather than documenting it as a known bug), but until that's decided, we can at least flatten imports ourselves. Updates #54096. Change-Id: Idc054a2efc908b3e6651e6567d0ea0e89bb0c54d Reviewed-on: https://go-review.googlesource.com/c/go/+/419596 Run-TryBot: Matthew Dempsky <mdempsky@google.com> Reviewed-by: David Chase <drchase@google.com> TryBot-Result: Gopher Robot <gobot@golang.org>
Diffstat (limited to 'src')
-rw-r--r--src/go/internal/gcimporter/ureader.go32
1 files changed, 31 insertions, 1 deletions
diff --git a/src/go/internal/gcimporter/ureader.go b/src/go/internal/gcimporter/ureader.go
index 2047ad8ae9..5e133f890b 100644
--- a/src/go/internal/gcimporter/ureader.go
+++ b/src/go/internal/gcimporter/ureader.go
@@ -206,11 +206,41 @@ func (r *reader) doPkg() *types.Package {
for i := range imports {
imports[i] = r.pkg()
}
- pkg.SetImports(imports)
+
+ // The documentation for (*types.Package).Imports requires
+ // flattening the import graph when reading from export data, as
+ // obviously incorrect as that is.
+ //
+ // TODO(mdempsky): Remove this if go.dev/issue/54096 is accepted.
+ pkg.SetImports(flattenImports(imports))
return pkg
}
+// flattenImports returns the transitive closure of all imported
+// packages rooted from pkgs.
+func flattenImports(pkgs []*types.Package) []*types.Package {
+ var res []*types.Package
+
+ seen := make(map[*types.Package]bool)
+ var add func(pkg *types.Package)
+ add = func(pkg *types.Package) {
+ if seen[pkg] {
+ return
+ }
+ seen[pkg] = true
+ res = append(res, pkg)
+ for _, imp := range pkg.Imports() {
+ add(imp)
+ }
+ }
+
+ for _, pkg := range pkgs {
+ add(pkg)
+ }
+ return res
+}
+
// @@@ Types
func (r *reader) typ() types.Type {