MCPcopy Index your code
hub / github.com/aiscriptdev/aiscript / object

Method object

aiscript-vm/src/parser/mod.rs:1448–1600  ·  view source on GitHub ↗
(&mut self, _can_assign: bool)

Source from the content-addressed store, hash-verified

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 };

Callers

nothing calls this directly

Calls 11

checkMethod · 0.80
match_tokenMethod · 0.80
expressionMethod · 0.80
advanceMethod · 0.80
error_at_currentMethod · 0.80
pushMethod · 0.80
parse_error_handlingMethod · 0.80
errorMethod · 0.45
consumeMethod · 0.45
error_atMethod · 0.45

Tested by

no test coverage detected