in lib/src/call_chain_visitor.dart [176:256]
void visit() {
_visitor.builder.nestExpression();
// Try to keep the entire method invocation one line.
_visitor.builder.startSpan();
// If a split in the target expression forces the first `.` to split, then
// start the rule now so that it surrounds the target.
var splitOnTarget = _forcesSplit(_target);
if (splitOnTarget) {
if (_properties.length > 1) {
_propertyRule = PositionalRule(null, 0, 0);
_visitor.builder.startLazyRule(_propertyRule);
} else {
_enableRule(lazy: true);
}
}
_visitor.visit(_target);
// Leading properties split like positional arguments: either not at all,
// before one ".", or before all of them.
if (_properties.length == 1) {
_visitor.soloZeroSplit();
_properties.single.write(this);
} else if (_properties.length > 1) {
if (!splitOnTarget) {
_propertyRule = PositionalRule(null, 0, 0);
_visitor.builder.startRule(_propertyRule);
}
for (var property in _properties) {
_propertyRule!.beforeArgument(_visitor.zeroSplit());
property.write(this);
}
_visitor.builder.endRule();
}
// Indent any block arguments in the chain that don't get special formatting
// below. Only do this if there is more than one argument to avoid spurious
// indentation in cases like:
//
// object.method(wrapper(() {
// body;
// });
// TODO(rnystrom): Come up with a less arbitrary way to express this?
if (_calls.length > 1) _visitor.builder.startBlockArgumentNesting();
// The chain of calls splits atomically (either all or none). Any block
// arguments inside them get indented to line up with the `.`.
for (var call in _calls) {
_enableRule();
_visitor.zeroSplit();
call.write(this);
}
if (_calls.length > 1) _visitor.builder.endBlockArgumentNesting();
// If there are block calls, end the chain and write those without any
// extra indentation.
var blockCalls = _blockCalls;
if (blockCalls != null) {
_enableRule();
_visitor.zeroSplit();
_disableRule();
for (var blockCall in blockCalls) {
blockCall.write(this);
}
// If there is a hanging call after the last block, write it without any
// split before the ".".
_hangingCall?.write(this);
}
_disableRule();
_endSpan();
_visitor.builder.unnest();
}