variable method

Parser<Expression> variable()

Implementation

Parser<Expression> variable() =>
    groupOrIdentifier()
        .seq((memberAccess().or(indexArgument()).or(callArgument())).star())
        .mapWithPosition((list, start, end) {
      Expression obj = list[0];
      final args = list[1] as List;

      for (var arg in args) {
        if (arg is Identifier) {
          // For member access, if it's an empty identifier (dangling dot),
          // extend its end to the current parsing position
          if (arg.name.isEmpty) {
            arg.end = end;
          }
          obj = MemberExpression(obj, arg)
            ..start = obj.start
            ..end = arg.end;
        } else if (arg is Expression) {
          obj = IndexExpression(obj, arg)
            ..start = obj.start
            ..end = arg.end;
        } else if (arg is List<Expression>) {
          obj = CallExpression(obj, arg)
            ..start = obj.start
            ..end = arg.isNotEmpty ? arg.last.end : obj.end;
        }
      }

      // Set the final bounds to the full parsed span
      obj.start = start;
      obj.end = end;

      return obj;
    });