diff options
Diffstat (limited to 'crates/ssr')
-rw-r--r-- | crates/ssr/src/search.rs | 20 | ||||
-rw-r--r-- | crates/ssr/src/tests.rs | 22 |
2 files changed, 21 insertions, 21 deletions
diff --git a/crates/ssr/src/search.rs b/crates/ssr/src/search.rs index 44b5db029..836eb94b2 100644 --- a/crates/ssr/src/search.rs +++ b/crates/ssr/src/search.rs | |||
@@ -5,10 +5,10 @@ use crate::{ | |||
5 | resolving::{ResolvedPath, ResolvedPattern, ResolvedRule}, | 5 | resolving::{ResolvedPath, ResolvedPattern, ResolvedRule}, |
6 | Match, MatchFinder, | 6 | Match, MatchFinder, |
7 | }; | 7 | }; |
8 | use ide_db::base_db::{FileId, FileRange}; | ||
9 | use ide_db::{ | 8 | use ide_db::{ |
9 | base_db::{FileId, FileRange}, | ||
10 | defs::Definition, | 10 | defs::Definition, |
11 | search::{Reference, SearchScope}, | 11 | search::{SearchScope, UsageSearchResult}, |
12 | }; | 12 | }; |
13 | use rustc_hash::FxHashSet; | 13 | use rustc_hash::FxHashSet; |
14 | use syntax::{ast, AstNode, SyntaxKind, SyntaxNode}; | 14 | use syntax::{ast, AstNode, SyntaxKind, SyntaxNode}; |
@@ -20,7 +20,7 @@ use test_utils::mark; | |||
20 | /// them more than once. | 20 | /// them more than once. |
21 | #[derive(Default)] | 21 | #[derive(Default)] |
22 | pub(crate) struct UsageCache { | 22 | pub(crate) struct UsageCache { |
23 | usages: Vec<(Definition, Vec<Reference>)>, | 23 | usages: Vec<(Definition, UsageSearchResult)>, |
24 | } | 24 | } |
25 | 25 | ||
26 | impl<'db> MatchFinder<'db> { | 26 | impl<'db> MatchFinder<'db> { |
@@ -58,8 +58,8 @@ impl<'db> MatchFinder<'db> { | |||
58 | ) { | 58 | ) { |
59 | if let Some(resolved_path) = pick_path_for_usages(pattern) { | 59 | if let Some(resolved_path) = pick_path_for_usages(pattern) { |
60 | let definition: Definition = resolved_path.resolution.clone().into(); | 60 | let definition: Definition = resolved_path.resolution.clone().into(); |
61 | for reference in self.find_usages(usage_cache, definition) { | 61 | for file_range in self.find_usages(usage_cache, definition).file_ranges() { |
62 | if let Some(node_to_match) = self.find_node_to_match(resolved_path, reference) { | 62 | if let Some(node_to_match) = self.find_node_to_match(resolved_path, file_range) { |
63 | if !is_search_permitted_ancestors(&node_to_match) { | 63 | if !is_search_permitted_ancestors(&node_to_match) { |
64 | mark::hit!(use_declaration_with_braces); | 64 | mark::hit!(use_declaration_with_braces); |
65 | continue; | 65 | continue; |
@@ -73,11 +73,11 @@ impl<'db> MatchFinder<'db> { | |||
73 | fn find_node_to_match( | 73 | fn find_node_to_match( |
74 | &self, | 74 | &self, |
75 | resolved_path: &ResolvedPath, | 75 | resolved_path: &ResolvedPath, |
76 | reference: &Reference, | 76 | file_range: FileRange, |
77 | ) -> Option<SyntaxNode> { | 77 | ) -> Option<SyntaxNode> { |
78 | let file = self.sema.parse(reference.file_range.file_id); | 78 | let file = self.sema.parse(file_range.file_id); |
79 | let depth = resolved_path.depth as usize; | 79 | let depth = resolved_path.depth as usize; |
80 | let offset = reference.file_range.range.start(); | 80 | let offset = file_range.range.start(); |
81 | if let Some(path) = | 81 | if let Some(path) = |
82 | self.sema.find_node_at_offset_with_descend::<ast::Path>(file.syntax(), offset) | 82 | self.sema.find_node_at_offset_with_descend::<ast::Path>(file.syntax(), offset) |
83 | { | 83 | { |
@@ -108,7 +108,7 @@ impl<'db> MatchFinder<'db> { | |||
108 | &self, | 108 | &self, |
109 | usage_cache: &'a mut UsageCache, | 109 | usage_cache: &'a mut UsageCache, |
110 | definition: Definition, | 110 | definition: Definition, |
111 | ) -> &'a [Reference] { | 111 | ) -> &'a UsageSearchResult { |
112 | // Logically if a lookup succeeds we should just return it. Unfortunately returning it would | 112 | // Logically if a lookup succeeds we should just return it. Unfortunately returning it would |
113 | // extend the lifetime of the borrow, then we wouldn't be able to do the insertion on a | 113 | // extend the lifetime of the borrow, then we wouldn't be able to do the insertion on a |
114 | // cache miss. This is a limitation of NLL and is fixed with Polonius. For now we do two | 114 | // cache miss. This is a limitation of NLL and is fixed with Polonius. For now we do two |
@@ -250,7 +250,7 @@ fn is_search_permitted(node: &SyntaxNode) -> bool { | |||
250 | } | 250 | } |
251 | 251 | ||
252 | impl UsageCache { | 252 | impl UsageCache { |
253 | fn find(&mut self, definition: &Definition) -> Option<&[Reference]> { | 253 | fn find(&mut self, definition: &Definition) -> Option<&UsageSearchResult> { |
254 | // We expect a very small number of cache entries (generally 1), so a linear scan should be | 254 | // We expect a very small number of cache entries (generally 1), so a linear scan should be |
255 | // fast enough and avoids the need to implement Hash for Definition. | 255 | // fast enough and avoids the need to implement Hash for Definition. |
256 | for (d, refs) in &self.usages { | 256 | for (d, refs) in &self.usages { |
diff --git a/crates/ssr/src/tests.rs b/crates/ssr/src/tests.rs index db9cb8ca1..d6918c22d 100644 --- a/crates/ssr/src/tests.rs +++ b/crates/ssr/src/tests.rs | |||
@@ -59,7 +59,7 @@ fn parser_undefined_placeholder_in_replacement() { | |||
59 | ); | 59 | ); |
60 | } | 60 | } |
61 | 61 | ||
62 | /// `code` may optionally contain a cursor marker `<|>`. If it doesn't, then the position will be | 62 | /// `code` may optionally contain a cursor marker `$0`. If it doesn't, then the position will be |
63 | /// the start of the file. If there's a second cursor marker, then we'll return a single range. | 63 | /// the start of the file. If there's a second cursor marker, then we'll return a single range. |
64 | pub(crate) fn single_file(code: &str) -> (ide_db::RootDatabase, FilePosition, Vec<FileRange>) { | 64 | pub(crate) fn single_file(code: &str) -> (ide_db::RootDatabase, FilePosition, Vec<FileRange>) { |
65 | use ide_db::base_db::fixture::WithFixture; | 65 | use ide_db::base_db::fixture::WithFixture; |
@@ -596,7 +596,7 @@ fn replace_function_call() { | |||
596 | // This test also makes sure that we ignore empty-ranges. | 596 | // This test also makes sure that we ignore empty-ranges. |
597 | assert_ssr_transform( | 597 | assert_ssr_transform( |
598 | "foo() ==>> bar()", | 598 | "foo() ==>> bar()", |
599 | "fn foo() {<|><|>} fn bar() {} fn f1() {foo(); foo();}", | 599 | "fn foo() {$0$0} fn bar() {} fn f1() {foo(); foo();}", |
600 | expect![["fn foo() {} fn bar() {} fn f1() {bar(); bar();}"]], | 600 | expect![["fn foo() {} fn bar() {} fn f1() {bar(); bar();}"]], |
601 | ); | 601 | ); |
602 | } | 602 | } |
@@ -706,7 +706,7 @@ fn replace_associated_trait_constant() { | |||
706 | 706 | ||
707 | #[test] | 707 | #[test] |
708 | fn replace_path_in_different_contexts() { | 708 | fn replace_path_in_different_contexts() { |
709 | // Note the <|> inside module a::b which marks the point where the rule is interpreted. We | 709 | // Note the $0 inside module a::b which marks the point where the rule is interpreted. We |
710 | // replace foo with bar, but both need different path qualifiers in different contexts. In f4, | 710 | // replace foo with bar, but both need different path qualifiers in different contexts. In f4, |
711 | // foo is unqualified because of a use statement, however the replacement needs to be fully | 711 | // foo is unqualified because of a use statement, however the replacement needs to be fully |
712 | // qualified. | 712 | // qualified. |
@@ -714,7 +714,7 @@ fn replace_path_in_different_contexts() { | |||
714 | "c::foo() ==>> c::bar()", | 714 | "c::foo() ==>> c::bar()", |
715 | r#" | 715 | r#" |
716 | mod a { | 716 | mod a { |
717 | pub mod b {<|> | 717 | pub mod b {$0 |
718 | pub mod c { | 718 | pub mod c { |
719 | pub fn foo() {} | 719 | pub fn foo() {} |
720 | pub fn bar() {} | 720 | pub fn bar() {} |
@@ -1096,7 +1096,7 @@ fn pattern_is_a_single_segment_path() { | |||
1096 | fn f1() -> i32 { | 1096 | fn f1() -> i32 { |
1097 | let foo = 1; | 1097 | let foo = 1; |
1098 | let bar = 2; | 1098 | let bar = 2; |
1099 | foo<|> | 1099 | foo$0 |
1100 | } | 1100 | } |
1101 | "#, | 1101 | "#, |
1102 | expect![[r#" | 1102 | expect![[r#" |
@@ -1128,7 +1128,7 @@ fn replace_local_variable_reference() { | |||
1128 | let foo = 5; | 1128 | let foo = 5; |
1129 | res += foo + 1; | 1129 | res += foo + 1; |
1130 | let foo = 10; | 1130 | let foo = 10; |
1131 | res += foo + 2;<|> | 1131 | res += foo + 2;$0 |
1132 | res += foo + 3; | 1132 | res += foo + 3; |
1133 | let foo = 15; | 1133 | let foo = 15; |
1134 | res += foo + 4; | 1134 | res += foo + 4; |
@@ -1160,9 +1160,9 @@ fn replace_path_within_selection() { | |||
1160 | let foo = 41; | 1160 | let foo = 41; |
1161 | let bar = 42; | 1161 | let bar = 42; |
1162 | do_stuff(foo); | 1162 | do_stuff(foo); |
1163 | do_stuff(foo);<|> | 1163 | do_stuff(foo);$0 |
1164 | do_stuff(foo); | 1164 | do_stuff(foo); |
1165 | do_stuff(foo);<|> | 1165 | do_stuff(foo);$0 |
1166 | do_stuff(foo); | 1166 | do_stuff(foo); |
1167 | }"#, | 1167 | }"#, |
1168 | expect![[r#" | 1168 | expect![[r#" |
@@ -1185,9 +1185,9 @@ fn replace_nonpath_within_selection() { | |||
1185 | "$a + $b ==>> $b * $a", | 1185 | "$a + $b ==>> $b * $a", |
1186 | r#" | 1186 | r#" |
1187 | fn main() { | 1187 | fn main() { |
1188 | let v = 1 + 2;<|> | 1188 | let v = 1 + 2;$0 |
1189 | let v2 = 3 + 3; | 1189 | let v2 = 3 + 3; |
1190 | let v3 = 4 + 5;<|> | 1190 | let v3 = 4 + 5;$0 |
1191 | let v4 = 6 + 7; | 1191 | let v4 = 6 + 7; |
1192 | }"#, | 1192 | }"#, |
1193 | expect![[r#" | 1193 | expect![[r#" |
@@ -1212,7 +1212,7 @@ fn replace_self() { | |||
1212 | fn bar(_: &S1) {} | 1212 | fn bar(_: &S1) {} |
1213 | impl S1 { | 1213 | impl S1 { |
1214 | fn f1(&self) { | 1214 | fn f1(&self) { |
1215 | foo(self)<|> | 1215 | foo(self)$0 |
1216 | } | 1216 | } |
1217 | fn f2(&self) { | 1217 | fn f2(&self) { |
1218 | foo(self) | 1218 | foo(self) |