luau_parser/impl/expression/
table.rs1use 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}