in lib/src/call_chain_visitor.dart [274:326]
bool _forcesSplit(Expression expression) {
// TODO(rnystrom): Other cases we may want to consider handling and
// recursing into:
// * The right operand in an infix operator call.
// * The body of a `=>` function.
// Unwrap parentheses.
while (expression is ParenthesizedExpression) {
expression = expression.expression;
}
// Don't split right after a collection literal.
if (expression is ListLiteral) return false;
if (expression is SetOrMapLiteral) return false;
// Don't split right after a non-empty curly-bodied function.
if (expression is FunctionExpression) {
if (expression.body is! BlockFunctionBody) return false;
return (expression.body as BlockFunctionBody).block.statements.isEmpty;
}
// If the expression ends in an argument list, base the splitting on the
// last argument.
ArgumentList? argumentList;
if (expression is MethodInvocation) {
argumentList = expression.argumentList;
} else if (expression is InstanceCreationExpression) {
argumentList = expression.argumentList;
} else if (expression is FunctionExpressionInvocation) {
argumentList = expression.argumentList;
}
// Any other kind of expression always splits.
if (argumentList == null) return true;
if (argumentList.arguments.isEmpty) return true;
var argument = argumentList.arguments.last;
// If the argument list has a trailing comma, treat it like a collection.
if (_visitor.hasCommaAfter(argument)) return false;
if (argument is NamedExpression) {
argument = argument.expression;
}
// TODO(rnystrom): This logic is similar (but not identical) to
// ArgumentListVisitor.hasBlockArguments. They overlap conceptually and
// both have their own peculiar heuristics. It would be good to unify and
// rationalize them.
return _forcesSplit(argument);
}