luau_parser/impl/expression/
var.rs

1//! All `impl` blocks for [`Var`].
2
3use luau_lexer::prelude::{Lexer, ParseError, Symbol, Token, TokenType};
4
5use crate::types::{
6    Expression, Parse, PrefixExp, TableAccess, TableAccessKey, TableAccessPrefix, TryParse, Var,
7};
8
9impl Parse for Var {
10    fn parse(token: Token, lexer: &mut Lexer, errors: &mut Vec<ParseError>) -> Option<Self> {
11        if !matches!(
12            token.token_type,
13            TokenType::PartialKeyword(_) | TokenType::Identifier(_)
14        ) {
15            return None;
16        }
17
18        maybe_next_token!(
19            lexer,
20            maybe_dot_or_bracket,
21            TokenType::Symbol(Symbol::Dot) | TokenType::Symbol(Symbol::OpeningBrackets)
22        );
23        if let Some(dot_or_bracket) = maybe_dot_or_bracket {
24            return Some(Self::TableAccess(TableAccess {
25                prefix: TableAccessPrefix::Name(token),
26                accessed_keys: Vec::<TableAccessKey>::parse(dot_or_bracket, lexer, errors)?,
27            }));
28        }
29
30        Some(Self::Name(token))
31    }
32}
33impl TryParse for Var {}
34
35impl Parse<PrefixExp> for Var {
36    #[inline]
37    fn parse(token: Token, lexer: &mut Lexer, errors: &mut Vec<ParseError>) -> Option<PrefixExp> {
38        Self::parse(token, lexer, errors).map(PrefixExp::Var)
39    }
40}
41impl TryParse<PrefixExp> for Var {}
42
43impl Parse<Expression> for Var {
44    #[inline]
45    fn parse(token: Token, lexer: &mut Lexer, errors: &mut Vec<ParseError>) -> Option<Expression> {
46        Self::parse(token, lexer, errors).map(Expression::Var)
47    }
48}
49impl TryParse<Expression> for Var {}