luaur_analysis/functions/
autocomplete_if_else_expression.rs1use 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}