Don't show incorrect completions after unsafe or visiblity node

This commit is contained in:
Lukas Wirth 2021-06-16 17:56:04 +02:00
parent 1a8f76a224
commit 9ea6ee6b27
4 changed files with 38 additions and 42 deletions

View File

@ -90,11 +90,13 @@ pub(crate) fn complete_expr_keyword(acc: &mut Completions, ctx: &CompletionConte
}
if expects_item || has_block_expr_parent {
if !ctx.has_visibility_prev_sibling() {
add_keyword("impl", "impl $1 {\n $0\n}");
add_keyword("extern", "extern $0");
}
add_keyword("use", "use $0");
add_keyword("impl", "impl $1 {\n $0\n}");
add_keyword("trait", "trait $1 {\n $0\n}");
add_keyword("static", "static $0");
add_keyword("extern", "extern $0");
add_keyword("mod", "mod $0");
}
@ -241,11 +243,11 @@ mod tests {
kw fn
kw const
kw type
kw use
kw impl
kw extern
kw use
kw trait
kw static
kw extern
kw mod
kw match
kw while
@ -269,11 +271,11 @@ mod tests {
kw fn
kw const
kw type
kw use
kw impl
kw extern
kw use
kw trait
kw static
kw extern
kw mod
kw match
kw while
@ -297,11 +299,11 @@ mod tests {
kw fn
kw const
kw type
kw use
kw impl
kw extern
kw use
kw trait
kw static
kw extern
kw mod
kw match
kw while
@ -399,11 +401,11 @@ fn quux() -> i32 {
kw fn
kw const
kw type
kw use
kw impl
kw extern
kw use
kw trait
kw static
kw extern
kw mod
kw match
kw while

View File

@ -1,6 +1,7 @@
//! This file provides snippet completions, like `pd` => `eprintln!(...)`.
use ide_db::helpers::SnippetCap;
use syntax::T;
use crate::{
context::PathCompletionContext, item::Builder, CompletionContext, CompletionItem,
@ -35,9 +36,13 @@ pub(crate) fn complete_expr_snippet(acc: &mut Completions, ctx: &CompletionConte
}
pub(crate) fn complete_item_snippet(acc: &mut Completions, ctx: &CompletionContext) {
if !ctx.expects_item() {
if !ctx.expects_item() || ctx.previous_token_is(T![unsafe]) {
return;
}
if ctx.has_visibility_prev_sibling() {
return; // technically we could do some of these snippet completions if we were to put the
// attributes before the vis node.
}
let cap = match ctx.config.snippet_cap {
Some(it) => it,
None => return,

View File

@ -311,13 +311,16 @@ impl<'a> CompletionContext<'a> {
}
pub(crate) fn is_path_disallowed(&self) -> bool {
matches!(
self.completion_location,
Some(ImmediateLocation::Attribute(_))
| Some(ImmediateLocation::ModDeclaration(_))
| Some(ImmediateLocation::RecordPat(_))
| Some(ImmediateLocation::RecordExpr(_))
) || self.attribute_under_caret.is_some()
self.attribute_under_caret.is_some()
|| self.previous_token_is(T![unsafe])
|| self.has_visibility_prev_sibling()
|| matches!(
self.completion_location,
Some(ImmediateLocation::Attribute(_))
| Some(ImmediateLocation::ModDeclaration(_))
| Some(ImmediateLocation::RecordPat(_))
| Some(ImmediateLocation::RecordExpr(_))
)
}
pub(crate) fn expects_expression(&self) -> bool {

View File

@ -16,11 +16,11 @@ fn in_mod_item_list() {
kw fn
kw const
kw type
kw use
kw impl
kw extern
kw use
kw trait
kw static
kw extern
kw mod
kw enum
kw struct
@ -51,11 +51,11 @@ $0"#,
kw fn
kw const
kw type
kw use
kw impl
kw extern
kw use
kw trait
kw static
kw extern
kw mod
kw enum
kw struct
@ -89,11 +89,11 @@ crate::$0"#,
kw fn
kw const
kw type
kw use
kw impl
kw extern
kw use
kw trait
kw static
kw extern
kw mod
kw enum
kw struct
@ -119,17 +119,11 @@ mod bar {}
const CONST: () = ();
unsafe $0"#,
expect![[r##"
expect![[r#"
kw fn
kw trait
kw impl
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
"##]],
"#]],
);
}
@ -145,26 +139,18 @@ mod bar {}
const CONST: () = ();
pub $0"#,
expect![[r##"
expect![[r#"
kw unsafe
kw fn
kw const
kw type
kw use
kw impl
kw trait
kw static
kw extern
kw mod
kw enum
kw struct
kw union
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
"##]],
"#]],
);
}