type renamer … type PrepareItem … // PrepareRename searches for a valid renaming at position pp. // // The returned usererr is intended to be displayed to the user to explain why // the prepare fails. Probably we could eliminate the redundancy in returning // two errors, but for now this is done defensively. func PrepareRename(ctx context.Context, snapshot *cache.Snapshot, f file.Handle, pp protocol.Position) (_ *PrepareItem, usererr, err error) { … } func prepareRenamePackageName(ctx context.Context, snapshot *cache.Snapshot, pgf *parsego.File) (*PrepareItem, error) { … } func checkRenamable(obj types.Object) error { … } // Rename returns a map of TextEdits for each file modified when renaming a // given identifier within a package and a boolean value of true for renaming // package and false otherwise. func Rename(ctx context.Context, snapshot *cache.Snapshot, f file.Handle, pp protocol.Position, newName string) (map[protocol.DocumentURI][]protocol.TextEdit, bool, error) { … } // renameOrdinary renames an ordinary (non-package) name throughout the workspace. func renameOrdinary(ctx context.Context, snapshot *cache.Snapshot, f file.Handle, pp protocol.Position, newName string) (map[protocol.DocumentURI][]diff.Edit, error) { … } // typeCheckReverseDependencies returns the type-checked packages for // the reverse dependencies of all packages variants containing // file declURI. The packages are in some topological order. // // It includes all variants (even intermediate test variants) for the // purposes of computing reverse dependencies, but discards ITVs for // the actual renaming work. // // (This neglects obscure edge cases where a _test.go file changes the // selectors used only in an ITV, but life is short. Also sin must be // punished.) func typeCheckReverseDependencies(ctx context.Context, snapshot *cache.Snapshot, declURI protocol.DocumentURI, transitive bool) ([]*cache.Package, error) { … } // renameExported renames the object denoted by (pkgPath, objPath) // within the specified packages, along with any other objects that // must be renamed as a consequence. The slice of packages must be // topologically ordered. func renameExported(pkgs []*cache.Package, declPkgPath PackagePath, declObjPath objectpath.Path, newName string) (map[protocol.DocumentURI][]diff.Edit, error) { … } // renamePackageName renames package declarations, imports, and go.mod files. func renamePackageName(ctx context.Context, s *cache.Snapshot, f file.Handle, newName PackageName) (map[protocol.DocumentURI][]diff.Edit, error) { … } // renamePackage computes all workspace edits required to rename the package // described by the given metadata, to newName, by renaming its package // directory. // // It updates package clauses and import paths for the renamed package as well // as any other packages affected by the directory renaming among all packages // known to the snapshot. func renamePackage(ctx context.Context, s *cache.Snapshot, f file.Handle, newName PackageName) (map[protocol.DocumentURI][]diff.Edit, error) { … } // renamePackageClause computes edits renaming the package clause of files in // the package described by the given metadata, to newName. // // Edits are written into the edits map. func renamePackageClause(ctx context.Context, mp *metadata.Package, snapshot *cache.Snapshot, newName PackageName, edits map[protocol.DocumentURI][]diff.Edit) error { … } // renameImports computes the set of edits to imports resulting from renaming // the package described by the given metadata, to a package with import path // newPath and name newName. // // Edits are written into the edits map. func renameImports(ctx context.Context, snapshot *cache.Snapshot, mp *metadata.Package, newPath ImportPath, newName PackageName, allEdits map[protocol.DocumentURI][]diff.Edit) error { … } // renameObjects computes the edits to the type-checked syntax package pkg // required to rename a set of target objects to newName. // // It also returns the set of objects that were found (due to // corresponding methods and embedded fields) to require renaming as a // consequence of the requested renamings. // // It returns an error if the renaming would cause a conflict. func renameObjects(newName string, pkg *cache.Package, targets ...types.Object) (map[protocol.DocumentURI][]diff.Edit, map[types.Object]bool, error) { … } // Rename all references to the target objects. func (r *renamer) update() (map[protocol.DocumentURI][]diff.Edit, error) { … } // updateCommentDocLinks updates each doc comment in the package // that refers to one of the renamed objects using a doc link // (https://golang.org/doc/comment#doclinks) such as "[pkg.Type.Method]". func (r *renamer) updateCommentDocLinks() (map[protocol.DocumentURI][]diff.Edit, error) { … } // docLinkPattern returns a regular expression that matches doclinks in comments. // It has one submatch that indicates the symbol to be updated. func docLinkPattern(pkgName, recvName, objName string, isPkgOrType bool) *regexp.Regexp { … } type docLinkRenamer … // update updates doc links in the package level comments. func (r *docLinkRenamer) update(pgf *parsego.File) (result []diff.Edit, err error) { … } // docComment returns the doc for an identifier within the specified file. func docComment(pgf *parsego.File, id *ast.Ident) *ast.CommentGroup { … } // updatePkgName returns the updates to rename a pkgName in the import spec by // only modifying the package name portion of the import declaration. func (r *renamer) updatePkgName(pgf *parsego.File, pkgName *types.PkgName) (diff.Edit, error) { … } // parsePackageNameDecl is a convenience function that parses and // returns the package name declaration of file fh, and reports // whether the position ppos lies within it. // // Note: also used by references. func parsePackageNameDecl(ctx context.Context, snapshot *cache.Snapshot, fh file.Handle, ppos protocol.Position) (*parsego.File, bool, error) { … } // enclosingFile returns the CompiledGoFile of pkg that contains the specified position. func enclosingFile(pkg *cache.Package, pos token.Pos) (*parsego.File, bool) { … } // posEdit returns an edit to replace the (start, end) range of tf with 'new'. func posEdit(tf *token.File, start, end token.Pos, new string) (diff.Edit, error) { … }