Skip to main content

luaur_ast/methods/
parser_parse_primary_expr.rs

1use crate::records::ast_expr::AstExpr;
2use crate::records::ast_expr_index_name::AstExprIndexName;
3use crate::records::lexeme::Lexeme;
4use crate::records::lexeme::Type;
5use crate::records::location::Location;
6use crate::records::parser::Parser;
7use crate::records::position::Position;
8
9impl Parser {
10    pub fn parse_primary_expr(&mut self, as_statement: bool) -> *mut AstExpr {
11        let start = self.lexer.current().location.begin;
12
13        let mut expr = self.parse_prefix_expr();
14
15        let old_recursion_count = self.recursion_counter;
16
17        loop {
18            let current = self.lexer.current();
19            if current.r#type == Type('.' as i32) {
20                let op_position = current.location.begin;
21                self.next_lexeme();
22
23                let index = self.parse_index_name("index", &op_position);
24
25                expr = unsafe {
26                    (*self.allocator).alloc(AstExprIndexName::new(
27                        Location::new(start, index.location.end),
28                        expr,
29                        index.name,
30                        index.location,
31                        op_position,
32                        '.' as core::ffi::c_char,
33                    )) as *mut AstExpr
34                };
35            } else if current.r#type == Type('[' as i32) {
36                expr = self.parse_index_expr(start, expr);
37            } else if current.r#type == Type(':' as i32) {
38                expr = self.parse_method_call(start, expr);
39            } else if current.r#type == Type('(' as i32) {
40                if !as_statement
41                    && unsafe {
42                        (*expr).base.location.end.line != self.lexer.current().location.begin.line
43                    }
44                {
45                    self.report_ambiguous_call_error();
46                    break;
47                }
48
49                expr = self.parse_function_args(expr, false);
50            } else if current.r#type == Type('{' as i32)
51                || current.r#type == Type::RawString
52                || current.r#type == Type::QuotedString
53            {
54                expr = self.parse_function_args(expr, false);
55            } else if current.r#type == Type('<' as i32)
56                && self.lexer.lookahead().r#type == Type('<' as i32)
57            {
58                expr = self.parse_explicit_type_instantiation_expr(start, unsafe { &mut *expr });
59            } else {
60                break;
61            }
62
63            self.increment_recursion_counter("expression");
64        }
65
66        self.recursion_counter = old_recursion_count;
67
68        expr
69    }
70}