diff options
| -rw-r--r-- | crates/ide/src/references/rename.rs | 54 |
1 files changed, 47 insertions, 7 deletions
diff --git a/crates/ide/src/references/rename.rs b/crates/ide/src/references/rename.rs index bb68bcc78..1e378279d 100644 --- a/crates/ide/src/references/rename.rs +++ b/crates/ide/src/references/rename.rs | |||
| @@ -21,7 +21,7 @@ use crate::{display::TryToNav, FilePosition, FileSystemEdit, RangeInfo, SourceCh | |||
| 21 | 21 | ||
| 22 | type RenameResult<T> = Result<T, RenameError>; | 22 | type RenameResult<T> = Result<T, RenameError>; |
| 23 | #[derive(Debug)] | 23 | #[derive(Debug)] |
| 24 | pub struct RenameError(pub(crate) String); | 24 | pub struct RenameError(String); |
| 25 | 25 | ||
| 26 | impl fmt::Display for RenameError { | 26 | impl fmt::Display for RenameError { |
| 27 | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { | 27 | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { |
| @@ -47,16 +47,15 @@ pub(crate) fn prepare_rename( | |||
| 47 | let sema = Semantics::new(db); | 47 | let sema = Semantics::new(db); |
| 48 | let source_file = sema.parse(position.file_id); | 48 | let source_file = sema.parse(position.file_id); |
| 49 | let syntax = source_file.syntax(); | 49 | let syntax = source_file.syntax(); |
| 50 | let range = match &sema | 50 | let name_like = sema |
| 51 | .find_node_at_offset_with_descend(&syntax, position.offset) | 51 | .find_node_at_offset_with_descend(&syntax, position.offset) |
| 52 | .ok_or_else(|| format_err!("No references found at position"))? | 52 | .ok_or_else(|| format_err!("No references found at position"))?; |
| 53 | { | 53 | let node = match &name_like { |
| 54 | ast::NameLike::Name(it) => it.syntax(), | 54 | ast::NameLike::Name(it) => it.syntax(), |
| 55 | ast::NameLike::NameRef(it) => it.syntax(), | 55 | ast::NameLike::NameRef(it) => it.syntax(), |
| 56 | ast::NameLike::Lifetime(it) => it.syntax(), | 56 | ast::NameLike::Lifetime(it) => it.syntax(), |
| 57 | } | 57 | }; |
| 58 | .text_range(); | 58 | Ok(RangeInfo::new(sema.original_range(node).range, ())) |
| 59 | Ok(RangeInfo::new(range, ())) | ||
| 60 | } | 59 | } |
| 61 | 60 | ||
| 62 | // Feature: Rename | 61 | // Feature: Rename |
| @@ -546,6 +545,8 @@ mod tests { | |||
| 546 | 545 | ||
| 547 | use crate::{fixture, FileId}; | 546 | use crate::{fixture, FileId}; |
| 548 | 547 | ||
| 548 | use super::{RangeInfo, RenameError}; | ||
| 549 | |||
| 549 | fn check(new_name: &str, ra_fixture_before: &str, ra_fixture_after: &str) { | 550 | fn check(new_name: &str, ra_fixture_before: &str, ra_fixture_after: &str) { |
| 550 | let ra_fixture_after = &trim_indent(ra_fixture_after); | 551 | let ra_fixture_after = &trim_indent(ra_fixture_after); |
| 551 | let (analysis, position) = fixture::position(ra_fixture_before); | 552 | let (analysis, position) = fixture::position(ra_fixture_before); |
| @@ -591,6 +592,45 @@ mod tests { | |||
| 591 | expect.assert_debug_eq(&source_change) | 592 | expect.assert_debug_eq(&source_change) |
| 592 | } | 593 | } |
| 593 | 594 | ||
| 595 | fn check_prepare(ra_fixture: &str, expect: Expect) { | ||
| 596 | let (analysis, position) = fixture::position(ra_fixture); | ||
| 597 | let result = analysis | ||
| 598 | .prepare_rename(position) | ||
| 599 | .unwrap_or_else(|err| panic!("PrepareRename was cancelled: {}", err)); | ||
| 600 | match result { | ||
| 601 | Ok(RangeInfo { range, info: () }) => { | ||
| 602 | let source = analysis.file_text(position.file_id).unwrap(); | ||
| 603 | expect.assert_eq(&format!("{:?}: {}", range, &source[range])) | ||
| 604 | } | ||
| 605 | Err(RenameError(err)) => expect.assert_eq(&err), | ||
| 606 | }; | ||
| 607 | } | ||
| 608 | |||
| 609 | #[test] | ||
| 610 | fn test_prepare_rename_namelikes() { | ||
| 611 | check_prepare(r"fn name$0<'lifetime>() {}", expect![[r#"3..7: name"#]]); | ||
| 612 | check_prepare(r"fn name<'lifetime$0>() {}", expect![[r#"8..17: 'lifetime"#]]); | ||
| 613 | check_prepare(r"fn name<'lifetime>() { name$0(); }", expect![[r#"23..27: name"#]]); | ||
| 614 | } | ||
| 615 | |||
| 616 | #[test] | ||
| 617 | fn test_prepare_rename_in_macro() { | ||
| 618 | check_prepare( | ||
| 619 | r"macro_rules! foo { | ||
| 620 | ($ident:ident) => { | ||
| 621 | pub struct $ident; | ||
| 622 | } | ||
| 623 | } | ||
| 624 | foo!(Foo$0);", | ||
| 625 | expect![[r#"83..86: Foo"#]], | ||
| 626 | ); | ||
| 627 | } | ||
| 628 | |||
| 629 | #[test] | ||
| 630 | fn test_prepare_rename_keyword() { | ||
| 631 | check_prepare(r"struct$0 Foo;", expect![[r#"No references found at position"#]]); | ||
| 632 | } | ||
| 633 | |||
| 594 | #[test] | 634 | #[test] |
| 595 | fn test_rename_to_underscore() { | 635 | fn test_rename_to_underscore() { |
| 596 | check("_", r#"fn main() { let i$0 = 1; }"#, r#"fn main() { let _ = 1; }"#); | 636 | check("_", r#"fn main() { let i$0 = 1; }"#, r#"fn main() { let _ = 1; }"#); |
