From fc702c522d87139f25a871604bfac1fa2c787bf6 Mon Sep 17 00:00:00 2001 From: Florian Zenker Date: Tue, 15 Nov 2022 16:34:03 +0000 Subject: [PATCH] internal/gcimporter: fix performance regression for unified IR flattenImports used to traverse the transitive closure of all imports by recursively visiting all imported packages. This is a lot of redundant work, because flattening happens for every package, the recursion is not necessary and this change removes the recursion. Change-Id: Id5a1b3b15ef3ce8e0fc6c945b5484b3dd06bd6b6 Reviewed-on: https://go-review.googlesource.com/c/tools/+/450755 Run-TryBot: Matthew Dempsky gopls-CI: kokoro Reviewed-by: Florian Zenker Reviewed-by: Matthew Dempsky TryBot-Result: Gopher Robot --- internal/gcimporter/ureader_yes.go | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/internal/gcimporter/ureader_yes.go b/internal/gcimporter/ureader_yes.go index e09053bd37..3d3cf698b2 100644 --- a/internal/gcimporter/ureader_yes.go +++ b/internal/gcimporter/ureader_yes.go @@ -259,22 +259,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[pkg] = true - res = append(res, pkg) - for _, imp := range pkg.Imports() { - add(imp) - } - } - + seen := make(map[*types.Package]struct{}) for _, pkg := range pkgs { - add(pkg) + if _, ok := seen[pkg]; ok { + continue + } + seen[pkg] = struct{}{} + res = append(res, 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 }