protospec_build/parser/expression/
array_index.rs

1use super::*;
2
3pub fn parse_array_index_expression(t: &mut TokenIter) -> ParseResult<Expression> {
4    let mut expr = parse_primary_expression(t)?;
5    while let Some(SpannedToken { token: op, .. }) = t.eat_any(&[Token::LeftSquare, Token::Dot]) {
6        match op {
7            Token::LeftSquare => {
8                let right = parse_expression(t)?;
9                let end = t.expect(Token::RightSquare)?;
10                expr = Expression::ArrayIndex(ArrayIndexExpression {
11                    span: *expr.span() + end,
12                    array: Box::new(expr),
13                    index: Box::new(right),
14                });
15            }
16            Token::Dot => {
17                let member = t.expect_ident()?;
18                expr = Expression::Member(MemberExpression {
19                    span: *expr.span() + member.span,
20                    target: Box::new(expr),
21                    member,
22                })
23            }
24            _ => unimplemented!(),
25        }
26    }
27
28    while t.eat(Token::LeftSquare).is_some() {
29    }
30    Ok(expr)
31}