[tools] internal/refactor/inline: make soleUse asymptotically faster

3 views
Skip to first unread message

Alan Donovan (Gerrit)

unread,
Nov 3, 2025, 5:37:18 PM (3 days ago) Nov 3
to goph...@pubsubhelper.golang.org, golang-co...@googlegroups.com

Alan Donovan has uploaded the change for review

Commit message

internal/refactor/inline: make soleUse asymptotically faster

Fixes golang/go#75773
Change-Id: Ie1e562ef5a9ba01b5d54cd7e69fffcda36f9a2e9

Change diff

diff --git a/internal/refactor/inline/inline.go b/internal/refactor/inline/inline.go
index c3055be..92ff65d 100644
--- a/internal/refactor/inline/inline.go
+++ b/internal/refactor/inline/inline.go
@@ -425,12 +425,35 @@
// For simplicity we ignore existing dot imports, so that a qualified
// identifier (QI) in the callee is always represented by a QI in the caller,
// allowing us to treat a QI like a selection on a package name.
- is := &importState{
+ ist := &importState{
logf: logf,
caller: caller,
importMap: make(map[string][]string),
}

+ // Build an index of used-once PkgNames.
+ type pkgNameUse struct {
+ count int
+ id *ast.Ident // an arbitrary use
+ }
+ pkgNameUses := make(map[*types.PkgName]pkgNameUse)
+ for id, obj := range caller.Info.Uses {
+ if pkgname, ok := obj.(*types.PkgName); ok {
+ u := pkgNameUses[pkgname]
+ u.id = id
+ u.count++
+ pkgNameUses[pkgname] = u
+ }
+ }
+ // soleUse returns the ident that refers to pkgname, if there is exactly one.
+ soleUse := func(pkgname *types.PkgName) *ast.Ident {
+ u := pkgNameUses[pkgname]
+ if u.count == 1 {
+ return u.id
+ }
+ return nil
+ }
+
for _, imp := range caller.File.Imports {
if pkgName, ok := importedPkgName(caller.Info, imp); ok &&
pkgName.Name() != "." &&
@@ -449,7 +472,7 @@
// need this import. Doing so eagerly simplifies the resulting logic.
needed := true
sel, ok := ast.Unparen(caller.Call.Fun).(*ast.SelectorExpr)
- if ok && soleUse(caller.Info, pkgName) == sel.X {
+ if ok && soleUse(pkgName) == sel.X {
needed = false // no longer needed by caller
// Check to see if any of the inlined free objects need this package.
for _, obj := range callee.FreeObjs {
@@ -464,13 +487,13 @@
// return value holds these.
if needed {
path := pkgName.Imported().Path()
- is.importMap[path] = append(is.importMap[path], pkgName.Name())
+ ist.importMap[path] = append(ist.importMap[path], pkgName.Name())
} else {
- is.oldImports = append(is.oldImports, oldImport{pkgName: pkgName, spec: imp})
+ ist.oldImports = append(ist.oldImports, oldImport{pkgName: pkgName, spec: imp})
}
}
}
- return is
+ return ist
}

// importName finds an existing import name to use in a particular shadowing
@@ -3726,18 +3749,4 @@
return false
}

-// soleUse returns the ident that refers to obj, if there is exactly one.
-func soleUse(info *types.Info, obj types.Object) (sole *ast.Ident) {
- // This is not efficient, but it is called infrequently.
- for id, obj2 := range info.Uses {
- if obj2 == obj {
- if sole != nil {
- return nil // not unique
- }
- sole = id
- }
- }
- return sole
-}
-
type unit struct{} // for representing sets as maps

Change information

Files:
  • M internal/refactor/inline/inline.go
Change size: S
Delta: 1 file changed, 28 insertions(+), 19 deletions(-)
Open in Gerrit

Related details

Attention set is empty
Submit Requirements:
  • requirement is not satisfiedCode-Review
  • requirement satisfiedNo-Unresolved-Comments
  • requirement is not satisfiedReview-Enforcement
  • requirement is not satisfiedTryBots-Pass
Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
Gerrit-MessageType: newchange
Gerrit-Project: tools
Gerrit-Branch: master
Gerrit-Change-Id: Ie1e562ef5a9ba01b5d54cd7e69fffcda36f9a2e9
Gerrit-Change-Number: 717540
Gerrit-PatchSet: 1
Gerrit-Owner: Alan Donovan <adon...@google.com>
Gerrit-Reviewer: Alan Donovan <adon...@google.com>
unsatisfied_requirement
satisfied_requirement
open
diffy

Alan Donovan (Gerrit)

unread,
Nov 3, 2025, 5:37:28 PM (3 days ago) Nov 3
to goph...@pubsubhelper.golang.org, Robert Findley, Go LUCI, golang-co...@googlegroups.com
Attention needed from Robert Findley

Alan Donovan voted Auto-Submit+1

Auto-Submit+1
Open in Gerrit

Related details

Attention is currently required from:
  • Robert Findley
Submit Requirements:
  • requirement is not satisfiedCode-Review
  • requirement satisfiedNo-Unresolved-Comments
  • requirement is not satisfiedReview-Enforcement
  • requirement is not satisfiedTryBots-Pass
Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
Gerrit-MessageType: comment
Gerrit-Project: tools
Gerrit-Branch: master
Gerrit-Change-Id: Ie1e562ef5a9ba01b5d54cd7e69fffcda36f9a2e9
Gerrit-Change-Number: 717540
Gerrit-PatchSet: 1
Gerrit-Owner: Alan Donovan <adon...@google.com>
Gerrit-Reviewer: Alan Donovan <adon...@google.com>
Gerrit-Reviewer: Robert Findley <rfin...@google.com>
Gerrit-Attention: Robert Findley <rfin...@google.com>
Gerrit-Comment-Date: Mon, 03 Nov 2025 22:37:25 +0000
Gerrit-HasComments: No
Gerrit-Has-Labels: Yes
unsatisfied_requirement
satisfied_requirement
open
diffy

Robert Findley (Gerrit)

unread,
Nov 3, 2025, 9:03:11 PM (2 days ago) Nov 3
to Alan Donovan, goph...@pubsubhelper.golang.org, Go LUCI, golang-co...@googlegroups.com
Attention needed from Alan Donovan

Robert Findley voted Code-Review+2

Code-Review+2
Open in Gerrit

Related details

Attention is currently required from:
  • Alan Donovan
Submit Requirements:
  • requirement satisfiedCode-Review
  • requirement satisfiedNo-Unresolved-Comments
  • requirement satisfiedReview-Enforcement
  • requirement satisfiedTryBots-Pass
Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
Gerrit-MessageType: comment
Gerrit-Project: tools
Gerrit-Branch: master
Gerrit-Change-Id: Ie1e562ef5a9ba01b5d54cd7e69fffcda36f9a2e9
Gerrit-Change-Number: 717540
Gerrit-PatchSet: 1
Gerrit-Owner: Alan Donovan <adon...@google.com>
Gerrit-Reviewer: Alan Donovan <adon...@google.com>
Gerrit-Reviewer: Robert Findley <rfin...@google.com>
Gerrit-Attention: Alan Donovan <adon...@google.com>
Gerrit-Comment-Date: Tue, 04 Nov 2025 02:03:07 +0000
Gerrit-HasComments: No
Gerrit-Has-Labels: Yes
satisfied_requirement
open
diffy

Gopher Robot (Gerrit)

unread,
Nov 3, 2025, 9:03:22 PM (2 days ago) Nov 3
to Alan Donovan, goph...@pubsubhelper.golang.org, golang-...@googlegroups.com, Robert Findley, Go LUCI, golang-co...@googlegroups.com

Gopher Robot submitted the change

Change information

Commit message:
internal/refactor/inline: make soleUse asymptotically faster

Fixes golang/go#75773
Change-Id: Ie1e562ef5a9ba01b5d54cd7e69fffcda36f9a2e9
Auto-Submit: Alan Donovan <adon...@google.com>
Reviewed-by: Robert Findley <rfin...@google.com>
Files:
  • M internal/refactor/inline/inline.go
Change size: S
Delta: 1 file changed, 28 insertions(+), 19 deletions(-)
Branch: refs/heads/master
Submit Requirements:
  • requirement satisfiedCode-Review: +2 by Robert Findley
  • requirement satisfiedTryBots-Pass: LUCI-TryBot-Result+1 by Go LUCI
Open in Gerrit
Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
Gerrit-MessageType: merged
Gerrit-Project: tools
Gerrit-Branch: master
Gerrit-Change-Id: Ie1e562ef5a9ba01b5d54cd7e69fffcda36f9a2e9
Gerrit-Change-Number: 717540
Gerrit-PatchSet: 2
Gerrit-Owner: Alan Donovan <adon...@google.com>
Gerrit-Reviewer: Alan Donovan <adon...@google.com>
Gerrit-Reviewer: Gopher Robot <go...@golang.org>
Gerrit-Reviewer: Robert Findley <rfin...@google.com>
open
diffy
satisfied_requirement
Reply all
Reply to author
Forward
0 new messages