ollie/tools/lsp_rename

44 lines
1.5 KiB
Python
Executable File

#!/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.")