variable method
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;
});