Unnamed repository; edit this file 'description' to name the repository.
Merge pull request #20025 from SoxPopuli/hide_private_imports_without_pe
Hide imported privates if private editable is disabled
Laurențiu Nicola 10 months ago
parent 3bf8a77 · parent e6a4602 · commit 5d93e31
-rw-r--r--crates/ide-completion/src/completions/expr.rs14
-rw-r--r--crates/ide-completion/src/tests/visibility.rs89
2 files changed, 98 insertions, 5 deletions
diff --git a/crates/ide-completion/src/completions/expr.rs b/crates/ide-completion/src/completions/expr.rs
index 062bc6106e..2133291b1d 100644
--- a/crates/ide-completion/src/completions/expr.rs
+++ b/crates/ide-completion/src/completions/expr.rs
@@ -145,10 +145,16 @@ pub(crate) fn complete_expr_path(
});
match resolution {
hir::PathResolution::Def(hir::ModuleDef::Module(module)) => {
- // Set visible_from to None so private items are returned.
- // They will be possibly filtered out in add_path_resolution()
- // via def_is_visible().
- let module_scope = module.scope(ctx.db, None);
+ let visible_from = if ctx.config.enable_private_editable {
+ // Set visible_from to None so private items are returned.
+ // They will be possibly filtered out in add_path_resolution()
+ // via def_is_visible().
+ None
+ } else {
+ Some(ctx.module)
+ };
+
+ let module_scope = module.scope(ctx.db, visible_from);
for (name, def) in module_scope {
if scope_def_applicable(def) {
acc.add_path_resolution(
diff --git a/crates/ide-completion/src/tests/visibility.rs b/crates/ide-completion/src/tests/visibility.rs
index 4b5a0ac1c2..b404011dfe 100644
--- a/crates/ide-completion/src/tests/visibility.rs
+++ b/crates/ide-completion/src/tests/visibility.rs
@@ -1,7 +1,7 @@
//! Completion tests for visibility modifiers.
use expect_test::expect;
-use crate::tests::{check, check_with_trigger_character};
+use crate::tests::{check, check_with_private_editable, check_with_trigger_character};
#[test]
fn empty_pub() {
@@ -78,3 +78,90 @@ mod bar {}
"#]],
);
}
+
+#[test]
+fn use_inner_public_function() {
+ check(
+ r#"
+//- /inner.rs crate:inner
+pub fn inner_public() {}
+fn inner_private() {}
+//- /foo.rs crate:foo deps:inner
+use inner::inner_public;
+pub fn outer_public() {}
+//- /lib.rs crate:lib deps:foo
+fn x() {
+ foo::$0
+}
+ "#,
+ expect![[r#"
+ fn outer_public() fn()
+ "#]],
+ );
+}
+
+#[test]
+fn pub_use_inner_public_function() {
+ check(
+ r#"
+//- /inner.rs crate:inner
+pub fn inner_public() {}
+fn inner_private() {}
+//- /foo.rs crate:foo deps:inner
+pub use inner::inner_public;
+pub fn outer_public() {}
+//- /lib.rs crate:lib deps:foo
+fn x() {
+ foo::$0
+}
+ "#,
+ expect![[r#"
+ fn inner_public() fn()
+ fn outer_public() fn()
+ "#]],
+ );
+}
+
+#[test]
+fn use_inner_public_function_private_editable() {
+ check_with_private_editable(
+ r#"
+//- /inner.rs crate:inner
+pub fn inner_public() {}
+fn inner_private() {}
+//- /foo.rs crate:foo deps:inner
+use inner::inner_public;
+pub fn outer_public() {}
+//- /lib.rs crate:lib deps:foo
+fn x() {
+ foo::$0
+}
+ "#,
+ expect![[r#"
+ fn inner_public() fn()
+ fn outer_public() fn()
+ "#]],
+ );
+}
+
+#[test]
+fn pub_use_inner_public_function_private_editable() {
+ check_with_private_editable(
+ r#"
+//- /inner.rs crate:inner
+pub fn inner_public() {}
+fn inner_private() {}
+//- /foo.rs crate:foo deps:inner
+pub use inner::inner_public;
+pub fn outer_public() {}
+//- /lib.rs crate:lib deps:foo
+fn x() {
+ foo::$0
+}
+ "#,
+ expect![[r#"
+ fn inner_public() fn()
+ fn outer_public() fn()
+ "#]],
+ );
+}