@@ -491,14 +491,10 @@ func (i *importState) importName(pkgPath string, shadow shadowMap) string {
491491 return ""
492492}
493493
494- // localName returns the local name for a given imported package path,
495- // adding one if it doesn't exists.
496- func (i * importState ) localName (pkgPath , pkgName string , shadow shadowMap ) string {
497- // Does an import already exist that works in this shadowing context?
498- if name := i .importName (pkgPath , shadow ); name != "" {
499- return name
500- }
501-
494+ // findNewLocalName returns a new local name to use in a particular shadowing
495+ // context. It considers the existing package alias, or construct a new alias
496+ // based on the package name.
497+ func (i * importState ) findNewLocalName (pkgName , pkgAlias string , shadow shadowMap ) string {
502498 newlyAdded := func (name string ) bool {
503499 return slices .ContainsFunc (i .newImports , func (n newImport ) bool { return n .pkgName == name })
504500 }
@@ -516,20 +512,35 @@ func (i *importState) localName(pkgPath, pkgName string, shadow shadowMap) strin
516512
517513 // import added by callee
518514 //
519- // Choose local PkgName based on last segment of
515+ // Try to preserve the package alias first.
516+ //
517+ // If that is shadowed, choose local PkgName based on last segment of
520518 // package path plus, if needed, a numeric suffix to
521519 // ensure uniqueness.
522520 //
523521 // "init" is not a legal PkgName.
524- //
525- // TODO(rfindley): is it worth preserving local package names for callee
526- // imports? Are they likely to be better or worse than the name we choose
527- // here?
522+ if shadow [ pkgAlias ] == 0 && ! shadowedInCaller ( pkgAlias ) && ! newlyAdded ( pkgAlias ) && pkgAlias != "init" {
523+ return pkgAlias
524+ }
525+
528526 base := pkgName
529527 name := base
530528 for n := 0 ; shadow [name ] != 0 || shadowedInCaller (name ) || newlyAdded (name ) || name == "init" ; n ++ {
531529 name = fmt .Sprintf ("%s%d" , base , n )
532530 }
531+
532+ return name
533+ }
534+
535+ // localName returns the local name for a given imported package path,
536+ // adding one if it doesn't exists.
537+ func (i * importState ) localName (pkgPath , pkgName , pkgAlias string , shadow shadowMap ) string {
538+ // Does an import already exist that works in this shadowing context?
539+ if name := i .importName (pkgPath , shadow ); name != "" {
540+ return name
541+ }
542+
543+ name := i .findNewLocalName (pkgName , pkgAlias , shadow )
533544 i .logf ("adding import %s %q" , name , pkgPath )
534545 spec := & ast.ImportSpec {
535546 Path : & ast.BasicLit {
@@ -1338,7 +1349,7 @@ func (st *state) renameFreeObjs(istate *importState) ([]ast.Expr, error) {
13381349 var newName ast.Expr
13391350 if obj .Kind == "pkgname" {
13401351 // Use locally appropriate import, creating as needed.
1341- n := istate .localName (obj .PkgPath , obj .PkgName , obj .Shadow )
1352+ n := istate .localName (obj .PkgPath , obj .PkgName , obj .Name , obj . Shadow )
13421353 newName = makeIdent (n ) // imported package
13431354 } else if ! obj .ValidPos {
13441355 // Built-in function, type, or value (e.g. nil, zero):
@@ -1383,7 +1394,7 @@ func (st *state) renameFreeObjs(istate *importState) ([]ast.Expr, error) {
13831394
13841395 // Form a qualified identifier, pkg.Name.
13851396 if qualify {
1386- pkgName := istate .localName (obj .PkgPath , obj .PkgName , obj .Shadow )
1397+ pkgName := istate .localName (obj .PkgPath , obj .PkgName , obj .PkgName , obj . Shadow )
13871398 newName = & ast.SelectorExpr {
13881399 X : makeIdent (pkgName ),
13891400 Sel : makeIdent (obj .Name ),
0 commit comments