multiAssignExpr method

MathExpr multiAssignExpr({
  1. required MathExpr first,
})

Implementation

MathExpr multiAssignExpr({required MathExpr first}) {
  final bool ok = canMultAssignWith(first);
  if (!ok) {
    final linePos = peek().pos;
    throw '$linePos Leading term in mutli-assignment was not a variable.';
  }

  final lhs = [first];
  int i = 2;
  while (peek().type == TokenType.kComma) {
    advance();
    final next = memoryExpr();
    if (canMultAssignWith(next)) {
      lhs.add(next);
    } else {
      final linePos = peek().pos;
      throw '$linePos Term #$i in mutli-assignment was not a variable.';
    }
    i++;
  }

  final assign = peek();
  final linePos = assign.pos;

  if (assign.type != TokenType.kAssign) {
    throw '$linePos Expected "=" in multi-variable assignment expression.';
  }
  advance();

  final List<MathExpr> rhs = [math()];
  while (peek().type == TokenType.kComma) {
    advance();
    rhs.add(math());
  }

  if (lhs.length != rhs.length) {
    final int lhsLen = lhs.length;
    final int rhsLen = rhs.length;
    addWarning(
      '$linePos lhs of assignment has $lhsLen var(s) but rhs has $rhsLen val(s).',
    );
  }
  return AssignMultiExpr.resize(assign, lhs: lhs, rhs: rhs);
}