From 03a61134f22fae8574766313f6ffd39d1007c7fe Mon Sep 17 00:00:00 2001
From: Jacob Rothstein <hi@jbr.me>
Date: Mon, 3 Aug 2020 12:17:05 -0700
Subject: do not add to `pub use` statements

---
 .../handlers/replace_qualified_name_with_use.rs    | 42 ++++++++++++++++++++++
 crates/ra_assists/src/utils/insert_use.rs          |  3 +-
 2 files changed, 44 insertions(+), 1 deletion(-)

diff --git a/crates/ra_assists/src/handlers/replace_qualified_name_with_use.rs b/crates/ra_assists/src/handlers/replace_qualified_name_with_use.rs
index 53496ede1..da0a860c5 100644
--- a/crates/ra_assists/src/handlers/replace_qualified_name_with_use.rs
+++ b/crates/ra_assists/src/handlers/replace_qualified_name_with_use.rs
@@ -639,6 +639,48 @@ use std::fmt::{self, Display};
 
 fn main() {
     fmt;
+}
+    ",
+        );
+    }
+
+    #[test]
+    fn does_not_replace_pub_use() {
+        check_assist(
+            replace_qualified_name_with_use,
+            r"
+pub use std::fmt;
+
+impl std::io<|> for Foo {
+}
+    ",
+            r"
+use std::io;
+
+pub use std::fmt;
+
+impl io for Foo {
+}
+    ",
+        );
+    }
+
+    #[test]
+    fn does_not_replace_pub_crate_use() {
+        check_assist(
+            replace_qualified_name_with_use,
+            r"
+pub(crate) use std::fmt;
+
+impl std::io<|> for Foo {
+}
+    ",
+            r"
+use std::io;
+
+pub(crate) use std::fmt;
+
+impl io for Foo {
 }
     ",
         );
diff --git a/crates/ra_assists/src/utils/insert_use.rs b/crates/ra_assists/src/utils/insert_use.rs
index 617afe2e9..32780fceb 100644
--- a/crates/ra_assists/src/utils/insert_use.rs
+++ b/crates/ra_assists/src/utils/insert_use.rs
@@ -4,7 +4,7 @@
 
 use hir::{self, ModPath};
 use ra_syntax::{
-    ast::{self, NameOwner},
+    ast::{self, NameOwner, VisibilityOwner},
     AstNode, Direction, SmolStr,
     SyntaxKind::{PATH, PATH_SEGMENT},
     SyntaxNode, T,
@@ -378,6 +378,7 @@ fn best_action_for_target(
     let best_action = container
         .children()
         .filter_map(ast::Use::cast)
+        .filter(|u| u.visibility().is_none())
         .filter_map(|it| it.use_tree())
         .map(|u| walk_use_tree_for_best_action(&mut storage, None, u, target))
         .fold(None, |best, a| match best {
-- 
cgit v1.2.3