Unnamed repository; edit this file 'description' to name the repository.
Merge pull request #22259 from A4-Tacks/module-colons
feat: complete `::` on module def
Chayim Refael Friedman 8 days ago
parent fb4c5c8 · parent f8018fc · commit e26f9ee
-rw-r--r--crates/ide-completion/src/completions/dot.rs8
-rw-r--r--crates/ide-completion/src/completions/item_list/trait_impl.rs2
-rw-r--r--crates/ide-completion/src/config.rs1
-rw-r--r--crates/ide-completion/src/render.rs43
-rw-r--r--crates/ide-completion/src/tests.rs1
-rw-r--r--crates/ide-completion/src/tests/attribute.rs24
-rw-r--r--crates/ide-completion/src/tests/expression.rs72
-rw-r--r--crates/ide-completion/src/tests/flyimport.rs2
-rw-r--r--crates/ide-completion/src/tests/item.rs8
-rw-r--r--crates/ide-completion/src/tests/item_list.rs28
-rw-r--r--crates/ide-completion/src/tests/predicate.rs16
-rw-r--r--crates/ide-completion/src/tests/record.rs2
-rw-r--r--crates/ide-completion/src/tests/special.rs22
-rw-r--r--crates/ide-completion/src/tests/type_pos.rs74
-rw-r--r--crates/ide-completion/src/tests/visibility.rs6
-rw-r--r--crates/rust-analyzer/src/config.rs6
-rw-r--r--crates/rust-analyzer/src/integrated_benchmarks.rs127
-rw-r--r--docs/book/src/configuration_generated.md9
-rw-r--r--editors/code/package.json10
19 files changed, 229 insertions, 232 deletions
diff --git a/crates/ide-completion/src/completions/dot.rs b/crates/ide-completion/src/completions/dot.rs
index 31a8ed2c13..2cc2200df9 100644
--- a/crates/ide-completion/src/completions/dot.rs
+++ b/crates/ide-completion/src/completions/dot.rs
@@ -1093,7 +1093,7 @@ impl Foo { fn foo(&mut self) { let _: fn(&mut Self) = |this| { $0 } } }"#,
me this.foo() fn(&mut self)
lc self &mut Foo
lc this &mut Foo
- md core
+ md core::
sp Self Foo
st Foo Foo
tt Fn
@@ -1117,7 +1117,7 @@ impl Foo { fn foo(&self) { let _: fn(&Self) = |foo| { $0 } } }"#,
me self.foo() fn(&self)
lc foo &Foo
lc self &Foo
- md core
+ md core::
sp Self Foo
st Foo Foo
tt Fn
@@ -1137,7 +1137,7 @@ impl Foo { fn foo(&self) { let _: fn(&Self) = || { $0 } } }"#,
fd self.field i32
me self.foo() fn(&self)
lc self &Foo
- md core
+ md core::
sp Self Foo
st Foo Foo
tt Fn
@@ -1159,7 +1159,7 @@ impl Foo { fn foo(&self) { let _: fn(&Self, &Self) = |foo, other| { $0 } } }"#,
lc foo &Foo
lc other &Foo
lc self &Foo
- md core
+ md core::
sp Self Foo
st Foo Foo
tt Fn
diff --git a/crates/ide-completion/src/completions/item_list/trait_impl.rs b/crates/ide-completion/src/completions/item_list/trait_impl.rs
index 02e14d8c8e..c165a32082 100644
--- a/crates/ide-completion/src/completions/item_list/trait_impl.rs
+++ b/crates/ide-completion/src/completions/item_list/trait_impl.rs
@@ -1744,7 +1744,7 @@ impl Trait for () {
me fn bar(..)
me fn baz(..)
me fn foo(..)
- md proc_macros
+ md proc_macros::
kw crate::
kw self::
"#]],
diff --git a/crates/ide-completion/src/config.rs b/crates/ide-completion/src/config.rs
index 80c1572972..21f624be2c 100644
--- a/crates/ide-completion/src/config.rs
+++ b/crates/ide-completion/src/config.rs
@@ -25,6 +25,7 @@ pub struct CompletionConfig<'a> {
pub term_search_fuel: u64,
pub full_function_signatures: bool,
pub callable: Option<CallableSnippets>,
+ pub add_colons_to_module: bool,
pub add_semicolon_to_unit: bool,
pub snippet_cap: Option<SnippetCap>,
pub insert_use: InsertUseConfig,
diff --git a/crates/ide-completion/src/render.rs b/crates/ide-completion/src/render.rs
index f7c24fc0d5..fbbdffefe3 100644
--- a/crates/ide-completion/src/render.rs
+++ b/crates/ide-completion/src/render.rs
@@ -471,6 +471,11 @@ fn render_resolution_path(
.insert_snippet(cap, ""); // set is snippet
}
}
+ let allow_module_path = matches!(path_ctx.kind, PathKind::Use) || !config.add_colons_to_module;
+ if !allow_module_path && matches!(resolution, ScopeDef::ModuleDef(Module(_))) {
+ insert_text = format_smolstr!("{insert_text}::");
+ item.lookup_by(name.clone()).label(insert_text.clone());
+ }
adds_ret_type_arrow(completion, path_ctx, &mut item, insert_text.into());
let mut set_item_relevance = |ty: Type<'_>| {
@@ -942,7 +947,7 @@ fn main() {
st dep::test_mod_b::Struct {…} dep::test_mod_b::Struct { } [type_could_unify]
ex dep::test_mod_b::Struct { } [type_could_unify]
st Struct Struct [type_could_unify+requires_import]
- md dep []
+ md dep:: []
fn main() fn() []
fn test(…) fn(Struct) []
st Struct Struct [requires_import]
@@ -980,7 +985,7 @@ fn main() {
"#,
expect![[r#"
un Union Union [type_could_unify+requires_import]
- md dep []
+ md dep:: []
fn main() fn() []
fn test(…) fn(Union) []
en Union Union [requires_import]
@@ -1018,7 +1023,7 @@ fn main() {
ev dep::test_mod_b::Enum::variant dep::test_mod_b::Enum::variant [type_could_unify]
ex dep::test_mod_b::Enum::variant [type_could_unify]
en Enum Enum [type_could_unify+requires_import]
- md dep []
+ md dep:: []
fn main() fn() []
fn test(…) fn(Enum) []
en Enum Enum [requires_import]
@@ -1055,7 +1060,7 @@ fn main() {
expect![[r#"
ev dep::test_mod_b::Enum::Variant dep::test_mod_b::Enum::Variant [type_could_unify]
ex dep::test_mod_b::Enum::Variant [type_could_unify]
- md dep []
+ md dep:: []
fn main() fn() []
fn test(…) fn(Enum) []
"#]],
@@ -1085,7 +1090,7 @@ fn main() {
}
"#,
expect![[r#"
- md dep []
+ md dep:: []
fn main() fn() []
fn test(…) fn(fn(usize) -> i32) []
fn function fn(usize) -> i32 [requires_import]
@@ -1118,7 +1123,7 @@ fn main() {
"#,
expect![[r#"
ct CONST i32 [type_could_unify+requires_import]
- md dep []
+ md dep:: []
fn main() fn() []
fn test(…) fn(i32) []
ct CONST i64 [requires_import]
@@ -1150,7 +1155,7 @@ fn main() {
"#,
expect![[r#"
sc STATIC i32 [type_could_unify+requires_import]
- md dep []
+ md dep:: []
fn main() fn() []
fn test(…) fn(i32) []
sc STATIC i64 [requires_import]
@@ -1528,15 +1533,16 @@ fn main() { let _: m::Spam = S$0 }
detail: "fn()",
},
CompletionItem {
- label: "m",
+ label: "m::",
detail_left: None,
detail_right: None,
source_range: 75..76,
delete: 75..76,
- insert: "m",
+ insert: "m::",
kind: SymbolKind(
Module,
),
+ lookup: "m",
},
CompletionItem {
label: "m::Spam::Bar(…)",
@@ -1632,15 +1638,16 @@ fn main() { som$0 }
expect![[r#"
[
CompletionItem {
- label: "something_deprecated",
+ label: "something_deprecated::",
detail_left: None,
detail_right: None,
source_range: 55..58,
delete: 55..58,
- insert: "something_deprecated",
+ insert: "something_deprecated::",
kind: SymbolKind(
Module,
),
+ lookup: "something_deprecated",
deprecated: true,
relevance: CompletionRelevance {
exact_name_match: false,
@@ -2811,8 +2818,8 @@ mod b {
expect![[r#"
st Fooa Fooa []
tt Foob []
- md a []
- md b []
+ md a:: []
+ md b:: []
"#]],
);
}
@@ -2970,7 +2977,7 @@ fn main() {
tt Clone []
tt Copy []
fn bar(…) fn(Foo) []
- md core []
+ md core:: []
fn main() fn() []
"#]],
);
@@ -3012,7 +3019,7 @@ fn main() {
st &S [type]
st T T []
st &T [type]
- md core []
+ md core:: []
fn foo(…) fn(&S) []
fn main() fn() []
"#]],
@@ -3061,7 +3068,7 @@ fn main() {
st &mut S [type]
st T T []
st &mut T [type]
- md core []
+ md core:: []
fn foo(…) fn(&mut S) []
fn main() fn() []
"#]],
@@ -3164,7 +3171,7 @@ fn main() {
st &T [type]
fn bar() fn() -> T []
fn &bar() [type]
- md core []
+ md core:: []
fn foo(…) fn(&S) []
fn main() fn() []
"#]],
@@ -3842,7 +3849,7 @@ fn f() {
expect![[r#"
st Buffer Buffer []
fn f() fn() []
- md std []
+ md std:: []
tt BufRead [requires_import]
st BufReader BufReader [requires_import]
st BufWriter BufWriter [requires_import]
diff --git a/crates/ide-completion/src/tests.rs b/crates/ide-completion/src/tests.rs
index 02e299b2a9..e574d4de0a 100644
--- a/crates/ide-completion/src/tests.rs
+++ b/crates/ide-completion/src/tests.rs
@@ -72,6 +72,7 @@ pub(crate) const TEST_CONFIG: CompletionConfig<'_> = CompletionConfig {
term_search_fuel: 200,
full_function_signatures: false,
callable: Some(CallableSnippets::FillArguments),
+ add_colons_to_module: true,
add_semicolon_to_unit: true,
snippet_cap: SnippetCap::new(true),
insert_use: InsertUseConfig {
diff --git a/crates/ide-completion/src/tests/attribute.rs b/crates/ide-completion/src/tests/attribute.rs
index 131911be91..6dcd4f9cdd 100644
--- a/crates/ide-completion/src/tests/attribute.rs
+++ b/crates/ide-completion/src/tests/attribute.rs
@@ -64,7 +64,7 @@ pub struct Foo(#[m$0] i32);
at unsafe(…)
at used
at warn(…)
- md mac
+ md mac::
kw crate::
kw self::
"#]],
@@ -128,7 +128,7 @@ pub struct Foo(#[$0] i32);
at unsafe(…)
at used
at warn(…)
- md mac
+ md mac::
kw crate::
kw self::
"#]],
@@ -162,7 +162,7 @@ struct Foo;
at repr(…)
at unsafe(…)
at warn(…)
- md proc_macros
+ md proc_macros::
kw crate::
kw self::
"#]],
@@ -463,7 +463,7 @@ struct Foo;
at repr(…)
at unsafe(…)
at warn(…)
- md core
+ md core::
kw crate::
kw self::
"#]],
@@ -1137,7 +1137,7 @@ mod derive {
de PartialEq, Eq
de PartialEq, Eq, PartialOrd, Ord
de PartialEq, PartialOrd
- md core
+ md core::
kw crate::
kw self::
"#]],
@@ -1159,7 +1159,7 @@ mod derive {
de Eq
de Eq, PartialOrd, Ord
de PartialOrd
- md core
+ md core::
kw crate::
kw self::
"#]],
@@ -1181,7 +1181,7 @@ mod derive {
de Eq
de Eq, PartialOrd, Ord
de PartialOrd
- md core
+ md core::
kw crate::
kw self::
"#]],
@@ -1202,7 +1202,7 @@ mod derive {
de Default macro Default
de PartialOrd
de PartialOrd, Ord
- md core
+ md core::
kw crate::
kw self::
"#]],
@@ -1219,8 +1219,8 @@ mod derive {
"#,
expect![[r#"
de DeriveIdentity (use proc_macros::DeriveIdentity) proc_macro DeriveIdentity
- md core
- md proc_macros
+ md core::
+ md proc_macros::
kw crate::
kw self::
"#]],
@@ -1234,8 +1234,8 @@ use proc_macros::DeriveIdentity;
"#,
expect![[r#"
de DeriveIdentity proc_macro DeriveIdentity
- md core
- md proc_macros
+ md core::
+ md proc_macros::
kw crate::
kw self::
"#]],
diff --git a/crates/ide-completion/src/tests/expression.rs b/crates/ide-completion/src/tests/expression.rs
index 91852bb0f5..c1205f9e18 100644
--- a/crates/ide-completion/src/tests/expression.rs
+++ b/crates/ide-completion/src/tests/expression.rs
@@ -5,8 +5,8 @@ use crate::{
CompletionConfig,
config::AutoImportExclusionType,
tests::{
- BASE_ITEMS_FIXTURE, TEST_CONFIG, check, check_edit, check_with_base_items,
- completion_list_with_config,
+ BASE_ITEMS_FIXTURE, TEST_CONFIG, check, check_edit, check_edit_with_config,
+ check_with_base_items, completion_list_with_config,
},
};
@@ -48,8 +48,8 @@ fn baz() {
fn create_foo(…) fn(&FooDesc)
fn function() fn()
ma makro!(…) macro_rules! makro
- md _69latrick
- md module
+ md _69latrick::
+ md module::
sc STATIC Unit
st FooDesc FooDesc
st Record Record
@@ -149,8 +149,8 @@ impl Unit {
me self.foo() fn(self)
lc self Unit
ma makro!(…) macro_rules! makro
- md module
- md qualified
+ md module::
+ md qualified::
sp Self Unit
sc STATIC Unit
st Record Record
@@ -212,8 +212,8 @@ impl Unit {
en Enum Enum
fn function() fn()
ma makro!(…) macro_rules! makro
- md module
- md qualified
+ md module::
+ md qualified::
sc STATIC Unit
st Record Record
st Tuple Tuple
@@ -1150,6 +1150,22 @@ fn break_value_no_block() {
}
#[test]
+fn complete_module_colons() {
+ check_edit(
+ "module",
+ r#"mod module {} fn foo() { $0 }"#,
+ r#"mod module {} fn foo() { module:: }"#,
+ );
+
+ check_edit_with_config(
+ CompletionConfig { add_colons_to_module: false, ..TEST_CONFIG },
+ "module",
+ r#"mod module {} fn foo() { $0 }"#,
+ r#"mod module {} fn foo() { module }"#,
+ );
+}
+
+#[test]
fn else_completion_after_if() {
check(
r#"
@@ -2224,7 +2240,7 @@ pub struct UnstableThisShouldNotBeListed;
"#,
expect![[r#"
fn main() fn()
- md std
+ md std::
bt u32 u32
kw async
kw const
@@ -2278,7 +2294,7 @@ pub struct UnstableButWeAreOnNightlyAnyway;
"#,
expect![[r#"
fn main() fn()
- md std
+ md std::
st UnstableButWeAreOnNightlyAnyway UnstableButWeAreOnNightlyAnyway
bt u32 u32
kw async
@@ -2333,7 +2349,7 @@ pub mod intrinsics {}
"#,
expect![[r#"
fn main() fn()
- md std
+ md std::
bt u32 u32
kw async
kw const
@@ -2383,10 +2399,10 @@ fn main() {
pub mod intrinsics {}
"#,
expect![[r#"
- fn main() fn()
- md intrinsics
- md std
- bt u32 u32
+ fn main() fn()
+ md intrinsics::
+ md std::
+ bt u32 u32
kw async
kw const
kw crate::
@@ -2622,7 +2638,7 @@ fn main() {
ma helper!(…) macro_rules! helper
ma m!(…) macro_rules! m
ma makro!(…) macro_rules! makro
- md module
+ md module::
sc STATIC Unit
st Record Record
st Tuple Tuple
@@ -3085,12 +3101,12 @@ fn bar() {
ma format_args_nl!(…) macro_rules! format_args_nl
ma panic!(…) macro_rules! panic
ma print!(…) macro_rules! print
- md core
- md result (use core::result)
- md rust_2015 (use core::prelude::rust_2015)
- md rust_2018 (use core::prelude::rust_2018)
- md rust_2021 (use core::prelude::rust_2021)
- md rust_2024 (use core::prelude::rust_2024)
+ md core::
+ md result:: (use core::result)
+ md rust_2015:: (use core::prelude::rust_2015)
+ md rust_2018:: (use core::prelude::rust_2018)
+ md rust_2021:: (use core::prelude::rust_2021)
+ md rust_2024:: (use core::prelude::rust_2024)
tt Clone
tt Copy
tt FromIterator
@@ -3205,9 +3221,9 @@ fn foo() {
}
"#,
expect![[r#"
- fn foo() fn()
- md proc_macros
- bt u32 u32
+ fn foo() fn()
+ md proc_macros::
+ bt u32 u32
kw async
kw const
kw crate::
@@ -3255,9 +3271,9 @@ fn foo() {
}
"#,
expect![[r#"
- fn foo() fn()
- md proc_macros
- bt u32 u32
+ fn foo() fn()
+ md proc_macros::
+ bt u32 u32
kw async
kw const
kw crate::
diff --git a/crates/ide-completion/src/tests/flyimport.rs b/crates/ide-completion/src/tests/flyimport.rs
index 708be22258..231623a42f 100644
--- a/crates/ide-completion/src/tests/flyimport.rs
+++ b/crates/ide-completion/src/tests/flyimport.rs
@@ -1772,7 +1772,7 @@ fn function() {
"#,
expect![[r#"
st FooStruct (use outer::FooStruct) BarStruct
- md foo (use outer::foo)
+ md foo:: (use outer::foo)
fn foo_fun() (use outer::foo_fun) fn()
"#]],
);
diff --git a/crates/ide-completion/src/tests/item.rs b/crates/ide-completion/src/tests/item.rs
index 2d116c403b..bb79af7e98 100644
--- a/crates/ide-completion/src/tests/item.rs
+++ b/crates/ide-completion/src/tests/item.rs
@@ -15,7 +15,7 @@ impl Tra$0
expect![[r#"
en Enum Enum
ma makro!(…) macro_rules! makro
- md module
+ md module::
st Record Record
st Tuple Tuple
st Unit Unit
@@ -41,7 +41,7 @@ impl Trait for Str$0
expect![[r#"
en Enum Enum
ma makro!(…) macro_rules! makro
- md module
+ md module::
st Record Record
st Tuple Tuple
st Unit Unit
@@ -118,7 +118,7 @@ fn completes_where() {
expect![[r#"
en Enum (adds ->) Enum
ma makro!(…) macro_rules! makro
- md module (adds ->)
+ md module:: (adds ->)
st Record (adds ->) Record
st Tuple (adds ->) Tuple
st Unit (adds ->) Unit
@@ -363,7 +363,7 @@ fn bar() {
ma expand_to_test!(…) macro_rules! expand_to_test
ma makro!(…) macro_rules! makro
ma test!(…) macro test
- md module
+ md module::
sc STATIC Unit
st Record Record
st Tuple Tuple
diff --git a/crates/ide-completion/src/tests/item_list.rs b/crates/ide-completion/src/tests/item_list.rs
index 0b2be0265f..430c61887a 100644
--- a/crates/ide-completion/src/tests/item_list.rs
+++ b/crates/ide-completion/src/tests/item_list.rs
@@ -43,7 +43,7 @@ fn in_source_file_item_list() {
r#"$0"#,
expect![[r#"
ma makro!(…) macro_rules! makro
- md module
+ md module::
kw async
kw const
kw crate::
@@ -77,7 +77,7 @@ fn in_item_list_after_attr() {
r#"#[attr] $0"#,
expect![[r#"
ma makro!(…) macro_rules! makro
- md module
+ md module::
kw async
kw const
kw crate::
@@ -111,7 +111,7 @@ fn in_item_list_after_inner_attr() {
r#"#![attr] $0"#,
expect![[r#"
ma makro!(…) macro_rules! makro
- md module
+ md module::
kw async
kw const
kw crate::
@@ -145,7 +145,7 @@ fn in_qualified_path() {
r#"crate::$0"#,
expect![[r#"
ma makro!(…) macro_rules! makro
- md module
+ md module::
"#]],
)
}
@@ -315,7 +315,7 @@ fn in_impl_assoc_item_list() {
r#"impl Struct { $0 }"#,
expect![[r#"
ma makro!(…) macro_rules! makro
- md module
+ md module::
kw async
kw const
kw crate::
@@ -335,7 +335,7 @@ fn in_impl_assoc_item_list_after_attr() {
r#"impl Struct { #[attr] $0 }"#,
expect![[r#"
ma makro!(…) macro_rules! makro
- md module
+ md module::
kw async
kw const
kw crate::
@@ -355,7 +355,7 @@ fn in_trait_assoc_item_list() {
r"trait Foo { $0 }",
expect![[r#"
ma makro!(…) macro_rules! makro
- md module
+ md module::
kw async
kw const
kw crate::
@@ -373,7 +373,7 @@ fn in_trait_assoc_fn_missing_body() {
r#"trait Foo { fn function(); $0 }"#,
expect![[r#"
ma makro!(…) macro_rules! makro
- md module
+ md module::
kw async
kw const
kw crate::
@@ -391,7 +391,7 @@ fn in_trait_assoc_const_missing_body() {
r#"trait Foo { const CONST: (); $0 }"#,
expect![[r#"
ma makro!(…) macro_rules! makro
- md module
+ md module::
kw async
kw const
kw crate::
@@ -409,7 +409,7 @@ fn in_trait_assoc_type_aliases_missing_ty() {
r#"trait Foo { type Type; $0 }"#,
expect![[r#"
ma makro!(…) macro_rules! makro
- md module
+ md module::
kw async
kw const
kw crate::
@@ -448,7 +448,7 @@ impl Test for () {
fn fn function1()
fn fn function2()
ma makro!(…) macro_rules! makro
- md module
+ md module::
ta type Type1 =
kw crate::
kw self::
@@ -514,7 +514,7 @@ fn after_unit_struct() {
r#"struct S; f$0"#,
expect![[r#"
ma makro!(…) macro_rules! makro
- md module
+ md module::
kw async
kw const
kw crate::
@@ -664,7 +664,7 @@ fn inside_extern_blocks() {
r#"extern { $0 }"#,
expect![[r#"
ma makro!(…) macro_rules! makro
- md module
+ md module::
kw crate::
kw fn
kw pub
@@ -681,7 +681,7 @@ fn inside_extern_blocks() {
r#"unsafe extern { $0 }"#,
expect![[r#"
ma makro!(…) macro_rules! makro
- md module
+ md module::
kw crate::
kw fn
kw pub
diff --git a/crates/ide-completion/src/tests/predicate.rs b/crates/ide-completion/src/tests/predicate.rs
index 682b8904e5..9826a8ed7b 100644
--- a/crates/ide-completion/src/tests/predicate.rs
+++ b/crates/ide-completion/src/tests/predicate.rs
@@ -13,7 +13,7 @@ struct Foo<'lt, T, const C: usize> where $0 {}
expect![[r#"
en Enum Enum
ma makro!(…) macro_rules! makro
- md module
+ md module::
st Foo<…> Foo<'_, {unknown}, _>
st Record Record
st Tuple Tuple
@@ -39,7 +39,7 @@ struct Foo<'lt, T, const C: usize> where T: $0 {}
"#,
expect![[r#"
ma makro!(…) macro_rules! makro
- md module
+ md module::
tt Trait
kw crate::
kw self::
@@ -57,7 +57,7 @@ struct Foo<'lt, T, const C: usize> where 'lt: $0 {}
"#,
expect![[r#"
ma makro!(…) macro_rules! makro
- md module
+ md module::
tt Trait
kw crate::
kw self::
@@ -73,7 +73,7 @@ struct Foo<'lt, T, const C: usize> where for<'a> T: $0 {}
"#,
expect![[r#"
ma makro!(…) macro_rules! makro
- md module
+ md module::
tt Trait
kw crate::
kw self::
@@ -90,7 +90,7 @@ struct Foo<'lt, T, const C: usize> where for<'a> $0 {}
expect![[r#"
en Enum Enum
ma makro!(…) macro_rules! makro
- md module
+ md module::
st Foo<…> Foo<'_, {unknown}, _>
st Record Record
st Tuple Tuple
@@ -119,7 +119,7 @@ impl Record {
expect![[r#"
en Enum Enum
ma makro!(…) macro_rules! makro
- md module
+ md module::
sp Self Record
st Record Record
st Tuple Tuple
@@ -149,7 +149,7 @@ struct Foo<T> where T: $0 {}
pub trait Trait {}
"#,
expect![[r#"
- md std
+ md std::
kw crate::
kw self::
"#]],
@@ -169,7 +169,7 @@ struct Foo<T> where T: $0 {}
pub trait Trait {}
"#,
expect![[r#"
- md std
+ md std::
tt Trait
kw crate::
kw self::
diff --git a/crates/ide-completion/src/tests/record.rs b/crates/ide-completion/src/tests/record.rs
index c1274f6640..ddb9294469 100644
--- a/crates/ide-completion/src/tests/record.rs
+++ b/crates/ide-completion/src/tests/record.rs
@@ -176,7 +176,7 @@ fn main() {
fn main() fn()
lc foo Foo
lc thing i32
- md core
+ md core::
st Foo Foo
st Foo {…} Foo { foo1: u32, foo2: u32 }
tt Default
diff --git a/crates/ide-completion/src/tests/special.rs b/crates/ide-completion/src/tests/special.rs
index 55059a4035..0454f4e350 100644
--- a/crates/ide-completion/src/tests/special.rs
+++ b/crates/ide-completion/src/tests/special.rs
@@ -65,7 +65,7 @@ pub mod prelude {
}
"#,
expect![[r#"
- md std
+ md std::
st Option Option
bt u32 u32
"#]],
@@ -95,7 +95,7 @@ mod macros {
expect![[r#"
fn f() fn()
ma concat!(…) macro_rules! concat
- md std
+ md std::
bt u32 u32
"#]],
);
@@ -123,8 +123,8 @@ pub mod prelude {
}
"#,
expect![[r#"
- md core
- md std
+ md core::
+ md std::
st String String
bt u32 u32
"#]],
@@ -153,7 +153,7 @@ pub mod prelude {
"#,
expect![[r#"
fn f() fn()
- md std
+ md std::
bt u32 u32
"#]],
);
@@ -181,8 +181,8 @@ pub mod prelude {
}
"#,
expect![[r#"
- md std
- "#]],
+ md std::
+ "#]],
);
}
@@ -714,7 +714,7 @@ mod m {
"#,
expect![[r#"
fn z() fn()
- md z
+ md z::
"#]],
);
}
@@ -1126,7 +1126,7 @@ fn foo { ::$0 }
"#,
Some(':'),
expect![[r#"
- md core
+ md core::
"#]],
);
check_with_trigger_character(
@@ -1136,7 +1136,7 @@ fn foo { /* test */::$0 }
"#,
Some(':'),
expect![[r#"
- md core
+ md core::
"#]],
);
@@ -1488,7 +1488,7 @@ fn here_we_go() {
"#,
expect![[r#"
fn here_we_go() fn()
- md foo
+ md foo::
st Bar (alias Qux) (use foo::Bar) Bar
bt u32 u32
kw const
diff --git a/crates/ide-completion/src/tests/type_pos.rs b/crates/ide-completion/src/tests/type_pos.rs
index 1a4c255fc0..24080334ae 100644
--- a/crates/ide-completion/src/tests/type_pos.rs
+++ b/crates/ide-completion/src/tests/type_pos.rs
@@ -14,7 +14,7 @@ struct Foo<'lt, T, const C: usize> {
expect![[r#"
en Enum Enum
ma makro!(…) macro_rules! makro
- md module
+ md module::
sp Self Foo<'_, {unknown}, _>
st Foo<…> Foo<'_, {unknown}, _>
st Record Record
@@ -43,7 +43,7 @@ struct Foo<'lt, T, const C: usize>(f$0);
expect![[r#"
en Enum Enum
ma makro!(…) macro_rules! makro
- md module
+ md module::
sp Self Foo<'_, {unknown}, _>
st Foo<…> Foo<'_, {unknown}, _>
st Record Record
@@ -75,7 +75,7 @@ fn x<'lt, T, const C: usize>() -> $0
expect![[r#"
en Enum Enum
ma makro!(…) macro_rules! makro
- md module
+ md module::
st Record Record
st Tuple Tuple
st Unit Unit
@@ -102,7 +102,7 @@ fn x() u$0
expect![[r#"
en Enum (adds ->) Enum
ma makro!(…) macro_rules! makro
- md module (adds ->)
+ md module:: (adds ->)
st Record (adds ->) Record
st Tuple (adds ->) Tuple
st Unit (adds ->) Unit
@@ -126,7 +126,7 @@ fn x() $0
expect![[r#"
en Enum (adds ->) Enum
ma makro!(…) macro_rules! makro
- md module (adds ->)
+ md module:: (adds ->)
st Record (adds ->) Record
st Tuple (adds ->) Tuple
st Unit (adds ->) Unit
@@ -216,7 +216,7 @@ fn foo() $0
"#,
r#"
mod foo { pub type Num = u32; }
-fn foo() -> foo
+fn foo() -> foo::
"#,
);
@@ -253,7 +253,7 @@ fn foo()$0
"#,
r#"
mod foo { pub type Num = u32; }
-fn foo() ->foo
+fn foo() ->foo::
"#,
);
}
@@ -306,7 +306,7 @@ fn x() u$0 {&2u32}
expect![[r#"
en Enum (adds ->) Enum
ma makro!(…) macro_rules! makro
- md module (adds ->)
+ md module:: (adds ->)
st Record (adds ->) Record
st Tuple (adds ->) Tuple
st Unit (adds ->) Unit
@@ -346,7 +346,7 @@ fn x<'lt, T, const C: usize>(_: &()) -> &$0
expect![[r#"
en Enum Enum
ma makro!(…) macro_rules! makro
- md module
+ md module::
st Record Record
st Tuple Tuple
st Unit Unit
@@ -380,7 +380,7 @@ fn foo() -> B$0 {
expect![[r#"
en Enum Enum
ma makro!(…) macro_rules! makro
- md module
+ md module::
st Record Record
st Tuple Tuple
st Unit Unit
@@ -408,7 +408,7 @@ const FOO: $0 = Foo(2);
expect![[r#"
en Enum Enum
ma makro!(…) macro_rules! makro
- md module
+ md module::
st Foo<…> Foo<{unknown}>
st Record Record
st Tuple Tuple
@@ -437,7 +437,7 @@ static FOO: $0 = Foo(2);
expect![[r#"
en Enum Enum
ma makro!(…) macro_rules! makro
- md module
+ md module::
st Foo<…> Foo<{unknown}>
st Record Record
st Tuple Tuple
@@ -468,7 +468,7 @@ fn f2() {
expect![[r#"
en Enum Enum
ma makro!(…) macro_rules! makro
- md module
+ md module::
st Record Record
st Tuple Tuple
st Unit Unit
@@ -500,7 +500,7 @@ fn f2() {
expect![[r#"
en Enum Enum
ma makro!(…) macro_rules! makro
- md module
+ md module::
st Record Record
st Tuple Tuple
st Unit Unit
@@ -529,7 +529,7 @@ fn f2(x: u64) -> $0 {
expect![[r#"
en Enum Enum
ma makro!(…) macro_rules! makro
- md module
+ md module::
st Record Record
st Tuple Tuple
st Unit Unit
@@ -559,7 +559,7 @@ fn f2(x: $0) {
expect![[r#"
en Enum Enum
ma makro!(…) macro_rules! makro
- md module
+ md module::
st Record Record
st Tuple Tuple
st Unit Unit
@@ -595,8 +595,8 @@ fn foo<'lt, T, const C: usize>() {
expect![[r#"
en Enum Enum
ma makro!(…) macro_rules! makro
- md a
- md module
+ md a::
+ md module::
st Record Record
st Tuple Tuple
st Unit Unit
@@ -628,7 +628,7 @@ fn foo<'lt, T, const C: usize>() {
expect![[r#"
en Enum Enum
ma makro!(…) macro_rules! makro
- md module
+ md module::
st Foo<…> Foo<{unknown}>
st Record Record
st Tuple Tuple
@@ -660,7 +660,7 @@ fn foo<'lt, T, const C: usize>() {
expect![[r#"
en Enum Enum
ma makro!(…) macro_rules! makro
- md module
+ md module::
st Record Record
st Tuple Tuple
st Unit Unit
@@ -686,7 +686,7 @@ fn foo<'lt, T, const C: usize>() {
expect![[r#"
en Enum Enum
ma makro!(…) macro_rules! makro
- md module
+ md module::
st Record Record
st Tuple Tuple
st Unit Unit
@@ -729,7 +729,7 @@ fn foo<'lt, T: Trait2<$0>, const CONST_PARAM: usize>(_: T) {}
expect![[r#"
en Enum Enum
ma makro!(…) macro_rules! makro
- md module
+ md module::
st Record Record
st Tuple Tuple
st Unit Unit
@@ -758,7 +758,7 @@ fn foo<'lt, T: Trait2<self::$0>, const CONST_PARAM: usize>(_: T) {}
expect![[r#"
en Enum Enum
ma makro!(…) macro_rules! makro
- md module
+ md module::
st Record Record
st Tuple Tuple
st Unit Unit
@@ -783,7 +783,7 @@ impl Tr<$0
expect![[r#"
en Enum Enum
ma makro!(…) macro_rules! makro
- md module
+ md module::
sp Self dyn Tr<{unknown}> + 'static
st Record Record
st S S
@@ -834,7 +834,7 @@ fn f(t: impl MyTrait<u$0
expect![[r#"
en Enum Enum
ma makro!(…) macro_rules! makro
- md module
+ md module::
st Record Record
st Tuple Tuple
st Unit Unit
@@ -863,7 +863,7 @@ fn f(t: impl MyTrait<u8, u$0
expect![[r#"
en Enum Enum
ma makro!(…) macro_rules! makro
- md module
+ md module::
st Record Record
st Tuple Tuple
st Unit Unit
@@ -910,7 +910,7 @@ fn f(t: impl MyTrait<u$0
expect![[r#"
en Enum Enum
ma makro!(…) macro_rules! makro
- md module
+ md module::
st Record Record
st Tuple Tuple
st Unit Unit
@@ -939,7 +939,7 @@ fn f(t: impl MyTrait<u8, u$0
expect![[r#"
en Enum Enum
ma makro!(…) macro_rules! makro
- md module
+ md module::
st Record Record
st Tuple Tuple
st Unit Unit
@@ -988,7 +988,7 @@ fn f(t: impl MyTrait<Item1 = $0
expect![[r#"
en Enum Enum
ma makro!(…) macro_rules! makro
- md module
+ md module::
st Record Record
st Tuple Tuple
st Unit Unit
@@ -1017,7 +1017,7 @@ fn f(t: impl MyTrait<Item1 = u8, Item2 = $0
expect![[r#"
en Enum Enum
ma makro!(…) macro_rules! makro
- md module
+ md module::
st Record Record
st Tuple Tuple
st Unit Unit
@@ -1069,7 +1069,7 @@ struct Foo {
pub struct S;
"#,
expect![[r#"
- md std
+ md std::
sp Self Foo
st Foo Foo
bt u32 u32
@@ -1098,7 +1098,7 @@ struct Foo {
pub struct S;
"#,
expect![[r#"
- md std
+ md std::
sp Self Foo
st Foo Foo
st S S
@@ -1128,7 +1128,7 @@ fn completes_const_and_type_generics_separately() {
expect![[r#"
en Enum Enum
ma makro!(…) macro_rules! makro
- md module
+ md module::
st Foo Foo
st Record Record
st Tuple Tuple
@@ -1182,7 +1182,7 @@ fn completes_const_and_type_generics_separately() {
expect![[r#"
en Enum Enum
ma makro!(…) macro_rules! makro
- md module
+ md module::
st Foo Foo
st Record Record
st Tuple Tuple
@@ -1233,7 +1233,7 @@ fn completes_const_and_type_generics_separately() {
expect![[r#"
en Enum Enum
ma makro!(…) macro_rules! makro
- md module
+ md module::
st Foo Foo
st Record Record
st Tuple Tuple
@@ -1444,7 +1444,7 @@ struct Bar;
impl $0 for Bar { }
"#,
expect![[r#"
- md module
+ md module::
tt Foo
tt Trait
kw crate::
@@ -1467,7 +1467,7 @@ mod outer {
impl outer::$0 for Bar { }
"#,
expect![[r#"
- md inner
+ md inner::
tt Foo
"#]],
);
diff --git a/crates/ide-completion/src/tests/visibility.rs b/crates/ide-completion/src/tests/visibility.rs
index b404011dfe..113c41226f 100644
--- a/crates/ide-completion/src/tests/visibility.rs
+++ b/crates/ide-completion/src/tests/visibility.rs
@@ -44,7 +44,7 @@ mod foo {
mod bar {}
"#,
expect![[r#"
- md foo
+ md foo::
"#]],
);
check(
@@ -59,7 +59,7 @@ mod qux {
mod bar {}
"#,
expect![[r#"
- md qux
+ md qux::
"#]],
);
check(
@@ -74,7 +74,7 @@ mod qux {
mod bar {}
"#,
expect![[r#"
- md foo
+ md foo::
"#]],
);
}
diff --git a/crates/rust-analyzer/src/config.rs b/crates/rust-analyzer/src/config.rs
index 3a88a8fe84..f4c3f24ce6 100644
--- a/crates/rust-analyzer/src/config.rs
+++ b/crates/rust-analyzer/src/config.rs
@@ -627,6 +627,11 @@ config_data! {
/// Term search fuel in "units of work" for assists (Defaults to 1800).
assist_termSearch_fuel: usize = 1800,
+ /// Automatically add `::` when completing the module.
+ ///
+ /// Will not be completed in `use`.
+ completion_addColonsToModule: bool = true,
+
/// Automatically add a semicolon when completing unit-returning functions.
///
/// In `match` arms it completes a comma instead.
@@ -1901,6 +1906,7 @@ impl Config {
CallableCompletionDef::AddParentheses => Some(CallableSnippets::AddParentheses),
CallableCompletionDef::None => None,
},
+ add_colons_to_module: *self.completion_addColonsToModule(source_root),
add_semicolon_to_unit: *self.completion_addSemicolonToUnit(source_root),
snippet_cap: SnippetCap::new(self.completion_snippet()),
insert_use: self.insert_use_config(source_root),
diff --git a/crates/rust-analyzer/src/integrated_benchmarks.rs b/crates/rust-analyzer/src/integrated_benchmarks.rs
index af449c473a..bd3574ae0a 100644
--- a/crates/rust-analyzer/src/integrated_benchmarks.rs
+++ b/crates/rust-analyzer/src/integrated_benchmarks.rs
@@ -162,36 +162,7 @@ fn integrated_completion_benchmark() {
{
let _span = profile::cpu_span();
let analysis = host.analysis();
- let config = CompletionConfig {
- enable_postfix_completions: true,
- enable_imports_on_the_fly: true,
- enable_self_on_the_fly: true,
- enable_private_editable: true,
- enable_term_search: true,
- term_search_fuel: 200,
- full_function_signatures: false,
- callable: Some(CallableSnippets::FillArguments),
- snippet_cap: SnippetCap::new(true),
- insert_use: InsertUseConfig {
- granularity: ImportGranularity::Crate,
- prefix_kind: hir::PrefixKind::ByCrate,
- enforce_granularity: true,
- group: true,
- skip_glob_imports: true,
- },
- prefer_no_std: false,
- prefer_prelude: true,
- prefer_absolute: false,
- snippets: Vec::new(),
- limit: None,
- add_semicolon_to_unit: true,
- fields_to_resolve: CompletionFieldsToResolve::empty(),
- exclude_flyimport: vec![],
- exclude_traits: &[],
- enable_auto_await: true,
- enable_auto_iter: true,
- ra_fixture: RaFixtureConfig::default(),
- };
+ let config = completion_config();
let position =
FilePosition { file_id, offset: TextSize::try_from(completion_offset).unwrap() };
analysis.completions(&config, position, None).unwrap();
@@ -217,36 +188,7 @@ fn integrated_completion_benchmark() {
let _p = tracing::info_span!("unqualified path completion").entered();
let _span = profile::cpu_span();
let analysis = host.analysis();
- let config = CompletionConfig {
- enable_postfix_completions: true,
- enable_imports_on_the_fly: true,
- enable_self_on_the_fly: true,
- enable_private_editable: true,
- enable_term_search: true,
- term_search_fuel: 200,
- full_function_signatures: false,
- callable: Some(CallableSnippets::FillArguments),
- snippet_cap: SnippetCap::new(true),
- insert_use: InsertUseConfig {
- granularity: ImportGranularity::Crate,
- prefix_kind: hir::PrefixKind::ByCrate,
- enforce_granularity: true,
- group: true,
- skip_glob_imports: true,
- },
- prefer_no_std: false,
- prefer_prelude: true,
- prefer_absolute: false,
- snippets: Vec::new(),
- limit: None,
- add_semicolon_to_unit: true,
- fields_to_resolve: CompletionFieldsToResolve::empty(),
- exclude_flyimport: vec![],
- exclude_traits: &[],
- enable_auto_await: true,
- enable_auto_iter: true,
- ra_fixture: RaFixtureConfig::default(),
- };
+ let config = completion_config();
let position =
FilePosition { file_id, offset: TextSize::try_from(completion_offset).unwrap() };
analysis.completions(&config, position, None).unwrap();
@@ -270,36 +212,7 @@ fn integrated_completion_benchmark() {
let _p = tracing::info_span!("dot completion").entered();
let _span = profile::cpu_span();
let analysis = host.analysis();
- let config = CompletionConfig {
- enable_postfix_completions: true,
- enable_imports_on_the_fly: true,
- enable_self_on_the_fly: true,
- enable_private_editable: true,
- enable_term_search: true,
- term_search_fuel: 200,
- full_function_signatures: false,
- callable: Some(CallableSnippets::FillArguments),
- snippet_cap: SnippetCap::new(true),
- insert_use: InsertUseConfig {
- granularity: ImportGranularity::Crate,
- prefix_kind: hir::PrefixKind::ByCrate,
- enforce_granularity: true,
- group: true,
- skip_glob_imports: true,
- },
- prefer_no_std: false,
- prefer_prelude: true,
- prefer_absolute: false,
- snippets: Vec::new(),
- limit: None,
- add_semicolon_to_unit: true,
- fields_to_resolve: CompletionFieldsToResolve::empty(),
- exclude_flyimport: vec![],
- exclude_traits: &[],
- enable_auto_await: true,
- enable_auto_iter: true,
- ra_fixture: RaFixtureConfig::default(),
- };
+ let config = completion_config();
let position =
FilePosition { file_id, offset: TextSize::try_from(completion_offset).unwrap() };
analysis.completions(&config, position, None).unwrap();
@@ -400,3 +313,37 @@ fn patch(what: &mut String, from: &str, to: &str) -> usize {
*what = what.replacen(from, to, 1);
idx
}
+
+fn completion_config() -> CompletionConfig<'static> {
+ CompletionConfig {
+ enable_postfix_completions: true,
+ enable_imports_on_the_fly: true,
+ enable_self_on_the_fly: true,
+ enable_private_editable: true,
+ enable_term_search: true,
+ term_search_fuel: 200,
+ full_function_signatures: false,
+ callable: Some(CallableSnippets::FillArguments),
+ snippet_cap: SnippetCap::new(true),
+ insert_use: InsertUseConfig {
+ granularity: ImportGranularity::Crate,
+ prefix_kind: hir::PrefixKind::ByCrate,
+ enforce_granularity: true,
+ group: true,
+ skip_glob_imports: true,
+ },
+ prefer_no_std: false,
+ prefer_prelude: true,
+ prefer_absolute: false,
+ snippets: Vec::new(),
+ limit: None,
+ add_colons_to_module: true,
+ add_semicolon_to_unit: true,
+ fields_to_resolve: CompletionFieldsToResolve::empty(),
+ exclude_flyimport: vec![],
+ exclude_traits: &[],
+ enable_auto_await: true,
+ enable_auto_iter: true,
+ ra_fixture: RaFixtureConfig::default(),
+ }
+}
diff --git a/docs/book/src/configuration_generated.md b/docs/book/src/configuration_generated.md
index da37fc1582..069c8211db 100644
--- a/docs/book/src/configuration_generated.md
+++ b/docs/book/src/configuration_generated.md
@@ -375,6 +375,15 @@ If false, `-p <package>` will be passed instead if applicable. In case it is not
check will be performed.
+## rust-analyzer.completion.addColonsToModule {#completion.addColonsToModule}
+
+Default: `true`
+
+Automatically add `::` when completing the module.
+
+Will not be completed in `use`.
+
+
## rust-analyzer.completion.addSemicolonToUnit {#completion.addSemicolonToUnit}
Default: `true`
diff --git a/editors/code/package.json b/editors/code/package.json
index 67570cd067..14369e6f33 100644
--- a/editors/code/package.json
+++ b/editors/code/package.json
@@ -1277,6 +1277,16 @@
{
"title": "Completion",
"properties": {
+ "rust-analyzer.completion.addColonsToModule": {
+ "markdownDescription": "Automatically add `::` when completing the module.\n\nWill not be completed in `use`.",
+ "default": true,
+ "type": "boolean"
+ }
+ }
+ },
+ {
+ "title": "Completion",
+ "properties": {
"rust-analyzer.completion.addSemicolonToUnit": {
"markdownDescription": "Automatically add a semicolon when completing unit-returning functions.\n\nIn `match` arms it completes a comma instead.",
"default": true,