func (c *converter) convertPkgName(v *gotypes.PkgName) *types.PkgName { if v == nil { return nil } if v, ok := c.converted[v]; ok { return v.(*types.PkgName) } ret := types.NewPkgName( token.Pos(v.Pos()), c.ret, v.Name(), c.convertPackage(v.Imported()), ) c.converted[v] = ret return ret }
// checkInFileBlock performs safety checks for renames of objects in the file block, // i.e. imported package names. func (r *renamer) checkInFileBlock(from *types.PkgName) { // Check import name is not "init". if r.to == "init" { r.errorf(from.Pos(), "%q is not a valid imported package name", r.to) } // Check for conflicts between file and package block. if prev := from.Pkg().Scope().Lookup(r.to); prev != nil { r.errorf(from.Pos(), "renaming this %s %q to %q would conflict", objectKind(from), from.Name(), r.to) r.errorf(prev.Pos(), "\twith this package member %s", objectKind(prev)) return // since checkInPackageBlock would report redundant errors } // Check for conflicts in lexical scope. r.checkInLexicalScope(from, r.packages[from.Pkg()]) // Finally, modify ImportSpec syntax to add or remove the Name as needed. info, path, _ := r.iprog.PathEnclosingInterval(from.Pos(), from.Pos()) if from.Imported().Name() == r.to { // ImportSpec.Name not needed path[1].(*ast.ImportSpec).Name = nil } else { // ImportSpec.Name needed if spec := path[1].(*ast.ImportSpec); spec.Name == nil { spec.Name = &ast.Ident{NamePos: spec.Path.Pos(), Name: r.to} info.Defs[spec.Name] = from } } }