56 lines
1.9 KiB
Python
56 lines
1.9 KiB
Python
# Copyright 2017-2020 Palantir Technologies, Inc.
|
|
# Copyright 2021- Python Language Server Contributors.
|
|
|
|
import logging
|
|
|
|
from pylsp import _utils, hookimpl, uris
|
|
|
|
log = logging.getLogger(__name__)
|
|
|
|
|
|
@hookimpl
|
|
def pylsp_rename(config, workspace, document, position, new_name):
|
|
log.debug(
|
|
"Executing rename of %s to %s", document.word_at_position(position), new_name
|
|
)
|
|
kwargs = _utils.position_to_jedi_linecolumn(document, position)
|
|
kwargs["new_name"] = new_name
|
|
try:
|
|
refactoring = document.jedi_script().rename(**kwargs)
|
|
except NotImplementedError as exc:
|
|
raise Exception(
|
|
"No support for renaming in Python 2/3.5 with Jedi. "
|
|
"Consider using the pylsp-rope plugin instead"
|
|
) from exc
|
|
log.debug("Finished rename: %s", refactoring.get_diff())
|
|
changes = []
|
|
|
|
changed_files = refactoring.get_changed_files()
|
|
for file_path, changed_file in changed_files.items():
|
|
uri = uris.from_fs_path(str(file_path))
|
|
doc = workspace.get_maybe_document(uri)
|
|
changes.append(
|
|
{
|
|
"textDocument": {"uri": uri, "version": doc.version if doc else None},
|
|
"edits": [
|
|
{
|
|
"range": {
|
|
"start": {"line": 0, "character": 0},
|
|
"end": {
|
|
"line": _num_lines(changed_file.get_new_code()),
|
|
"character": 0,
|
|
},
|
|
},
|
|
"newText": changed_file.get_new_code(),
|
|
}
|
|
],
|
|
}
|
|
)
|
|
return {"documentChanges": changes}
|
|
|
|
|
|
def _num_lines(file_contents):
|
|
"Count the number of lines in the given string."
|
|
if _utils.get_eol_chars(file_contents):
|
|
return len(file_contents.splitlines())
|
|
return 0
|