Skip to main content

luaur_analysis/functions/
autocomplete_if_else_expression.rs

1use luaur_ast::records::ast_expr_if_else::AstExprIfElse;
2use luaur_ast::records::ast_node::AstNode;
3use luaur_ast::records::position::Position;
4
5use crate::enums::autocomplete_entry_kind::AutocompleteEntryKind;
6use crate::type_aliases::autocomplete_entry_map::AutocompleteEntryMap;
7
8pub fn autocomplete_if_else_expression(
9    node: *const AstNode,
10    ancestry: &mut std::vec::Vec<*mut AstNode>,
11    position: Position,
12    out_result: &mut AutocompleteEntryMap,
13) -> bool {
14    let parent = if ancestry.len() >= 2 {
15        unsafe { *ancestry.get(ancestry.len() - 2).unwrap() }
16    } else {
17        std::ptr::null_mut()
18    };
19
20    if parent.is_null() {
21        return false;
22    }
23
24    if unsafe { (*node).is::<AstExprIfElse>() } {
25        return true;
26    }
27
28    let if_else_expr = unsafe { (*parent).as_item::<AstExprIfElse>() };
29    if if_else_expr.is_null() {
30        return false;
31    }
32
33    let condition_location = unsafe { (*if_else_expr).condition.as_ref().unwrap().base.location };
34    if condition_location.containsClosed(position) {
35        return false;
36    }
37
38    if !unsafe { (*if_else_expr).has_then } {
39        out_result.insert(
40            "then".to_string(),
41            autocomplete_entry_kind_to_autocomplete_entry(AutocompleteEntryKind::Keyword),
42        );
43        return true;
44    }
45
46    let true_expr = unsafe { (*if_else_expr).true_expr };
47    let true_expr_location = unsafe { (*true_expr).base.location };
48    if true_expr_location.containsClosed(position) {
49        return false;
50    }
51
52    if !unsafe { (*if_else_expr).has_else } {
53        out_result.insert(
54            "else".to_string(),
55            autocomplete_entry_kind_to_autocomplete_entry(AutocompleteEntryKind::Keyword),
56        );
57        out_result.insert(
58            "elseif".to_string(),
59            autocomplete_entry_kind_to_autocomplete_entry(AutocompleteEntryKind::Keyword),
60        );
61        return true;
62    }
63
64    false
65}
66
67fn autocomplete_entry_kind_to_autocomplete_entry(
68    kind: AutocompleteEntryKind,
69) -> crate::records::autocomplete_entry::AutocompleteEntry {
70    crate::records::autocomplete_entry::AutocompleteEntry {
71        kind,
72        ..Default::default()
73    }
74}