diff options
Diffstat (limited to 'src/tools/rust-analyzer/crates/ide-completion/src/completions/vis.rs')
-rw-r--r-- | src/tools/rust-analyzer/crates/ide-completion/src/completions/vis.rs | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/src/tools/rust-analyzer/crates/ide-completion/src/completions/vis.rs b/src/tools/rust-analyzer/crates/ide-completion/src/completions/vis.rs new file mode 100644 index 000000000..5e6cf4bf9 --- /dev/null +++ b/src/tools/rust-analyzer/crates/ide-completion/src/completions/vis.rs @@ -0,0 +1,41 @@ +//! Completion for visibility specifiers. + +use crate::{ + context::{CompletionContext, PathCompletionCtx, Qualified}, + Completions, +}; + +pub(crate) fn complete_vis_path( + acc: &mut Completions, + ctx: &CompletionContext<'_>, + path_ctx @ PathCompletionCtx { qualified, .. }: &PathCompletionCtx, + &has_in_token: &bool, +) { + match qualified { + Qualified::With { + resolution: Some(hir::PathResolution::Def(hir::ModuleDef::Module(module))), + super_chain_len, + .. + } => { + // Try completing next child module of the path that is still a parent of the current module + let next_towards_current = + ctx.module.path_to_root(ctx.db).into_iter().take_while(|it| it != module).last(); + if let Some(next) = next_towards_current { + if let Some(name) = next.name(ctx.db) { + cov_mark::hit!(visibility_qualified); + acc.add_module(ctx, path_ctx, next, name); + } + } + + acc.add_super_keyword(ctx, *super_chain_len); + } + Qualified::Absolute | Qualified::TypeAnchor { .. } | Qualified::With { .. } => {} + Qualified::No => { + if !has_in_token { + cov_mark::hit!(kw_completion_in); + acc.add_keyword(ctx, "in"); + } + acc.add_nameref_keywords(ctx); + } + } +} |