declMultiVarStmt method

Stmt declMultiVarStmt({
  1. required bool local,
})

Implementation

Stmt declMultiVarStmt({required bool local}) {
  final token = consume(
    TokenType.kRaw,
    'Expected variable name.',
  );

  attr() {
    // Build an attribute from these tokens.
    Token? a;
    if(peek().type == TokenType.kLT) {
      advance();
      a = consume(TokenType.kRaw, 'Expected attribute name.');
      consume(TokenType.kGT, 'Expected closing ">" after attribute.');
    }
    return a;
  }

  final vars = [token];
  final attrs = local ? [attr()] : const <Token>[];

  while (peek().type == TokenType.kComma) {
    advance();
    vars.add(
      consume(
        TokenType.kRaw,
        'Expected variable name in multi-variable initializer.',
      ),
    );
    if(local) {
      attrs.add(attr());
    }
  }

  final assign = peek();
  if (assign.type != TokenType.kAssign) {
    return DeclMultiVar.initNils(vars, attrs, local);
  }

  consume(
    TokenType.kAssign,
    'Expected assignment operator for multi-variable initilaizer.',
  );

  final List<MathExpr> vals = [math()];

  while (peek().type == TokenType.kComma) {
    advance();
    vals.add(math());
  }

  return DeclMultiVar.initVals(vars, attrs, vals, local);
}