Skip to content

Commit c3133ad

Browse files
committed
fix rename to replace only the referenced identifier in paths
When renaming Bar in Foo::Bar, the entire path was being replaced with just the new name instead of producing Foo::Baz. Added PathView::last_segment_span() to get only the identifier span of the last segment. Added ReferenceView::rename_span() that delegates to last_segment_span for paths while returning normal spans for other reference types. Updated rename handler to use rename_span() instead of span() for text edits. This preserves goto-definition behavior (which needs full path spans to detect intermediate segment clicks) while fixing rename to only replace the actual referenced item.
1 parent 971e8d9 commit c3133ad

File tree

1 file changed

+2
-2
lines changed
  • crates/language-server/src/functionality

1 file changed

+2
-2
lines changed

crates/language-server/src/functionality/rename.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ pub async fn handle_rename(
7171
}
7272
let mod_ = map_file_to_mod(&backend.db, file);
7373
for ref_view in mod_.references_to_target(&backend.db, target.clone()) {
74-
if let Some(span) = ref_view.span().resolve(&backend.db)
74+
if let Some(span) = ref_view.rename_span(&backend.db).resolve(&backend.db)
7575
&& let Ok(range) = to_lsp_range_from_span(span, &backend.db)
7676
{
7777
changes.entry(file_url.clone()).or_default().push(TextEdit {
@@ -97,7 +97,7 @@ pub async fn handle_rename(
9797
Target::Local { span, .. } => {
9898
// For local bindings, search within the function body
9999
for ref_view in top_mod.references_to_target(&backend.db, target.clone()) {
100-
if let Some(resolved) = ref_view.span().resolve(&backend.db)
100+
if let Some(resolved) = ref_view.rename_span(&backend.db).resolve(&backend.db)
101101
&& let Some(ref_url) = resolved.file.url(&backend.db)
102102
&& let Ok(range) = to_lsp_range_from_span(resolved, &backend.db)
103103
{

0 commit comments

Comments
 (0)