Unnamed repository; edit this file 'description' to name the repository.
-rw-r--r--crates/ide-completion/src/completions.rs7
-rw-r--r--crates/ide-completion/src/completions/type.rs1
-rw-r--r--crates/ide-completion/src/tests/item.rs8
-rw-r--r--crates/ide-completion/src/tests/predicate.rs12
-rw-r--r--crates/ide-completion/src/tests/special.rs12
-rw-r--r--crates/ide-completion/src/tests/type_pos.rs175
6 files changed, 215 insertions, 0 deletions
diff --git a/crates/ide-completion/src/completions.rs b/crates/ide-completion/src/completions.rs
index ed58e862d4..abae3cb368 100644
--- a/crates/ide-completion/src/completions.rs
+++ b/crates/ide-completion/src/completions.rs
@@ -111,6 +111,13 @@ impl Completions {
}
}
+ pub(crate) fn add_type_keywords(&mut self, ctx: &CompletionContext<'_>) {
+ self.add_keyword_snippet(ctx, "fn", "fn($1)");
+ self.add_keyword_snippet(ctx, "dyn", "dyn $0");
+ self.add_keyword_snippet(ctx, "impl", "impl $0");
+ self.add_keyword_snippet(ctx, "for", "for<$1>");
+ }
+
pub(crate) fn add_super_keyword(
&mut self,
ctx: &CompletionContext<'_>,
diff --git a/crates/ide-completion/src/completions/type.rs b/crates/ide-completion/src/completions/type.rs
index 3112462cda..3465b73321 100644
--- a/crates/ide-completion/src/completions/type.rs
+++ b/crates/ide-completion/src/completions/type.rs
@@ -205,6 +205,7 @@ pub(crate) fn complete_type_path(
};
acc.add_nameref_keywords_with_colon(ctx);
+ acc.add_type_keywords(ctx);
ctx.process_all_names(&mut |name, def, doc_aliases| {
if scope_def_applicable(def) {
acc.add_path_resolution(ctx, path_ctx, name, def, doc_aliases);
diff --git a/crates/ide-completion/src/tests/item.rs b/crates/ide-completion/src/tests/item.rs
index ed87b339fe..61a9da8c27 100644
--- a/crates/ide-completion/src/tests/item.rs
+++ b/crates/ide-completion/src/tests/item.rs
@@ -23,6 +23,10 @@ impl Tra$0
un Union Union
bt u32 u32
kw crate::
+ kw dyn
+ kw fn
+ kw for
+ kw impl
kw self::
"#]],
)
@@ -45,6 +49,10 @@ impl Trait for Str$0
un Union Union
bt u32 u32
kw crate::
+ kw dyn
+ kw fn
+ kw for
+ kw impl
kw self::
"#]],
)
diff --git a/crates/ide-completion/src/tests/predicate.rs b/crates/ide-completion/src/tests/predicate.rs
index 65036f6a22..682b8904e5 100644
--- a/crates/ide-completion/src/tests/predicate.rs
+++ b/crates/ide-completion/src/tests/predicate.rs
@@ -22,6 +22,10 @@ struct Foo<'lt, T, const C: usize> where $0 {}
un Union Union
bt u32 u32
kw crate::
+ kw dyn
+ kw fn
+ kw for
+ kw impl
kw self::
"#]],
);
@@ -95,6 +99,10 @@ struct Foo<'lt, T, const C: usize> where for<'a> $0 {}
un Union Union
bt u32 u32
kw crate::
+ kw dyn
+ kw fn
+ kw for
+ kw impl
kw self::
"#]],
);
@@ -120,6 +128,10 @@ impl Record {
un Union Union
bt u32 u32
kw crate::
+ kw dyn
+ kw fn
+ kw for
+ kw impl
kw self::
"#]],
);
diff --git a/crates/ide-completion/src/tests/special.rs b/crates/ide-completion/src/tests/special.rs
index c438ca7880..59a0c144c8 100644
--- a/crates/ide-completion/src/tests/special.rs
+++ b/crates/ide-completion/src/tests/special.rs
@@ -1492,6 +1492,10 @@ fn foo(_: a_$0) { }
expect![[r#"
bt u32 u32
kw crate::
+ kw dyn
+ kw fn
+ kw for
+ kw impl
kw self::
"#]],
);
@@ -1506,6 +1510,10 @@ fn foo<T>() {
tp T
bt u32 u32
kw crate::
+ kw dyn
+ kw fn
+ kw for
+ kw impl
kw self::
"#]],
);
@@ -1531,6 +1539,10 @@ fn foo<const N: $0>() {}
expect![[r#"
bt u32 u32
kw crate::
+ kw dyn
+ kw fn
+ kw for
+ kw impl
kw self::
"#]],
);
diff --git a/crates/ide-completion/src/tests/type_pos.rs b/crates/ide-completion/src/tests/type_pos.rs
index 125e11e9e3..3bbba18c2b 100644
--- a/crates/ide-completion/src/tests/type_pos.rs
+++ b/crates/ide-completion/src/tests/type_pos.rs
@@ -25,6 +25,10 @@ struct Foo<'lt, T, const C: usize> {
un Union Union
bt u32 u32
kw crate::
+ kw dyn
+ kw fn
+ kw for
+ kw impl
kw self::
"#]],
)
@@ -50,6 +54,10 @@ struct Foo<'lt, T, const C: usize>(f$0);
un Union Union
bt u32 u32
kw crate::
+ kw dyn
+ kw fn
+ kw for
+ kw impl
kw pub
kw pub(crate)
kw pub(super)
@@ -76,6 +84,37 @@ fn x<'lt, T, const C: usize>() -> $0
un Union Union
bt u32 u32
kw crate::
+ kw dyn
+ kw fn
+ kw for
+ kw impl
+ kw self::
+ "#]],
+ );
+}
+
+#[test]
+fn fn_return_type_after_reference() {
+ check_with_base_items(
+ r#"
+fn x<'lt, T, const C: usize>(_: &()) -> &$0
+"#,
+ expect![[r#"
+ en Enum Enum
+ ma makro!(…) macro_rules! makro
+ md module
+ st Record Record
+ st Tuple Tuple
+ st Unit Unit
+ tt Trait
+ tp T
+ un Union Union
+ bt u32 u32
+ kw crate::
+ kw dyn
+ kw fn
+ kw for
+ kw impl
kw self::
"#]],
);
@@ -106,6 +145,10 @@ fn foo() -> B$0 {
bt u32 u32
it ()
kw crate::
+ kw dyn
+ kw fn
+ kw for
+ kw impl
kw self::
"#]],
)
@@ -131,6 +174,10 @@ const FOO: $0 = Foo(2);
bt u32 u32
it Foo<i32>
kw crate::
+ kw dyn
+ kw fn
+ kw for
+ kw impl
kw self::
"#]],
);
@@ -157,6 +204,10 @@ fn f2() {
bt u32 u32
it i32
kw crate::
+ kw dyn
+ kw fn
+ kw for
+ kw impl
kw self::
"#]],
);
@@ -185,6 +236,10 @@ fn f2() {
bt u32 u32
it u64
kw crate::
+ kw dyn
+ kw fn
+ kw for
+ kw impl
kw self::
"#]],
);
@@ -210,6 +265,10 @@ fn f2(x: u64) -> $0 {
bt u32 u32
it u64
kw crate::
+ kw dyn
+ kw fn
+ kw for
+ kw impl
kw self::
"#]],
);
@@ -236,6 +295,10 @@ fn f2(x: $0) {
bt u32 u32
it i32
kw crate::
+ kw dyn
+ kw fn
+ kw for
+ kw impl
kw self::
"#]],
);
@@ -270,6 +333,10 @@ fn foo<'lt, T, const C: usize>() {
bt u32 u32
it a::Foo<a::Foo<i32>>
kw crate::
+ kw dyn
+ kw fn
+ kw for
+ kw impl
kw self::
"#]],
);
@@ -299,6 +366,10 @@ fn foo<'lt, T, const C: usize>() {
bt u32 u32
it Foo<i32>
kw crate::
+ kw dyn
+ kw fn
+ kw for
+ kw impl
kw self::
"#]],
);
@@ -325,6 +396,10 @@ fn foo<'lt, T, const C: usize>() {
un Union Union
bt u32 u32
kw crate::
+ kw dyn
+ kw fn
+ kw for
+ kw impl
kw self::
"#]],
);
@@ -392,6 +467,10 @@ fn foo<'lt, T: Trait2<$0>, const CONST_PARAM: usize>(_: T) {}
un Union Union
bt u32 u32
kw crate::
+ kw dyn
+ kw fn
+ kw for
+ kw impl
kw self::
"#]],
);
@@ -442,6 +521,10 @@ impl Tr<$0
un Union Union
bt u32 u32
kw crate::
+ kw dyn
+ kw fn
+ kw for
+ kw impl
kw self::
"#]],
);
@@ -487,6 +570,10 @@ fn f(t: impl MyTrait<u$0
un Union Union
bt u32 u32
kw crate::
+ kw dyn
+ kw fn
+ kw for
+ kw impl
kw self::
"#]],
);
@@ -512,6 +599,10 @@ fn f(t: impl MyTrait<u8, u$0
un Union Union
bt u32 u32
kw crate::
+ kw dyn
+ kw fn
+ kw for
+ kw impl
kw self::
"#]],
);
@@ -555,6 +646,10 @@ fn f(t: impl MyTrait<u$0
un Union Union
bt u32 u32
kw crate::
+ kw dyn
+ kw fn
+ kw for
+ kw impl
kw self::
"#]],
);
@@ -582,6 +677,10 @@ fn f(t: impl MyTrait<u8, u$0
un Union Union
bt u32 u32
kw crate::
+ kw dyn
+ kw fn
+ kw for
+ kw impl
kw self::
"#]],
);
@@ -625,6 +724,10 @@ fn f(t: impl MyTrait<Item1 = $0
un Union Union
bt u32 u32
kw crate::
+ kw dyn
+ kw fn
+ kw for
+ kw impl
kw self::
"#]],
);
@@ -650,6 +753,10 @@ fn f(t: impl MyTrait<Item1 = u8, Item2 = $0
un Union Union
bt u32 u32
kw crate::
+ kw dyn
+ kw fn
+ kw for
+ kw impl
kw self::
"#]],
);
@@ -666,6 +773,10 @@ fn f(t: impl MyTrait<C = $0
ct CONST Unit
ma makro!(…) macro_rules! makro
kw crate::
+ kw dyn
+ kw fn
+ kw for
+ kw impl
kw self::
"#]],
);
@@ -690,6 +801,10 @@ pub struct S;
st Foo Foo
bt u32 u32
kw crate::
+ kw dyn
+ kw fn
+ kw for
+ kw impl
kw self::
"#]],
)
@@ -716,6 +831,10 @@ pub struct S;
st S S
bt u32 u32
kw crate::
+ kw dyn
+ kw fn
+ kw for
+ kw impl
kw self::
"#]],
)
@@ -745,6 +864,10 @@ fn completes_const_and_type_generics_separately() {
un Union Union
bt u32 u32
kw crate::
+ kw dyn
+ kw fn
+ kw for
+ kw impl
kw self::
"#]],
);
@@ -765,6 +888,10 @@ fn completes_const_and_type_generics_separately() {
ct X usize
ma makro!(…) macro_rules! makro
kw crate::
+ kw dyn
+ kw fn
+ kw for
+ kw impl
kw self::
"#]],
);
@@ -791,6 +918,10 @@ fn completes_const_and_type_generics_separately() {
un Union Union
bt u32 u32
kw crate::
+ kw dyn
+ kw fn
+ kw for
+ kw impl
kw self::
"#]],
);
@@ -808,6 +939,10 @@ fn completes_const_and_type_generics_separately() {
ct X usize
ma makro!(…) macro_rules! makro
kw crate::
+ kw dyn
+ kw fn
+ kw for
+ kw impl
kw self::
"#]],
);
@@ -835,6 +970,10 @@ fn completes_const_and_type_generics_separately() {
un Union Union
bt u32 u32
kw crate::
+ kw dyn
+ kw fn
+ kw for
+ kw impl
kw self::
"#]],
);
@@ -852,6 +991,10 @@ fn completes_const_and_type_generics_separately() {
ct X usize
ma makro!(…) macro_rules! makro
kw crate::
+ kw dyn
+ kw fn
+ kw for
+ kw impl
kw self::
"#]],
);
@@ -870,6 +1013,10 @@ fn completes_const_and_type_generics_separately() {
ct X usize
ma makro!(…) macro_rules! makro
kw crate::
+ kw dyn
+ kw fn
+ kw for
+ kw impl
kw self::
"#]],
);
@@ -889,6 +1036,10 @@ fn completes_const_and_type_generics_separately() {
ct X usize
ma makro!(…) macro_rules! makro
kw crate::
+ kw dyn
+ kw fn
+ kw for
+ kw impl
kw self::
"#]],
);
@@ -907,6 +1058,10 @@ fn completes_const_and_type_generics_separately() {
ct X usize
ma makro!(…) macro_rules! makro
kw crate::
+ kw dyn
+ kw fn
+ kw for
+ kw impl
kw self::
"#]],
);
@@ -923,6 +1078,10 @@ fn completes_const_and_type_generics_separately() {
ct X usize
ma makro!(…) macro_rules! makro
kw crate::
+ kw dyn
+ kw fn
+ kw for
+ kw impl
kw self::
"#]],
);
@@ -941,6 +1100,10 @@ fn completes_const_and_type_generics_separately() {
ct X usize
ma makro!(…) macro_rules! makro
kw crate::
+ kw dyn
+ kw fn
+ kw for
+ kw impl
kw self::
"#]],
);
@@ -955,6 +1118,10 @@ fn foo<'a>() { S::<F$0, _>; }
ct CONST Unit
ma makro!(…) macro_rules! makro
kw crate::
+ kw dyn
+ kw fn
+ kw for
+ kw impl
kw self::
"#]],
);
@@ -968,6 +1135,10 @@ fn foo<'a>() { S::<'static, 'static, F$0, _>; }
ct CONST Unit
ma makro!(…) macro_rules! makro
kw crate::
+ kw dyn
+ kw fn
+ kw for
+ kw impl
kw self::
"#]],
);
@@ -980,6 +1151,10 @@ fn foo<'a>() { S::<'static, F$0, _, _>; }
lt 'a
ma makro!(…) macro_rules! makro
kw crate::
+ kw dyn
+ kw fn
+ kw for
+ kw impl
kw self::
"#]],
);