(&mut self, _can_assign: bool)
| 1446 | } |
| 1447 | |
| 1448 | fn object(&mut self, _can_assign: bool) -> Option<Expr<'gc>> { |
| 1449 | if self.stop_at_brace { |
| 1450 | self.error("Cannot use object literals in flow control conditions"); |
| 1451 | return None; |
| 1452 | } |
| 1453 | |
| 1454 | let line = self.previous.line; |
| 1455 | let previous_expr = self.previous_expr.take(); |
| 1456 | let mut properties = Vec::new(); |
| 1457 | |
| 1458 | if !self.check(TokenType::CloseBrace) { |
| 1459 | loop { |
| 1460 | let property = if self.match_token(TokenType::OpenBracket) { |
| 1461 | // Computed property name: [expr] |
| 1462 | let key_expr = Box::new(self.expression()?); |
| 1463 | self.consume( |
| 1464 | TokenType::CloseBracket, |
| 1465 | "Expect ']' after computed property name.", |
| 1466 | ); |
| 1467 | self.consume(TokenType::Colon, "Expect ':' after computed property name."); |
| 1468 | let value = Box::new(self.expression()?); |
| 1469 | |
| 1470 | ObjectProperty::Computed { key_expr, value } |
| 1471 | } else if self.check(TokenType::String) { |
| 1472 | // String literal key |
| 1473 | self.advance(); |
| 1474 | let key = Token::new( |
| 1475 | TokenType::Identifier, |
| 1476 | self.previous.lexeme, |
| 1477 | self.previous.line, |
| 1478 | ); |
| 1479 | self.consume(TokenType::Colon, "Expect ':' after property name."); |
| 1480 | let value = Box::new(self.expression()?); |
| 1481 | |
| 1482 | ObjectProperty::Literal { key, value } |
| 1483 | } else if self.check(TokenType::Identifier) { |
| 1484 | // Could be either shorthand {a} or regular {a: expr} |
| 1485 | self.advance(); |
| 1486 | let key = self.previous; |
| 1487 | |
| 1488 | if self.match_token(TokenType::Colon) { |
| 1489 | // Regular property |
| 1490 | let value = Box::new(self.expression()?); |
| 1491 | ObjectProperty::Literal { key, value } |
| 1492 | } else { |
| 1493 | // Shorthand property {a} -> {a: a} |
| 1494 | let value = Box::new(Expr::Variable { |
| 1495 | name: key, |
| 1496 | line: key.line, |
| 1497 | }); |
| 1498 | ObjectProperty::Literal { key, value } |
| 1499 | } |
| 1500 | } else { |
| 1501 | self.error_at_current( |
| 1502 | "Expect property name string, identifier, or computed [expression].", |
| 1503 | ); |
| 1504 | return None; |
| 1505 | }; |
nothing calls this directly
no test coverage detected