variable property

Parser<Expression?> get variable

Implementation

Parser<Expression?> get variable => groupOrIdentifier
    .seq((memberArgument.cast() | indexArgument | callArgument).star())
    .map((l) {
  var a = l[0] as Expression?;
  var b = l[1] as List;
  return b.fold(a, (Expression? object, argument) {
    if (argument is Identifier) {
      return MemberExpression(object, argument);
    }
    if (argument is Expression) {
      return IndexExpression(object, argument);
    }
    if (argument is List<Expression>) {
      return CallExpression(object, argument);
    }
    throw ArgumentError('Invalid type ${argument.runtimeType}');
  });
});