if ctx.has_impl_or_trait_prev_sibling() {
add_keyword("where", "where ");
+ if ctx.has_impl_prev_sibling() {
+ add_keyword("for", "for ");
+ }
return;
}
if ctx.previous_token_is(T![unsafe]) {
}
pub(crate) fn complete_item_snippet(acc: &mut Completions, ctx: &CompletionContext) {
- if !ctx.expects_item() || ctx.previous_token_is(T![unsafe]) || ctx.path_qual().is_some() {
+ if !ctx.expects_item()
+ || ctx.previous_token_is(T![unsafe])
+ || ctx.path_qual().is_some()
+ || ctx.has_impl_or_trait_prev_sibling()
+ {
return;
}
if ctx.has_visibility_prev_sibling() {
use crate::{patterns::ImmediateLocation, CompletionContext, Completions};
pub(crate) fn complete_unqualified_path(acc: &mut Completions, ctx: &CompletionContext) {
- if ctx.is_path_disallowed() || !ctx.is_trivial_path() {
+ if ctx.is_path_disallowed() || !ctx.is_trivial_path() || ctx.has_impl_or_trait_prev_sibling() {
return;
}
return;
}
let add_resolution = match res {
+ ScopeDef::ImplSelfType(_) => {
+ !ctx.previous_token_is(syntax::T![impl]) && !ctx.previous_token_is(syntax::T![for])
+ }
// Don't suggest attribute macros and derives.
ScopeDef::MacroDef(mac) => mac.is_fn_like(),
// no values in type places
)
}
+ pub(crate) fn has_impl_prev_sibling(&self) -> bool {
+ matches!(self.prev_sibling, Some(ImmediatePrevSibling::ImplDefType))
+ }
+
pub(crate) fn has_visibility_prev_sibling(&self) -> bool {
matches!(self.prev_sibling, Some(ImmediatePrevSibling::Visibility))
}
#[test]
fn target_type_or_trait_in_impl_block() {
- // FIXME: should not complete `Self`
check(
r#"
-impl My$0
+impl Tra$0
"#,
expect![[r##"
- sp Self
tt Trait
en Enum
st Struct
}
#[test]
-fn after_trait_name_in_trait_def() {
- // FIXME: should only complete `where`
+fn target_type_in_trait_impl_block() {
check(
- r"trait A $0",
+ r#"
+impl Trait for Str$0
+"#,
expect![[r##"
- kw where
- sn tmod (Test module)
- sn tfn (Test function)
- sn macro_rules
+ tt Trait
+ en Enum
+ st Struct
md bar
- ma foo!(…) #[macro_export] macro_rules! foo
- ma foo!(…) #[macro_export] macro_rules! foo
+ ma foo!(…) #[macro_export] macro_rules! foo
+ ma foo!(…) #[macro_export] macro_rules! foo
+ bt u32
+ bt bool
+ bt u8
+ bt isize
+ bt u16
+ bt u64
+ bt u128
+ bt f32
+ bt i128
+ bt i16
+ bt str
+ bt i64
+ bt char
+ bt f64
+ bt i32
+ bt i8
+ bt usize
"##]],
+ )
+}
+
+#[test]
+fn after_trait_name_in_trait_def() {
+ check(
+ r"trait A $0",
+ expect![[r#"
+ kw where
+ "#]],
);
}
#[test]
fn after_trait_or_target_name_in_impl() {
- // FIXME: should only complete `for` and `where`
check(
- r"impl A $0",
- expect![[r##"
+ r"impl Trait $0",
+ expect![[r#"
kw where
- sn tmod (Test module)
- sn tfn (Test function)
- sn macro_rules
- md bar
- ma foo!(…) #[macro_export] macro_rules! foo
- ma foo!(…) #[macro_export] macro_rules! foo
- "##]],
+ kw for
+ "#]],
);
}