luau_parser/impl/expression/
table.rs

1//! All `impl` blocks for table access-related types:
2//!
3//! * [`TableAccessPrefix`]
4//! * [`TableAccessKey`]
5//! * [`TableAccessKey`]
6//! * [`TableAccess`]
7
8use luau_lexer::prelude::{Lexer, ParseError, Symbol, Token, TokenType};
9
10use crate::{
11    handle_error_token,
12    types::{
13        ExpressionWrap, FunctionCall, Parse, ParseWithArgs, Pointer, TableAccess, TableAccessKey,
14        TableAccessPrefix, TableKey, TryParse,
15    },
16};
17
18impl Parse for TableAccessPrefix {
19    fn parse(token: Token, lexer: &mut Lexer, errors: &mut Vec<ParseError>) -> Option<Self> {
20        match token.token_type {
21            TokenType::Error(error) => handle_error_token!(errors, error),
22            TokenType::Identifier(_) | TokenType::PartialKeyword(_) => {
23                FunctionCall::parse(token.clone(), lexer, errors).or(Some(Self::Name(token)))
24            }
25            TokenType::Symbol(Symbol::OpeningParenthesis) => ExpressionWrap::parse_with(
26                token,
27                lexer,
28                errors,
29                ("Expected <expr>", Symbol::ClosingParenthesis),
30            )
31            .map(Pointer::new)
32            .map(Self::ExpressionWrap),
33            _ => None,
34        }
35    }
36}
37impl TryParse for TableAccessPrefix {}
38
39impl Parse for TableAccessKey {
40    fn parse(maybe_dot: Token, lexer: &mut Lexer, errors: &mut Vec<ParseError>) -> Option<Self> {
41        Self::parse_with(maybe_dot, lexer, errors, true)
42    }
43}
44impl TryParse for TableAccessKey {}
45
46impl ParseWithArgs<bool> for TableAccessKey {
47    fn parse_with(
48        token: Token,
49        lexer: &mut Lexer,
50        errors: &mut Vec<ParseError>,
51        accept_expression: bool,
52    ) -> Option<Self> {
53        match token.token_type {
54            TokenType::Error(error) => handle_error_token!(errors, error),
55            TokenType::Symbol(Symbol::Dot) => {
56                next_token_recoverable!(
57                    lexer,
58                    name,
59                    TokenType::Identifier(_) | TokenType::PartialKeyword(_),
60                    TokenType::Identifier("*error*".into()),
61                    errors,
62                    "Expected <ident>"
63                );
64
65                Some(Self::Name {
66                    dot: Pointer::new(token),
67                    name: Pointer::new(name),
68                })
69            }
70            _ if accept_expression && token == TokenType::Symbol(Symbol::OpeningBrackets) => {
71                TableKey::parse_with(token, lexer, errors, false)
72                    .map(Pointer::new)
73                    .map(Self::Expression)
74            }
75            _ => None,
76        }
77    }
78}
79
80impl Parse for TableAccess {
81    fn parse(token: Token, lexer: &mut Lexer, errors: &mut Vec<ParseError>) -> Option<Self> {
82        Some(Self {
83            prefix: TableAccessPrefix::parse(token, lexer, errors)?,
84            accessed_keys: Vec::<TableAccessKey>::try_parse(lexer, errors)?,
85        })
86    }
87}
88impl TryParse for TableAccess {
89    fn try_parse(lexer: &mut Lexer, errors: &mut Vec<ParseError>) -> Option<Self> {
90        Some(Self {
91            prefix: TableAccessPrefix::try_parse(lexer, errors)?,
92            accessed_keys: Vec::<TableAccessKey>::try_parse(lexer, errors)?,
93        })
94    }
95}