@@ -97,33 +97,13 @@ pub struct RenameCollisionInfo {
9797
9898pub ( crate ) fn prepare_rename (
9999 db : & RootDb ,
100- FilePosition { file_id, offset } : FilePosition ,
100+ position @ FilePosition { file_id, .. } : FilePosition ,
101101 config : RenameConfig ,
102102) -> RenameResult < TextRange > {
103103 let sema = Semantics :: new ( db) ;
104- let hir_file_id = file_id. into ( ) ;
105- let parsed_file = sema. parse_file ( file_id) ;
106- let target = resolve_semantic_target (
107- db,
108- file_id,
109- offset,
110- parsed_file. root ( ) ,
111- TargetIntent :: Rename ,
112- rename_token_precedence,
113- ) ;
114- let SemanticTarget :: Source ( target) = target. for_rename ( ) . ok_or ( RenameError :: NoRefFound ) ? else {
115- return Err ( RenameError :: NoRefFound ) ;
116- } ;
117- let token = target. into_tokens ( ) . into_iter ( ) . next ( ) . ok_or ( RenameError :: NoRefFound ) ?;
118- let text_range = token. text_range ( ) . ok_or ( RenameError :: NoRefFound ) ?;
119- let def =
120- match DefinitionClass :: resolve ( & sema, hir_file_id, token) . ok_or ( RenameError :: NoDefFound ) ? {
121- DefinitionClass :: Definition ( def) => def,
122- DefinitionClass :: PortConnShorthand { local, .. } => local,
123- DefinitionClass :: Ambiguous ( _) => return Err ( RenameError :: NoDefFound ) ,
124- } ;
125- let _ = config. references_config ( db, & def, file_id) ?;
126- Ok ( text_range)
104+ let target = resolve_rename_target ( & sema, position) ?;
105+ let _ = config. references_config ( db, & target. selected_def , file_id) ?;
106+ Ok ( target. range )
127107}
128108
129109pub ( crate ) fn rename (
@@ -221,6 +201,7 @@ pub(crate) fn rename_conflict_info(
221201}
222202
223203struct ResolvedRenameTarget {
204+ range : TextRange ,
224205 selected_def : Definition ,
225206 targets : Vec < Definition > ,
226207}
@@ -237,35 +218,51 @@ fn resolve_rename_target(
237218 sema : & Semantics < ' _ , RootDb > ,
238219 FilePosition { file_id, offset } : FilePosition ,
239220) -> RenameResult < ResolvedRenameTarget > {
221+ let hir_file_id = file_id. into ( ) ;
240222 let parsed_file = sema. parse_file ( file_id) ;
241223 let target = resolve_semantic_target (
242224 sema. db ,
243225 file_id,
244226 offset,
245227 parsed_file. root ( ) ,
246- TargetIntent :: Rename ,
247228 rename_token_precedence,
248229 ) ;
249- let SemanticTarget :: Source ( target) = target. for_rename ( ) . ok_or ( RenameError :: NoRefFound ) ? else {
230+ let SemanticTarget :: Source ( target) =
231+ target. for_intent ( TargetIntent :: Rename ) . ok_or ( RenameError :: NoRefFound ) ?
232+ else {
250233 return Err ( RenameError :: NoRefFound ) ;
251234 } ;
252- let token = target. into_tokens ( ) . into_iter ( ) . next ( ) . ok_or ( RenameError :: NoRefFound ) ?;
235+ let ( range, tokens) = target. into_parts ( ) ;
236+ let mut selected_def = None ;
253237 let mut targets = UniqVec :: < Definition , DefinitionOrigin > :: default ( ) ;
254- let selected_def = match DefinitionClass :: resolve ( sema, file_id. into ( ) , token)
255- . ok_or ( RenameError :: NoDefFound ) ?
256- {
257- DefinitionClass :: Definition ( def) => {
258- targets. push ( def. origins ( ) , def. clone ( ) ) ;
259- def
260- }
261- DefinitionClass :: PortConnShorthand { port, local } => {
262- targets. push ( local. origins ( ) , local. clone ( ) ) ;
263- targets. push ( port. origins ( ) , port) ;
264- local
238+
239+ for token in tokens {
240+ let token_selected = match DefinitionClass :: resolve ( sema, hir_file_id, token)
241+ . ok_or ( RenameError :: NoDefFound ) ?
242+ {
243+ DefinitionClass :: Definition ( def) => {
244+ targets. push ( def. origins ( ) , def. clone ( ) ) ;
245+ def
246+ }
247+ DefinitionClass :: PortConnShorthand { port, local } => {
248+ targets. push ( local. origins ( ) , local. clone ( ) ) ;
249+ targets. push ( port. origins ( ) , port) ;
250+ local
251+ }
252+ DefinitionClass :: Ambiguous ( _) => return Err ( RenameError :: NoDefFound ) ,
253+ } ;
254+
255+ match & selected_def {
256+ Some ( selected_def) if selected_def != & token_selected => {
257+ return Err ( RenameError :: NoDefFound ) ;
258+ }
259+ Some ( _) => { }
260+ None => selected_def = Some ( token_selected) ,
265261 }
266- DefinitionClass :: Ambiguous ( _) => return Err ( RenameError :: NoDefFound ) ,
267- } ;
268- Ok ( ResolvedRenameTarget { selected_def, targets : targets. into_vec ( ) } )
262+ }
263+
264+ let selected_def = selected_def. ok_or ( RenameError :: NoDefFound ) ?;
265+ Ok ( ResolvedRenameTarget { range, selected_def, targets : targets. into_vec ( ) } )
269266}
270267
271268#[ derive( Debug , Clone , PartialEq , Eq ) ]
0 commit comments