protospec_build/parser/expression/
array_index.rs1use 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}