Correct completions in items tests

This commit is contained in:
Lukas Wirth 2021-06-17 15:43:21 +02:00
parent a9a77671f2
commit 2a48b53220
5 changed files with 57 additions and 24 deletions

View File

@ -69,6 +69,9 @@ pub(crate) fn complete_expr_keyword(acc: &mut Completions, ctx: &CompletionConte
if ctx.has_impl_or_trait_prev_sibling() { if ctx.has_impl_or_trait_prev_sibling() {
add_keyword("where", "where "); add_keyword("where", "where ");
if ctx.has_impl_prev_sibling() {
add_keyword("for", "for ");
}
return; return;
} }
if ctx.previous_token_is(T![unsafe]) { if ctx.previous_token_is(T![unsafe]) {

View File

@ -36,7 +36,11 @@ pub(crate) fn complete_expr_snippet(acc: &mut Completions, ctx: &CompletionConte
} }
pub(crate) fn complete_item_snippet(acc: &mut Completions, ctx: &CompletionContext) { 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; return;
} }
if ctx.has_visibility_prev_sibling() { if ctx.has_visibility_prev_sibling() {

View File

@ -6,7 +6,7 @@ use syntax::{ast, AstNode};
use crate::{patterns::ImmediateLocation, CompletionContext, Completions}; use crate::{patterns::ImmediateLocation, CompletionContext, Completions};
pub(crate) fn complete_unqualified_path(acc: &mut Completions, ctx: &CompletionContext) { 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;
} }
@ -68,6 +68,9 @@ pub(crate) fn complete_unqualified_path(acc: &mut Completions, ctx: &CompletionC
return; return;
} }
let add_resolution = match res { 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. // Don't suggest attribute macros and derives.
ScopeDef::MacroDef(mac) => mac.is_fn_like(), ScopeDef::MacroDef(mac) => mac.is_fn_like(),
// no values in type places // no values in type places

View File

@ -305,6 +305,10 @@ impl<'a> CompletionContext<'a> {
) )
} }
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 { pub(crate) fn has_visibility_prev_sibling(&self) -> bool {
matches!(self.prev_sibling, Some(ImmediatePrevSibling::Visibility)) matches!(self.prev_sibling, Some(ImmediatePrevSibling::Visibility))
} }

View File

@ -23,13 +23,45 @@ trait Trait {}
#[test] #[test]
fn target_type_or_trait_in_impl_block() { fn target_type_or_trait_in_impl_block() {
// FIXME: should not complete `Self`
check( check(
r#" r#"
impl My$0 impl Tra$0
"#,
expect![[r##"
tt Trait
en Enum
st Struct
md bar
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 target_type_in_trait_impl_block() {
check(
r#"
impl Trait for Str$0
"#, "#,
expect![[r##" expect![[r##"
sp Self
tt Trait tt Trait
en Enum en Enum
st Struct st Struct
@ -59,35 +91,22 @@ impl My$0
#[test] #[test]
fn after_trait_name_in_trait_def() { fn after_trait_name_in_trait_def() {
// FIXME: should only complete `where`
check( check(
r"trait A $0", r"trait A $0",
expect![[r##" expect![[r#"
kw where 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
"##]],
); );
} }
#[test] #[test]
fn after_trait_or_target_name_in_impl() { fn after_trait_or_target_name_in_impl() {
// FIXME: should only complete `for` and `where`
check( check(
r"impl A $0", r"impl Trait $0",
expect![[r##" expect![[r#"
kw where kw where
sn tmod (Test module) kw for
sn tfn (Test function) "#]],
sn macro_rules
md bar
ma foo!() #[macro_export] macro_rules! foo
ma foo!() #[macro_export] macro_rules! foo
"##]],
); );
} }