luaur_ast/methods/
parser_parse_primary_expr.rs1use 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}