Complete unqualified enum variants when possible
This commit is contained in:
parent
6c61a7b22f
commit
8664509745
@ -4,20 +4,23 @@ use hir::ScopeDef;
|
|||||||
use test_utils::tested_by;
|
use test_utils::tested_by;
|
||||||
|
|
||||||
use crate::completion::{CompletionContext, Completions};
|
use crate::completion::{CompletionContext, Completions};
|
||||||
|
use hir::{Adt, ModuleDef};
|
||||||
use ra_syntax::AstNode;
|
use ra_syntax::AstNode;
|
||||||
|
|
||||||
pub(super) fn complete_unqualified_path(acc: &mut Completions, ctx: &CompletionContext) {
|
pub(super) fn complete_unqualified_path(acc: &mut Completions, ctx: &CompletionContext) {
|
||||||
if !ctx.is_trivial_path {
|
if (!ctx.is_trivial_path && !ctx.is_pat_binding_or_const)
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ctx.is_pat_binding_or_const
|
|
||||||
|| ctx.record_lit_syntax.is_some()
|
|| ctx.record_lit_syntax.is_some()
|
||||||
|| ctx.record_pat_syntax.is_some()
|
|| ctx.record_pat_syntax.is_some()
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
complete_enum_variants(acc, ctx);
|
||||||
|
|
||||||
|
if ctx.is_pat_binding_or_const {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
ctx.scope().process_all_names(&mut |name, res| {
|
ctx.scope().process_all_names(&mut |name, res| {
|
||||||
if ctx.use_item_syntax.is_some() {
|
if ctx.use_item_syntax.is_some() {
|
||||||
if let (ScopeDef::Unknown, Some(name_ref)) = (&res, &ctx.name_ref_syntax) {
|
if let (ScopeDef::Unknown, Some(name_ref)) = (&res, &ctx.name_ref_syntax) {
|
||||||
@ -31,6 +34,24 @@ pub(super) fn complete_unqualified_path(acc: &mut Completions, ctx: &CompletionC
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn complete_enum_variants(acc: &mut Completions, ctx: &CompletionContext) {
|
||||||
|
if let Some(ty) = ctx.expected_type_of(&ctx.token.parent()) {
|
||||||
|
if let Some(Adt::Enum(enum_data)) = ty.as_adt() {
|
||||||
|
let variants = enum_data.variants(ctx.db);
|
||||||
|
let module = enum_data.module(ctx.db);
|
||||||
|
for variant in variants {
|
||||||
|
if let Some(path) = module.find_use_path(ctx.db, ModuleDef::from(variant)) {
|
||||||
|
// Variants with trivial paths are already added by the existing completion logic,
|
||||||
|
// so we should avoid adding these twice
|
||||||
|
if path.segments.len() > 1 {
|
||||||
|
acc.add_enum_variant(ctx, variant, Some(path.to_string()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use insta::assert_debug_snapshot;
|
use insta::assert_debug_snapshot;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user