argumentRange method
Return a source range that covers all of the arguments in the
argumentList between the lower and upper indices, inclusive. The
flag forDeletion controls whether a comma between the given indices and
the neighboring arguments should be included in the range. If the flag is
true, then the range can be deleted to delete the covered arguments and
leave a valid argument list. If the flag is false, then the range can be
replaced with different argument values.
For example, given an argument list of (a, b, c, d), a lower index of
1 and an upper index of 2, the range will cover the text 'b, c' if
forDeletion is false and the text ', b, c' if forDeletion is
true.
Throws and exception if either the lower or upper bound is not a valid
index into the argumentList or if the upper bound is less than the
lower bound.
Implementation
SourceRange argumentRange(
ArgumentList argumentList,
int lower,
int upper,
bool forDeletion,
) {
var arguments = argumentList.arguments;
assert(lower >= 0 && lower < arguments.length);
assert(upper >= lower && upper < arguments.length);
if (lower == upper) {
// Remove a single argument.
if (forDeletion) {
return nodeInList(arguments, arguments[lower]);
}
return node(arguments[lower]);
} else if (!forDeletion) {
return startEnd(arguments[lower], arguments[upper]);
} else if (lower == 0) {
if (upper == arguments.length - 1) {
// Remove all of the arguments.
return endStart(
argumentList.leftParenthesis,
argumentList.rightParenthesis,
);
} else {
// Remove a subset of the arguments starting with the first argument.
return startStart(arguments[lower], arguments[upper + 1]);
}
} else {
// Remove a subset of the arguments starting in the middle of the
// arguments.
return endEnd(arguments[lower - 1], arguments[upper]);
}
}