Skip to main content

luaur_ast/methods/
printer_visualize_else_if_expr.rs

1use crate::records::ast_expr_if_else::AstExprIfElse;
2use crate::records::cst_expr_if_else::CstExprIfElse;
3use crate::records::printer::Printer;
4
5impl<'a> Printer<'a> {
6    pub fn visualize_else_if_expr(&mut self, elseif: &mut AstExprIfElse) {
7        let cst_node = self.lookup_cst_node::<CstExprIfElse>(
8            elseif as *mut AstExprIfElse as *mut crate::records::ast_node::AstNode,
9        );
10
11        self.visualize_ast_expr(unsafe { &mut *elseif.condition });
12
13        if !cst_node.is_null() {
14            unsafe {
15                self.maybe_advance_and_write(&(*cst_node).then_position, "then", false);
16            }
17        } else {
18            self.writer.keyword("then");
19        }
20
21        self.visualize_ast_expr(unsafe { &mut *elseif.true_expr });
22
23        if elseif.has_else {
24            if !cst_node.is_null() {
25                unsafe { self.advance(&(*cst_node).else_position) };
26            }
27
28            let else_expr = unsafe { elseif.false_expr as *mut AstExprIfElse };
29            if !else_expr.is_null() {
30                let elseifelseif = unsafe {
31                    crate::rtti::ast_node_as::<AstExprIfElse>(
32                        else_expr as *mut crate::records::ast_node::AstNode,
33                    )
34                };
35                if !elseifelseif.is_null()
36                    && (cst_node.is_null() || unsafe { (*cst_node).is_else_if })
37                {
38                    self.writer.keyword("elseif");
39                    self.visualize_else_if_expr(unsafe { &mut *elseifelseif });
40                    return;
41                }
42            }
43
44            self.writer.keyword("else");
45            self.visualize_ast_expr(unsafe { &mut *elseif.false_expr });
46        }
47    }
48}