]> Cypherpunks repositories - gostls13.git/commitdiff
go/internal/gcimporter: backport flattenImports optimization
authorMatthew Dempsky <mdempsky@google.com>
Tue, 15 Nov 2022 19:08:03 +0000 (11:08 -0800)
committerGopher Robot <gobot@golang.org>
Tue, 15 Nov 2022 20:23:54 +0000 (20:23 +0000)
Backport of go.dev/cl/450755 from the x/tools importer.

Change-Id: Ia9a2cc038d589a4cde1b31f74484a5f88dabeef9
Reviewed-on: https://go-review.googlesource.com/c/go/+/450795
Auto-Submit: Matthew Dempsky <mdempsky@google.com>
Reviewed-by: Florian Zenker <floriank@google.com>
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
Reviewed-by: David Chase <drchase@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>

src/go/internal/gcimporter/ureader.go

index 94c1f2802a2b249be1bcaadfc370a5ec15954124..c2b9a58ee7478a7e5b4cbf71bd271aac8f30b0b1 100644 (file)
@@ -252,22 +252,22 @@ func (r *reader) doPkg() *types.Package {
 // 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 := make(map[*types.Package]struct{})
+       for _, pkg := range pkgs {
+               if _, ok := seen[pkg]; ok {
+                       continue
                }
-               seen[pkg] = true
+               seen[pkg] = struct{}{}
                res = append(res, pkg)
-               for _, imp := range pkg.Imports() {
-                       add(imp)
-               }
-       }
 
-       for _, pkg := range pkgs {
-               add(pkg)
+               // pkg.Imports() is already flattened.
+               for _, pkg := range pkg.Imports() {
+                       if _, ok := seen[pkg]; ok {
+                               continue
+                       }
+                       seen[pkg] = struct{}{}
+                       res = append(res, pkg)
+               }
        }
        return res
 }