1515from robot .parsing .lexer .tokens import Token
1616from robot .parsing .model .statements import Statement
1717
18+ from robotcode .core .concurrent import check_current_task_canceled
1819from robotcode .core .language import language_id
1920from robotcode .core .lsp .types import (
2021 AnnotatedTextEdit ,
2526 Position ,
2627 PrepareRenameResult ,
2728 PrepareRenameResultType1 ,
29+ Range ,
2830 RenameFile ,
2931 TextDocumentEdit ,
3032 WorkspaceEdit ,
@@ -142,7 +144,7 @@ def _prepare_rename_default(
142144 ) -> Optional [PrepareRenameResult ]:
143145 result = self ._find_default (nodes , document , position )
144146 if result is not None :
145- var , token = result
147+ var , found_range = result
146148
147149 if var .type == VariableDefinitionType .BUILTIN_VARIABLE :
148150 self .parent .window .show_message ("You cannot rename a builtin variable, only references are renamed." )
@@ -158,13 +160,12 @@ def _prepare_rename_default(
158160 "Only references are renamed and you have to rename the variable definition yourself."
159161 )
160162 elif var .type == VariableDefinitionType .ENVIRONMENT_VARIABLE :
161- token .value , _ , _ = token .value .partition ("=" )
162163 self .parent .window .show_message (
163164 "You are about to rename an environment variable. "
164165 "Only references are renamed and you have to rename the variable definition yourself."
165166 )
166167
167- return PrepareRenameResultType1 (range_from_token ( token ), token . value )
168+ return PrepareRenameResultType1 (found_range , document . get_text ( found_range ) )
168169
169170 return None
170171
@@ -176,7 +177,11 @@ def _rename_default(
176177 new_name : str ,
177178 ) -> Optional [WorkspaceEdit ]:
178179 result = self ._find_default (nodes , document , position )
179-
180+ if " " in new_name or "\t " in new_name :
181+ raise CantRenameError (
182+ "Variable names cannot contain more then one spaces or tabs. "
183+ "Please use only one space or underscores instead." ,
184+ )
180185 if result is not None :
181186 var , _ = result
182187
@@ -209,49 +214,29 @@ def _rename_default(
209214
210215 def _find_default (
211216 self , nodes : List [ast .AST ], document : TextDocument , position : Position
212- ) -> Optional [Tuple [VariableDefinition , Token ]]:
213- from robot .parsing .lexer .tokens import Token as RobotToken
214-
217+ ) -> Optional [Tuple [VariableDefinition , Range ]]:
215218 namespace = self .parent .documents_cache .get_namespace (document )
216219
217- if not nodes :
218- return None
219-
220- node = nodes [- 1 ]
221-
222- if not isinstance (node , Statement ):
223- return None
224-
225- tokens = get_tokens_at_position (node , position )
226-
227- token_and_var : Optional [Tuple [VariableDefinition , Token ]] = None
228-
229- for token in tokens :
230- token_and_var = next (
231- (
232- (var , var_token )
233- for var_token , var in self .iter_variables_from_token (token , namespace , nodes , position )
234- if position in range_from_token (var_token )
235- ),
236- None ,
237- )
238-
239- if (
240- token_and_var is None
241- and isinstance (node , self .get_expression_statement_types ())
242- and (token := node .get_token (RobotToken .ARGUMENT )) is not None
243- and position in range_from_token (token )
244- ):
245- token_and_var = next (
246- (
247- (var , var_token )
248- for var_token , var in self .iter_expression_variables_from_token (token , namespace , nodes , position )
249- if position in range_from_token (var_token )
250- ),
251- None ,
252- )
220+ all_variable_refs = namespace .get_variable_references ()
221+ if all_variable_refs :
222+ for variable , var_refs in all_variable_refs .items ():
223+ check_current_task_canceled ()
224+
225+ found_range = (
226+ variable .name_range
227+ if variable .source == namespace .source and position .is_in_range (variable .name_range , False )
228+ else cast (
229+ Optional [Range ],
230+ next (
231+ (r .range for r in var_refs if position .is_in_range (r .range )),
232+ None ,
233+ ),
234+ )
235+ )
253236
254- return token_and_var
237+ if found_range is not None :
238+ return variable , found_range
239+ return None
255240
256241 def _prepare_rename_keyword (self , result : Optional [Tuple [KeywordDoc , Token ]]) -> Optional [PrepareRenameResult ]:
257242 if result is not None :
0 commit comments