aboutsummaryrefslogtreecommitdiff
path: root/crates/assists
diff options
context:
space:
mode:
Diffstat (limited to 'crates/assists')
-rw-r--r--crates/assists/src/handlers/merge_imports.rs14
-rw-r--r--crates/assists/src/handlers/replace_qualified_name_with_use.rs19
-rw-r--r--crates/assists/src/utils/insert_use.rs59
3 files changed, 86 insertions, 6 deletions
diff --git a/crates/assists/src/handlers/merge_imports.rs b/crates/assists/src/handlers/merge_imports.rs
index fe33cee53..fd9c9e03c 100644
--- a/crates/assists/src/handlers/merge_imports.rs
+++ b/crates/assists/src/handlers/merge_imports.rs
@@ -73,6 +73,20 @@ mod tests {
73 use super::*; 73 use super::*;
74 74
75 #[test] 75 #[test]
76 fn test_merge_equal() {
77 check_assist(
78 merge_imports,
79 r"
80use std::fmt<|>::{Display, Debug};
81use std::fmt::{Display, Debug};
82",
83 r"
84use std::fmt::{Debug, Display};
85",
86 )
87 }
88
89 #[test]
76 fn test_merge_first() { 90 fn test_merge_first() {
77 check_assist( 91 check_assist(
78 merge_imports, 92 merge_imports,
diff --git a/crates/assists/src/handlers/replace_qualified_name_with_use.rs b/crates/assists/src/handlers/replace_qualified_name_with_use.rs
index 74afc123b..c50bc7604 100644
--- a/crates/assists/src/handlers/replace_qualified_name_with_use.rs
+++ b/crates/assists/src/handlers/replace_qualified_name_with_use.rs
@@ -124,6 +124,23 @@ mod tests {
124 use super::*; 124 use super::*;
125 125
126 #[test] 126 #[test]
127 fn test_replace_already_imported() {
128 check_assist(
129 replace_qualified_name_with_use,
130 r"use std::fs;
131
132fn main() {
133 std::f<|>s::Path
134}",
135 r"use std::fs;
136
137fn main() {
138 fs::Path
139}",
140 )
141 }
142
143 #[test]
127 fn test_replace_add_use_no_anchor() { 144 fn test_replace_add_use_no_anchor() {
128 check_assist( 145 check_assist(
129 replace_qualified_name_with_use, 146 replace_qualified_name_with_use,
@@ -393,7 +410,7 @@ impl std::fmt::Display<|> for Foo {
393} 410}
394", 411",
395 r" 412 r"
396use std::fmt::{Display, nested::Debug}; 413use std::fmt::{nested::Debug, Display};
397 414
398impl Display for Foo { 415impl Display for Foo {
399} 416}
diff --git a/crates/assists/src/utils/insert_use.rs b/crates/assists/src/utils/insert_use.rs
index f6025c99a..409985b3b 100644
--- a/crates/assists/src/utils/insert_use.rs
+++ b/crates/assists/src/utils/insert_use.rs
@@ -173,8 +173,15 @@ pub(crate) fn try_merge_trees(
173 let rhs_path = rhs.path()?; 173 let rhs_path = rhs.path()?;
174 174
175 let (lhs_prefix, rhs_prefix) = common_prefix(&lhs_path, &rhs_path)?; 175 let (lhs_prefix, rhs_prefix) = common_prefix(&lhs_path, &rhs_path)?;
176 let lhs = lhs.split_prefix(&lhs_prefix); 176 let (lhs, rhs) = if is_simple_path(lhs)
177 let rhs = rhs.split_prefix(&rhs_prefix); 177 && is_simple_path(rhs)
178 && lhs_path == lhs_prefix
179 && rhs_path == rhs_prefix
180 {
181 (lhs.clone(), rhs.clone())
182 } else {
183 (lhs.split_prefix(&lhs_prefix), rhs.split_prefix(&rhs_prefix))
184 };
178 recursive_merge(&lhs, &rhs, merge) 185 recursive_merge(&lhs, &rhs, merge)
179} 186}
180 187
@@ -200,7 +207,18 @@ fn recursive_merge(
200 return None; 207 return None;
201 } 208 }
202 let rhs_path = rhs_t.path(); 209 let rhs_path = rhs_t.path();
203 match use_trees.binary_search_by(|p| path_cmp_bin_search(p.path(), rhs_path.clone())) { 210 match use_trees.binary_search_by(|lhs_t| {
211 let (lhs_t, rhs_t) = match lhs_t
212 .path()
213 .zip(rhs_path.clone())
214 .and_then(|(lhs, rhs)| common_prefix(&lhs, &rhs))
215 {
216 Some((lhs_p, rhs_p)) => (lhs_t.split_prefix(&lhs_p), rhs_t.split_prefix(&rhs_p)),
217 None => (lhs_t.clone(), rhs_t.clone()),
218 };
219
220 path_cmp_bin_search(lhs_t.path(), rhs_t.path())
221 }) {
204 Ok(idx) => { 222 Ok(idx) => {
205 let lhs_t = &mut use_trees[idx]; 223 let lhs_t = &mut use_trees[idx];
206 let lhs_path = lhs_t.path()?; 224 let lhs_path = lhs_t.path()?;
@@ -239,6 +257,10 @@ fn recursive_merge(
239 use_trees.insert(idx, make::glob_use_tree()); 257 use_trees.insert(idx, make::glob_use_tree());
240 continue; 258 continue;
241 } 259 }
260
261 if lhs_t.use_tree_list().is_none() && rhs_t.use_tree_list().is_none() {
262 continue;
263 }
242 } 264 }
243 let lhs = lhs_t.split_prefix(&lhs_prefix); 265 let lhs = lhs_t.split_prefix(&lhs_prefix);
244 let rhs = rhs_t.split_prefix(&rhs_prefix); 266 let rhs = rhs_t.split_prefix(&rhs_prefix);
@@ -284,6 +306,10 @@ fn common_prefix(lhs: &ast::Path, rhs: &ast::Path) -> Option<(ast::Path, ast::Pa
284 } 306 }
285} 307}
286 308
309fn is_simple_path(use_tree: &ast::UseTree) -> bool {
310 use_tree.use_tree_list().is_none() && use_tree.star_token().is_none()
311}
312
287fn path_is_self(path: &ast::Path) -> bool { 313fn path_is_self(path: &ast::Path) -> bool {
288 path.segment().and_then(|seg| seg.self_token()).is_some() && path.qualifier().is_none() 314 path.segment().and_then(|seg| seg.self_token()).is_some() && path.qualifier().is_none()
289} 315}
@@ -327,11 +353,11 @@ fn path_cmp_for_sort(a: Option<ast::Path>, b: Option<ast::Path>) -> Ordering {
327 353
328/// Path comparison func for binary searching for merging. 354/// Path comparison func for binary searching for merging.
329fn path_cmp_bin_search(lhs: Option<ast::Path>, rhs: Option<ast::Path>) -> Ordering { 355fn path_cmp_bin_search(lhs: Option<ast::Path>, rhs: Option<ast::Path>) -> Ordering {
330 match (lhs, rhs) { 356 match (lhs.and_then(|path| path.segment()), rhs.and_then(|path| path.segment())) {
331 (None, None) => Ordering::Equal, 357 (None, None) => Ordering::Equal,
332 (None, Some(_)) => Ordering::Less, 358 (None, Some(_)) => Ordering::Less,
333 (Some(_), None) => Ordering::Greater, 359 (Some(_), None) => Ordering::Greater,
334 (Some(ref a), Some(ref b)) => path_cmp_short(a, b), 360 (Some(ref a), Some(ref b)) => path_segment_cmp(a, b),
335 } 361 }
336} 362}
337 363
@@ -513,6 +539,11 @@ mod tests {
513 use test_utils::assert_eq_text; 539 use test_utils::assert_eq_text;
514 540
515 #[test] 541 #[test]
542 fn insert_existing() {
543 check_full("std::fs", "use std::fs;", "use std::fs;")
544 }
545
546 #[test]
516 fn insert_start() { 547 fn insert_start() {
517 check_none( 548 check_none(
518 "std::bar::AA", 549 "std::bar::AA",
@@ -802,6 +833,24 @@ use std::foo::bar::{Qux, quux::{Fez, Fizz}};",
802 } 833 }
803 834
804 #[test] 835 #[test]
836 fn merge_groups_full_nested_long() {
837 check_full(
838 "std::foo::bar::Baz",
839 r"use std::{foo::bar::Qux};",
840 r"use std::{foo::bar::{Baz, Qux}};",
841 );
842 }
843
844 #[test]
845 fn merge_groups_last_nested_long() {
846 check_full(
847 "std::foo::bar::Baz",
848 r"use std::{foo::bar::Qux};",
849 r"use std::{foo::bar::{Baz, Qux}};",
850 );
851 }
852
853 #[test]
805 fn merge_groups_skip_pub() { 854 fn merge_groups_skip_pub() {
806 check_full( 855 check_full(
807 "std::io", 856 "std::io",