13
13
from .core .registry import windows
14
14
from .core .sessions import Session
15
15
from .core .url import parse_uri
16
- from .core .views import first_selection_region
17
16
from .core .views import get_line
18
17
from .core .views import range_to_region
19
18
from .core .views import text_document_position_params
66
65
]
67
66
})
68
67
68
+ PREPARE_RENAME_CAPABILITY = "renameProvider.prepareProvider"
69
+
69
70
70
71
def is_range_response (result : PrepareRenameResult ) -> TypeGuard [Range ]:
71
72
return 'start' in result
@@ -122,6 +123,7 @@ def is_visible(
122
123
self ,
123
124
new_name : str = "" ,
124
125
placeholder : str = "" ,
126
+ session_name : str | None = None ,
125
127
event : dict | None = None ,
126
128
point : int | None = None
127
129
) -> bool :
@@ -133,19 +135,17 @@ def input(self, args: dict) -> sublime_plugin.TextInputHandler | None:
133
135
if "new_name" in args :
134
136
# Defer to "run" and trigger rename.
135
137
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 :
138
144
# Defer to "run" and trigger "prepare" request.
139
145
return None
140
146
placeholder = args .get ("placeholder" , "" )
141
147
if not placeholder :
142
- point = args .get ("point" )
143
148
# 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
149
149
placeholder = self .view .substr (self .view .word (point ))
150
150
return RenameSymbolInputHandler (self .view , placeholder )
151
151
@@ -154,29 +154,34 @@ def run(
154
154
edit : sublime .Edit ,
155
155
new_name : str = "" ,
156
156
placeholder : str = "" ,
157
+ session_name : str | None = None ,
157
158
event : dict | None = None ,
158
159
point : int | None = None
159
160
) -> None :
160
161
listener = self .get_listener ()
161
162
if listener :
162
163
listener .purge_changes_async ()
163
164
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 :
166
167
if location is not None and new_name :
167
- self ._do_rename (location , new_name )
168
+ self ._do_rename (location , new_name , session )
168
169
return
169
170
# Trigger InputHandler manually.
170
171
raise TypeError ("required positional argument" )
171
172
if location is None :
172
173
return
173
174
params = cast (PrepareRenameParams , text_document_position_params (self .view , location ))
174
175
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 )
177
182
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 )
180
185
if not session :
181
186
return
182
187
position_params = text_document_position_params (self .view , position )
@@ -204,7 +209,7 @@ def _on_rename_result_async(self, session: Session, response: WorkspaceEdit | No
204
209
elif choice == sublime .DialogResult .NO :
205
210
self ._render_rename_panel (response , changes , total_changes , file_count , session .config .name )
206
211
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 :
208
213
if response is None :
209
214
sublime .error_message ("The current selection cannot be renamed" )
210
215
return
@@ -217,7 +222,7 @@ def _on_prepare_result(self, pos: int, response: PrepareRenameResult | None) ->
217
222
pos = range_to_region (response ["range" ], self .view ).a # type: ignore
218
223
else :
219
224
placeholder = self .view .substr (self .view .word (pos ))
220
- args = {"placeholder" : placeholder , "point" : pos }
225
+ args = {"placeholder" : placeholder , "point" : pos , "session_name" : session_name }
221
226
self .view .run_command ("lsp_symbol_rename" , args )
222
227
223
228
def _on_prepare_error (self , error : Any ) -> None :
0 commit comments