// canExtractToNewFile reports whether the code in the given range can be extracted to a new file. func canExtractToNewFile(pgf *parsego.File, start, end token.Pos) bool { … } // findImportEdits finds imports specs that needs to be added to the new file // or deleted from the old file if the range is extracted to a new file. // // TODO: handle dot imports. func findImportEdits(file *ast.File, info *types.Info, start, end token.Pos) (adds, deletes []*ast.ImportSpec, _ error) { … } // ExtractToNewFile moves selected declarations into a new file. func ExtractToNewFile(ctx context.Context, snapshot *cache.Snapshot, fh file.Handle, rng protocol.Range) (*protocol.WorkspaceEdit, error) { … } // chooseNewFile chooses a new filename in dir, based on the name of the // first extracted symbol, and if necessary to disambiguate, a numeric suffix. func chooseNewFile(ctx context.Context, snapshot *cache.Snapshot, dir string, firstSymbol string) (file.Handle, error) { … } // selectedToplevelDecls returns the lexical extent of the top-level // declarations enclosed by [start, end), along with the name of the // first declaration. The returned boolean reports whether the selection // should be offered a code action to extract the declarations. func selectedToplevelDecls(pgf *parsego.File, start, end token.Pos) (token.Pos, token.Pos, string, bool) { … } // unparenthesizedImports returns a map from each unparenthesized ImportSpec // to its enclosing declaration (which may need to be deleted too). func unparenthesizedImports(pgf *parsego.File) map[*ast.ImportSpec]*ast.GenDecl { … } // removeNode returns a TextEdit that removes the node. func removeNode(pgf *parsego.File, node ast.Node) protocol.TextEdit { … } // posRangeIntersects checks if [a, b) and [c, d) intersects, assuming a <= b and c <= d. func posRangeIntersects(a, b, c, d token.Pos) bool { … } // posRangeContains checks if [a, b) contains [c, d), assuming a <= b and c <= d. func posRangeContains(a, b, c, d token.Pos) bool { … }