#!/usr/bin/env python3 # ollie:prompt # ## lsp_rename # # Rename symbol across workspace. Applies edits directly. # # **Args**: `[path, line, col, new_name]` # # ``` # call_tool: calls=[{tool: "lsp_rename", args: ["/abs/path.go", "42", "10", "NewName"]}] # ``` # # **Prefer over manual find-and-replace** — understands scope, interfaces, cross-package references. # ollie:end import os import sys sys.path.insert(0, os.environ.get('OLLIE_TOOLS_PATH', os.path.dirname(os.path.abspath(__file__)))) from _lib.lsp.client import request if len(sys.argv) < 5: print('{"schema": {"type": "array", "items": [{"name": "file", "type": "string", "description": "File path", "required": true}, {"name": "line", "type": "string", "description": "Line number (1-indexed)", "required": true}, {"name": "col", "type": "string", "description": "Column number", "required": true}, {"name": "new_name", "type": "string", "description": "New symbol name", "required": true}], "examples": [["/path/to/file.go", "42", "5", "newName"]]}}') sys.exit(1) filepath = os.path.abspath(sys.argv[1]) line = int(sys.argv[2]) - 1 col = int(sys.argv[3]) - 1 new_name = sys.argv[4] result = request("rename", file=filepath, line=line, col=col, new_name=new_name) if not result: print("(rename returned no edits)") sys.exit(0) files_changed = result.get("files_changed", {}) total = result.get("total_edits", 0) for path, count in files_changed.items(): print(f" {path} ({count} edits)") print(f"\nRenamed to '{new_name}': {total} edits across {len(files_changed)} files.")