in lib/src/source_visitor.dart [3265:3323]
void _visitTrailingCommaParameterList(FormalParameterList parameters) {
// Can't have a trailing comma if there are no parameters.
assert(parameters.parameters.isNotEmpty);
_metadataRules.add(MetadataRule());
// Always split the parameters.
builder.startRule(Rule.hard());
token(parameters.leftParenthesis);
// Find the parameter immediately preceding the optional parameters (if
// there are any).
FormalParameter? lastRequired;
for (var i = 0; i < parameters.parameters.length; i++) {
if (parameters.parameters[i] is DefaultFormalParameter) {
if (i > 0) lastRequired = parameters.parameters[i - 1];
break;
}
}
// If all parameters are optional, put the "[" or "{" right after "(".
if (parameters.parameters.first is DefaultFormalParameter) {
token(parameters.leftDelimiter);
}
// Process the parameters as a separate set of chunks.
builder = builder.startBlock(null);
for (var parameter in parameters.parameters) {
visit(parameter);
_writeCommaAfter(parameter);
// If the optional parameters start after this one, put the delimiter
// at the end of its line.
if (parameter == lastRequired) {
space();
token(parameters.leftDelimiter);
lastRequired = null;
}
newline();
}
// Put comments before the closing ")", "]", or "}" inside the block.
var firstDelimiter =
parameters.rightDelimiter ?? parameters.rightParenthesis;
writePrecedingCommentsAndNewlines(firstDelimiter);
builder = builder.endBlock(null, forceSplit: true);
builder.endRule();
_metadataRules.removeLast();
// Now write the delimiter itself.
_writeText(firstDelimiter.lexeme, firstDelimiter.offset);
if (firstDelimiter != parameters.rightParenthesis) {
token(parameters.rightParenthesis);
}
}