Unnamed repository; edit this file 'description' to name the repository.
-rw-r--r--crates/ide-db/src/imports/insert_use/tests.rs40
-rw-r--r--crates/ide-db/src/imports/merge_imports.rs11
2 files changed, 51 insertions, 0 deletions
diff --git a/crates/ide-db/src/imports/insert_use/tests.rs b/crates/ide-db/src/imports/insert_use/tests.rs
index b92e367f7e..01d2f1970c 100644
--- a/crates/ide-db/src/imports/insert_use/tests.rs
+++ b/crates/ide-db/src/imports/insert_use/tests.rs
@@ -993,6 +993,46 @@ use foo::bar::qux;
);
}
+#[test]
+fn insert_with_renamed_import_simple_use() {
+ check_with_config(
+ "use self::foo::Foo",
+ r#"
+use self::foo::Foo as _;
+"#,
+ r#"
+use self::foo::Foo;
+"#,
+ &InsertUseConfig {
+ granularity: ImportGranularity::Crate,
+ prefix_kind: hir::PrefixKind::BySelf,
+ enforce_granularity: true,
+ group: true,
+ skip_glob_imports: true,
+ },
+ );
+}
+
+#[test]
+fn insert_with_renamed_import_complex_use() {
+ check_with_config(
+ "use self::foo::Foo;",
+ r#"
+use self::foo::{self, Foo as _, Bar};
+"#,
+ r#"
+use self::foo::{self, Foo, Bar};
+"#,
+ &InsertUseConfig {
+ granularity: ImportGranularity::Crate,
+ prefix_kind: hir::PrefixKind::BySelf,
+ enforce_granularity: true,
+ group: true,
+ skip_glob_imports: true,
+ },
+ );
+}
+
fn check_with_config(
path: &str,
ra_fixture_before: &str,
diff --git a/crates/ide-db/src/imports/merge_imports.rs b/crates/ide-db/src/imports/merge_imports.rs
index 27b6321f3a..ff84e9ffae 100644
--- a/crates/ide-db/src/imports/merge_imports.rs
+++ b/crates/ide-db/src/imports/merge_imports.rs
@@ -78,6 +78,10 @@ fn try_merge_trees_mut(lhs: &ast::UseTree, rhs: &ast::UseTree, merge: MergeBehav
{
lhs.split_prefix(&lhs_prefix);
rhs.split_prefix(&rhs_prefix);
+ } else {
+ ted::replace(lhs.syntax(), rhs.syntax());
+ // we can safely return here, in this case `recursive_merge` doesn't do anything
+ return Some(());
}
recursive_merge(lhs, rhs, merge)
}
@@ -123,6 +127,13 @@ fn recursive_merge(lhs: &ast::UseTree, rhs: &ast::UseTree, merge: MergeBehavior)
// so they need to be handled explicitly
.or_else(|| tree.star_token().map(|_| false))
};
+
+ if lhs_t.rename().and_then(|x| x.underscore_token()).is_some() {
+ ted::replace(lhs_t.syntax(), rhs_t.syntax());
+ *lhs_t = rhs_t;
+ continue;
+ }
+
match (tree_contains_self(lhs_t), tree_contains_self(&rhs_t)) {
(Some(true), None) => continue,
(None, Some(true)) => {