Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide-completion/src/completions/expr.rs')
| -rw-r--r-- | crates/ide-completion/src/completions/expr.rs | 29 |
1 files changed, 20 insertions, 9 deletions
diff --git a/crates/ide-completion/src/completions/expr.rs b/crates/ide-completion/src/completions/expr.rs index d3c817d4b4..17a52787b8 100644 --- a/crates/ide-completion/src/completions/expr.rs +++ b/crates/ide-completion/src/completions/expr.rs @@ -1,6 +1,6 @@ //! Completion of names from the current scope in expression position. -use hir::ScopeDef; +use hir::{HasVisibility, Module, ScopeDef}; use syntax::ast; use crate::{ @@ -9,6 +9,23 @@ use crate::{ CompletionContext, Completions, }; +fn scope_def_applicable( + def: ScopeDef, + ctx: &CompletionContext<'_>, + module: Option<&Module>, +) -> bool { + match (def, module) { + (ScopeDef::GenericParam(hir::GenericParam::LifetimeParam(_)) | ScopeDef::Label(_), _) => { + false + } + (ScopeDef::ModuleDef(hir::ModuleDef::Macro(mac)), _) => mac.is_fn_like(ctx.db), + (ScopeDef::ModuleDef(hir::ModuleDef::Function(f)), Some(m)) => { + f.is_visible_from(ctx.db, *m) + } + _ => true, + } +} + pub(crate) fn complete_expr_path( acc: &mut Completions, ctx: &CompletionContext<'_>, @@ -37,12 +54,6 @@ pub(crate) fn complete_expr_path( let wants_mut_token = ref_expr_parent.as_ref().map(|it| it.mut_token().is_none()).unwrap_or(false); - let scope_def_applicable = |def| match def { - ScopeDef::GenericParam(hir::GenericParam::LifetimeParam(_)) | ScopeDef::Label(_) => false, - ScopeDef::ModuleDef(hir::ModuleDef::Macro(mac)) => mac.is_fn_like(ctx.db), - _ => true, - }; - let add_assoc_item = |acc: &mut Completions, item| match item { hir::AssocItem::Function(func) => acc.add_function(ctx, path_ctx, func, None), hir::AssocItem::Const(ct) => acc.add_const(ctx, ct), @@ -87,7 +98,7 @@ pub(crate) fn complete_expr_path( hir::PathResolution::Def(hir::ModuleDef::Module(module)) => { let module_scope = module.scope(ctx.db, Some(ctx.module)); for (name, def) in module_scope { - if scope_def_applicable(def) { + if scope_def_applicable(def, ctx, Some(module)) { acc.add_path_resolution( ctx, path_ctx, @@ -233,7 +244,7 @@ pub(crate) fn complete_expr_path( [..] => acc.add_path_resolution(ctx, path_ctx, name, def, doc_aliases), } } - _ if scope_def_applicable(def) => { + _ if scope_def_applicable(def, ctx, None) => { acc.add_path_resolution(ctx, path_ctx, name, def, doc_aliases) } _ => (), |