/// Complete mod declaration, i.e. `mod <|> ;`
pub(super) fn complete_mod(acc: &mut Completions, ctx: &CompletionContext) -> Option<()> {
+ let _p = profile::span("completion::complete_mod");
+
+ if !ctx.mod_is_prev {
+ return None;
+ }
+
let current_module = ctx.scope.module()?;
let module_definition_file =
.collect::<Vec<_>>();
dbg!(mod_declaration_candidates);
- // TODO kb exlude existing children from the candidates
+ // TODO kb actually add the results
Some(())
}
has_bind_pat_parent, has_block_expr_parent, has_field_list_parent,
has_impl_as_prev_sibling, has_impl_parent, has_item_list_or_source_file_parent,
has_ref_parent, has_trait_as_prev_sibling, has_trait_parent, if_is_prev,
- is_in_loop_body, is_match_arm, unsafe_is_prev,
+ is_in_loop_body, is_match_arm, mod_is_prev, unsafe_is_prev,
},
CompletionConfig,
},
pub(super) is_path_type: bool,
pub(super) has_type_args: bool,
pub(super) attribute_under_caret: Option<ast::Attr>,
+ pub(super) mod_is_prev: bool,
pub(super) unsafe_is_prev: bool,
pub(super) if_is_prev: bool,
pub(super) block_expr_parent: bool,
has_type_args: false,
dot_receiver_is_ambiguous_float_literal: false,
attribute_under_caret: None,
+ mod_is_prev: false,
unsafe_is_prev: false,
in_loop_body: false,
ref_pat_parent: false,
self.trait_as_prev_sibling = has_trait_as_prev_sibling(syntax_element.clone());
self.is_match_arm = is_match_arm(syntax_element.clone());
self.has_item_list_or_source_file_parent =
- has_item_list_or_source_file_parent(syntax_element);
+ has_item_list_or_source_file_parent(syntax_element.clone());
+ self.mod_is_prev = mod_is_prev(syntax_element);
}
fn fill(
.filter(|it| it.kind() == IF_KW)
.is_some()
}
+
+// TODO kb generify?
+pub(crate) fn mod_is_prev(element: SyntaxElement) -> bool {
+ element
+ .into_token()
+ .and_then(|it| previous_non_trivia_token(it))
+ .filter(|it| it.kind() == MOD_KW)
+ .is_some()
+}
+
#[test]
fn test_if_is_prev() {
check_pattern_is_applicable(r"if l<|>", if_is_prev);