Auto merge of #12159 - Veykril:completions-rev, r=Veykril

internal: Lift out macro bang property from completion PathKind enum
This commit is contained in:
bors 2022-05-05 08:51:18 +00:00
commit 01198da2a2
4 changed files with 41 additions and 11 deletions

View file

@ -161,10 +161,10 @@ pub(crate) fn import_on_the_fly(acc: &mut Completions, ctx: &CompletionContext)
(_, ItemInNs::Types(hir::ModuleDef::Module(_))) => true, (_, ItemInNs::Types(hir::ModuleDef::Module(_))) => true,
// and so are macros(except for attributes) // and so are macros(except for attributes)
( (
PathKind::Expr | PathKind::Type | PathKind::Mac | PathKind::Pat, PathKind::Expr | PathKind::Type | PathKind::Item | PathKind::Pat,
ItemInNs::Macros(mac), ItemInNs::Macros(mac),
) => mac.is_fn_like(ctx.db), ) => mac.is_fn_like(ctx.db),
(PathKind::Mac, _) => true, (PathKind::Item, _) => true,
(PathKind::Expr, ItemInNs::Types(_) | ItemInNs::Values(_)) => true, (PathKind::Expr, ItemInNs::Types(_) | ItemInNs::Values(_)) => true,

View file

@ -19,7 +19,7 @@ pub(crate) fn complete_unqualified_path(acc: &mut Completions, ctx: &CompletionC
Some(PathCompletionCtx { Some(PathCompletionCtx {
is_absolute_path: false, is_absolute_path: false,
qualifier: None, qualifier: None,
kind: None | Some(PathKind::Expr | PathKind::Type | PathKind::Mac), kind: None | Some(PathKind::Expr | PathKind::Type | PathKind::Item),
.. ..
}) => (), }) => (),
_ => return, _ => return,

View file

@ -47,12 +47,17 @@ pub(crate) enum Visible {
pub(super) enum PathKind { pub(super) enum PathKind {
Expr, Expr,
Type, Type,
Attr { kind: AttrKind, annotated_item_kind: Option<SyntaxKind> }, Attr {
kind: AttrKind,
annotated_item_kind: Option<SyntaxKind>,
},
Derive, Derive,
// This should be removed in favor of `has_macro_bang` in PathCompletionContext /// Path in item position, that is inside an (Assoc)ItemList
Mac, Item,
Pat, Pat,
Vis { has_in_token: bool }, Vis {
has_in_token: bool,
},
Use, Use,
} }
@ -60,6 +65,8 @@ pub(super) enum PathKind {
pub(crate) struct PathCompletionCtx { pub(crate) struct PathCompletionCtx {
/// If this is a call with () already there (or {} in case of record patterns) /// If this is a call with () already there (or {} in case of record patterns)
pub(super) has_call_parens: bool, pub(super) has_call_parens: bool,
/// If this has a macro call bang !
pub(super) has_macro_bang: bool,
/// Whether this path stars with a `::`. /// Whether this path stars with a `::`.
pub(super) is_absolute_path: bool, pub(super) is_absolute_path: bool,
/// The qualifier of the current path if it exists. /// The qualifier of the current path if it exists.
@ -942,6 +949,7 @@ impl<'a> CompletionContext<'a> {
has_type_args: false, has_type_args: false,
can_be_stmt: false, can_be_stmt: false,
in_loop_body: false, in_loop_body: false,
has_macro_bang: false,
kind: None, kind: None,
}; };
let mut pat_ctx = None; let mut pat_ctx = None;
@ -970,7 +978,21 @@ impl<'a> CompletionContext<'a> {
pat_ctx = Some(pattern_context_for(original_file, it.into())); pat_ctx = Some(pattern_context_for(original_file, it.into()));
Some(PathKind::Pat) Some(PathKind::Pat)
}, },
ast::MacroCall(it) => it.excl_token().and(Some(PathKind::Mac)), ast::MacroCall(it) => {
path_ctx.has_macro_bang = it.excl_token().is_some();
match it.syntax().parent().map(|it| it.kind()) {
Some(SyntaxKind::MACRO_PAT) => Some(PathKind::Pat),
Some(SyntaxKind::MACRO_TYPE) => Some(PathKind::Type),
Some(SyntaxKind::MACRO_EXPR) => Some(PathKind::Expr),
Some(
SyntaxKind::ITEM_LIST
| SyntaxKind::ASSOC_ITEM_LIST
| SyntaxKind::EXTERN_ITEM_LIST
| SyntaxKind::SOURCE_FILE
) => Some(PathKind::Item),
_ => return Some(None),
}
},
ast::Meta(meta) => (|| { ast::Meta(meta) => (|| {
let attr = meta.parent_attr()?; let attr = meta.parent_attr()?;
let kind = attr.kind(); let kind = attr.kind();
@ -989,6 +1011,10 @@ impl<'a> CompletionContext<'a> {
})(), })(),
ast::Visibility(it) => Some(PathKind::Vis { has_in_token: it.in_token().is_some() }), ast::Visibility(it) => Some(PathKind::Vis { has_in_token: it.in_token().is_some() }),
ast::UseTree(_) => Some(PathKind::Use), ast::UseTree(_) => Some(PathKind::Use),
ast::ItemList(_) => Some(PathKind::Item),
ast::AssocItemList(_) => Some(PathKind::Item),
ast::ExternItemList(_) => Some(PathKind::Item),
ast::SourceFile(_) => Some(PathKind::Item),
_ => return None, _ => return None,
} }
}; };

View file

@ -5,7 +5,7 @@ use ide_db::SymbolKind;
use syntax::SmolStr; use syntax::SmolStr;
use crate::{ use crate::{
context::PathKind, context::{PathCompletionCtx, PathKind},
item::{Builder, CompletionItem}, item::{Builder, CompletionItem},
render::RenderContext, render::RenderContext,
}; };
@ -33,8 +33,12 @@ fn render(
let is_fn_like = macro_.is_fn_like(completion.db); let is_fn_like = macro_.is_fn_like(completion.db);
let (bra, ket) = if is_fn_like { guess_macro_braces(&name, docs_str) } else { ("", "") }; let (bra, ket) = if is_fn_like { guess_macro_braces(&name, docs_str) } else { ("", "") };
let needs_bang = let needs_bang = match completion.path_context {
is_fn_like && !matches!(completion.path_kind(), Some(PathKind::Mac | PathKind::Use)); Some(PathCompletionCtx { kind, has_macro_bang, .. }) => {
is_fn_like && kind != Some(PathKind::Use) && !has_macro_bang
}
_ => is_fn_like,
};
let mut item = CompletionItem::new( let mut item = CompletionItem::new(
SymbolKind::from(macro_.kind(completion.db)), SymbolKind::from(macro_.kind(completion.db)),