From f67e6a850ec4c2cbfd183e45802ea4c2805af911 Mon Sep 17 00:00:00 2001 From: Steffen Lyngbaek Date: Mon, 9 Mar 2020 13:01:40 -0700 Subject: Switch to explicit offsets for impl_def Blacklists are prone to more errors --- .../ra_ide/src/completion/complete_trait_impl.rs | 37 +++++++--------------- 1 file changed, 11 insertions(+), 26 deletions(-) (limited to 'crates/ra_ide/src/completion') diff --git a/crates/ra_ide/src/completion/complete_trait_impl.rs b/crates/ra_ide/src/completion/complete_trait_impl.rs index ba7d43f1e..2bf654a57 100644 --- a/crates/ra_ide/src/completion/complete_trait_impl.rs +++ b/crates/ra_ide/src/completion/complete_trait_impl.rs @@ -102,32 +102,17 @@ pub(crate) fn complete_trait_impl(acc: &mut Completions, ctx: &CompletionContext } fn completion_match(ctx: &CompletionContext) -> Option<(SyntaxNode, ImplDef)> { - let (trigger_idx, trigger) = - ctx.token.ancestors().enumerate().find(|(_idx, p)| match p.kind() { - SyntaxKind::FN_DEF - | SyntaxKind::TYPE_ALIAS_DEF - | SyntaxKind::CONST_DEF - | SyntaxKind::NAME_REF - | SyntaxKind::BLOCK_EXPR => true, - _ => false, - })?; - let (impl_def_idx, impl_def) = - ctx.token.ancestors().enumerate().skip(trigger_idx + 1).find_map(|(idx, p)| { - match p.kind() { - SyntaxKind::IMPL_DEF => ast::ImplDef::cast(p).map(|p| (idx, p)), - _ => None, - } - })?; - let _is_nested = ctx - .token - .ancestors() - .skip(trigger_idx + 1) - .take(impl_def_idx - trigger_idx - 1) - .find_map(|p| match p.kind() { - SyntaxKind::FN_DEF | SyntaxKind::BLOCK => Some(()), - _ => None, - }) - .xor(Some(()))?; + let (trigger, impl_def_offset) = ctx.token.ancestors().find_map(|p| match p.kind() { + SyntaxKind::FN_DEF + | SyntaxKind::TYPE_ALIAS_DEF + | SyntaxKind::CONST_DEF + | SyntaxKind::BLOCK_EXPR => Some((p, 2)), + SyntaxKind::NAME_REF => Some((p, 5)), + _ => None, + })?; + let impl_def = (0..impl_def_offset - 1) + .try_fold(trigger.parent()?, |t, _| t.parent()) + .and_then(ast::ImplDef::cast)?; Some((trigger, impl_def)) } -- cgit v1.2.3