Skip to content

Commit f51bbbe

Browse files
authored
fix: consider priority_selector when using best_session during rename (#2538)
1 parent c7d622c commit f51bbbe

File tree

1 file changed

+23
-18
lines changed

1 file changed

+23
-18
lines changed

plugin/rename.py

+23-18
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
from .core.registry import windows
1414
from .core.sessions import Session
1515
from .core.url import parse_uri
16-
from .core.views import first_selection_region
1716
from .core.views import get_line
1817
from .core.views import range_to_region
1918
from .core.views import text_document_position_params
@@ -66,6 +65,8 @@
6665
]
6766
})
6867

68+
PREPARE_RENAME_CAPABILITY = "renameProvider.prepareProvider"
69+
6970

7071
def is_range_response(result: PrepareRenameResult) -> TypeGuard[Range]:
7172
return 'start' in result
@@ -122,6 +123,7 @@ def is_visible(
122123
self,
123124
new_name: str = "",
124125
placeholder: str = "",
126+
session_name: str | None = None,
125127
event: dict | None = None,
126128
point: int | None = None
127129
) -> bool:
@@ -133,19 +135,17 @@ def input(self, args: dict) -> sublime_plugin.TextInputHandler | None:
133135
if "new_name" in args:
134136
# Defer to "run" and trigger rename.
135137
return None
136-
prepare_provider_session = self.best_session("renameProvider.prepareProvider")
137-
if prepare_provider_session and "placeholder" not in args:
138+
point = get_position(self.view, point=args.get('point'))
139+
if point is None:
140+
# Defer to "run" and trigger rename.
141+
return None
142+
session = self._get_prepare_rename_session(point, args.get('session_name'))
143+
if session and "placeholder" not in args:
138144
# Defer to "run" and trigger "prepare" request.
139145
return None
140146
placeholder = args.get("placeholder", "")
141147
if not placeholder:
142-
point = args.get("point")
143148
# guess the symbol name
144-
if not isinstance(point, int):
145-
region = first_selection_region(self.view)
146-
if region is None:
147-
return None
148-
point = region.b
149149
placeholder = self.view.substr(self.view.word(point))
150150
return RenameSymbolInputHandler(self.view, placeholder)
151151

@@ -154,29 +154,34 @@ def run(
154154
edit: sublime.Edit,
155155
new_name: str = "",
156156
placeholder: str = "",
157+
session_name: str | None = None,
157158
event: dict | None = None,
158159
point: int | None = None
159160
) -> None:
160161
listener = self.get_listener()
161162
if listener:
162163
listener.purge_changes_async()
163164
location = get_position(self.view, event, point)
164-
prepare_provider_session = self.best_session("renameProvider.prepareProvider")
165-
if new_name or placeholder or not prepare_provider_session:
165+
session = self._get_prepare_rename_session(point, session_name)
166+
if new_name or placeholder or not session:
166167
if location is not None and new_name:
167-
self._do_rename(location, new_name)
168+
self._do_rename(location, new_name, session)
168169
return
169170
# Trigger InputHandler manually.
170171
raise TypeError("required positional argument")
171172
if location is None:
172173
return
173174
params = cast(PrepareRenameParams, text_document_position_params(self.view, location))
174175
request = Request.prepareRename(params, self.view, progress=True)
175-
prepare_provider_session.send_request(
176-
request, partial(self._on_prepare_result, location), self._on_prepare_error)
176+
session.send_request(
177+
request, partial(self._on_prepare_result, location, session.config.name), self._on_prepare_error)
178+
179+
def _get_prepare_rename_session(self, point: int | None, session_name: str | None) -> Session | None:
180+
return self.session_by_name(session_name, PREPARE_RENAME_CAPABILITY) if session_name \
181+
else self.best_session(PREPARE_RENAME_CAPABILITY, point)
177182

178-
def _do_rename(self, position: int, new_name: str) -> None:
179-
session = self.best_session(self.capability)
183+
def _do_rename(self, position: int, new_name: str, preferred_session: Session | None) -> None:
184+
session = preferred_session or self.best_session(self.capability, position)
180185
if not session:
181186
return
182187
position_params = text_document_position_params(self.view, position)
@@ -204,7 +209,7 @@ def _on_rename_result_async(self, session: Session, response: WorkspaceEdit | No
204209
elif choice == sublime.DialogResult.NO:
205210
self._render_rename_panel(response, changes, total_changes, file_count, session.config.name)
206211

207-
def _on_prepare_result(self, pos: int, response: PrepareRenameResult | None) -> None:
212+
def _on_prepare_result(self, pos: int, session_name: str | None, response: PrepareRenameResult | None) -> None:
208213
if response is None:
209214
sublime.error_message("The current selection cannot be renamed")
210215
return
@@ -217,7 +222,7 @@ def _on_prepare_result(self, pos: int, response: PrepareRenameResult | None) ->
217222
pos = range_to_region(response["range"], self.view).a # type: ignore
218223
else:
219224
placeholder = self.view.substr(self.view.word(pos))
220-
args = {"placeholder": placeholder, "point": pos}
225+
args = {"placeholder": placeholder, "point": pos, "session_name": session_name}
221226
self.view.run_command("lsp_symbol_rename", args)
222227

223228
def _on_prepare_error(self, error: Any) -> None:

0 commit comments

Comments
 (0)