40 columns                              |
>>> split all chained calls if they don't fit on one line
compiler.something().something().something();
<<<
compiler
    .something()
    .something()
    .something();
>>> do not split chained calls if not needed
compiler.something().something().some();
<<<
compiler.something().something().some();
>>> don't split before implicit receiver
return
     call({'type': type, 'id': id})
    .then(deserializeAsset);
<<<
return call({'type': type, 'id': id})
    .then(deserializeAsset);
>>> trailing functions in a chain do not force it to split
compiler
    .run(script)
    .then((_) {
  body;
});
<<<
compiler.run(script).then((_) {
  body;
});
>>> a function in the middle of a chain is indented
compiler.a().b((_) {body;}).c().d();
<<<
compiler
    .a()
    .b((_) {
      body;
    })
    .c()
    .d();
>>> a function in the middle of a chain is indented
compiler.a().b((_) {body;}).somethingLong().somethingLong().somethingLong();
<<<
compiler
    .a()
    .b((_) {
      body;
    })
    .somethingLong()
    .somethingLong()
    .somethingLong();
>>> a function in the middle of a chain is indented
compiler.somethingLong().somethingLong().somethingLong((_) {
  body;
}).a().b();
<<<
compiler
    .somethingLong()
    .somethingLong()
    .somethingLong((_) {
      body;
    })
    .a()
    .b();
>>> one trailing call does not force function to indent
compiler.somethingLong().somethingLong().somethingLong((_) {
  body;
}).a();
<<<
compiler
    .somethingLong()
    .somethingLong()
    .somethingLong((_) {
  body;
}).a();
>>> nest calls one more than target
someVeryLongExpression = someVeryLongExpression.someLongMethod();
<<<
someVeryLongExpression =
    someVeryLongExpression
        .someLongMethod();
>>> split properties after a method chain
compiler.method().method().method().property.property;
<<<
compiler
    .method()
    .method()
    .method()
    .property
    .property;
>>> split properties in a method chain
compiler.method().property.method().property.method();
<<<
compiler
    .method()
    .property
    .method()
    .property
    .method();
>>> do not split leading properties in a chain
compiler.property.property.method().method().method();
<<<
compiler.property.property
    .method()
    .method()
    .method();
>>> do not split leading properties even if others splits
compiler.property.method().property.method();
<<<
compiler.property
    .method()
    .property
    .method();
>>> split between a pair of properties
avian.bovine.canine.equine.feline.piscine.orycteropodian.camelid;
<<<
avian.bovine.canine.equine.feline
    .piscine.orycteropodian.camelid;
>>> split before all properties if they don't fit on two lines
avian.bovine.canine.equine.feline.piscine.orycteropodian.camelid
.rangiferine;
<<<
avian
    .bovine
    .canine
    .equine
    .feline
    .piscine
    .orycteropodian
    .camelid
    .rangiferine;
>>> unsplit cascade unsplit method
object.method().method()..c()..c();
<<<
object.method().method()
  ..c()
  ..c();
>>> split cascade unsplit method
object.method().method()..cascade()..cascade();
<<<
object.method().method()
  ..cascade()
  ..cascade();
>>> split cascade split method
object.method().method().method().method()..cascade()..cascade()..cascade();
<<<
object
    .method()
    .method()
    .method()
    .method()
  ..cascade()
  ..cascade()
  ..cascade();
>>> cascade setters on method chain
object.method().method().method().method()..x=1..y=2;
<<<
object
    .method()
    .method()
    .method()
    .method()
  ..x = 1
  ..y = 2;
>>> cascade index
object..[index]..method()..[index]=value;
<<<
object
  ..[index]
  ..method()
  ..[index] = value;
>>> null-aware cascade index
object?..[index]..method()..[index]=value;
<<<
object
  ?..[index]
  ..method()
  ..[index] = value;
>>> conditional invocation
object?.method().method()?.method().method();
<<<
object
    ?.method()
    .method()
    ?.method()
    .method();
>>> index in property chain
someReceiverObject.property1.property2
        .property3[0]
    .property4
    .property5
    .property6;
<<<
someReceiverObject
    .property1
    .property2
    .property3[0]
    .property4
    .property5
    .property6;
>>> chained indexes
someReceiverObject.property1.property2
            .property3[argument]
        [argument][argument]
    .property4
    .property5
    .property6;
<<<
someReceiverObject
    .property1
    .property2
    .property3[argument][argument]
        [argument]
    .property4
    .property5
    .property6;
>>> index on method call
someReceiverObject.property1.property2
        .method3()[0]
    .property4
    .property5
    .property6;
<<<
someReceiverObject.property1.property2
    .method3()[0]
    .property4
    .property5
    .property6;
>>> index on block calls
receiver.method(() {;})[0].block(() {;})[1];
<<<
receiver.method(() {
  ;
})[0].block(() {
  ;
})[1];
>>> target splits more deeply than method chain
someTargetFunction(argument, argument, argument).method().method();
<<<
someTargetFunction(
        argument, argument, argument)
    .method()
    .method();
>>> splitting the target forces methods to split
someVeryLongTargetFunction(argument, argument).one().two();
<<<
someVeryLongTargetFunction(
        argument, argument)
    .one()
    .two();
>>> target splits more deeply than property chain
someTargetFunction(argument, argument, argument).property.property;
<<<
someTargetFunction(
        argument, argument, argument)
    .property
    .property;
>>> splitting the target forces methods to split
someVeryLongTargetFunction(argument, argument).one.two;
<<<
someVeryLongTargetFunction(
        argument, argument)
    .one
    .two;
>>> do not split on "." when target is list
[element, element, element, element, element].someLongMethod();
<<<
[
  element,
  element,
  element,
  element,
  element
].someLongMethod();
>>> do not split on "." when target is map
<String,String>{"key": "value", "another": "another value"}.someLongMethod();
<<<
<String, String>{
  "key": "value",
  "another": "another value"
}.someLongMethod();
>>> do not split on "." when target is function literal passed to method
method(() {;}).someLongMethod();
<<<
method(() {
  ;
}).someLongMethod();
>>> do not split on "." when target is function literal passed to constructor
new Foo(() {;}).someLongMethod();
<<<
new Foo(() {
  ;
}).someLongMethod();
>>> do not split on "." when target is function literal passed to function
(function)(() {;}).someLongMethod();
<<<
(function)(() {
  ;
}).someLongMethod();
>>> do not split on "." when target is parenthesized unsplittable
((([element,]))).someLongMethod();
<<<
((([
  element,
]))).someLongMethod();
>>> trailing comma argument list does not force trailing method chain to split
function(argument,).method().method();
<<<
function(
  argument,
).method().method();
>>> if method chain splits, split before first too
function(argument,).method().method().method().method().method();
<<<
function(
  argument,
)
    .method()
    .method()
    .method()
    .method()
    .method();
>>> if invocation looks like named constructor, don't put in chain
Foo.named().method().method().method().method().method();
<<<
Foo.named()
    .method()
    .method()
    .method()
    .method()
    .method();
>>> if invocation looks like prefixed constructor, don't put in chain
prefix.Foo().method().method().method().method().method();
<<<
prefix.Foo()
    .method()
    .method()
    .method()
    .method()
    .method();
>>> if invocation looks like prefixed named constructor, don't put in chain
prefix.Foo.named().method().method().method().method().method();
<<<
prefix.Foo.named()
    .method()
    .method()
    .method()
    .method()
    .method();
>>> if invocation looks like private named constructor, don't put in chain
_Foo.named().method().method().method().method().method();
<<<
_Foo.named()
    .method()
    .method()
    .method()
    .method()
    .method();
>>> if invocation looks like private prefixed constructor, don't put in chain
prefix._Foo().method().method().method().method().method();
<<<
prefix._Foo()
    .method()
    .method()
    .method()
    .method()
    .method();
>>> if invocation looks like private prefixed named constructor, don't put in chain
prefix._Foo.named().method().method().method().method().method();
<<<
prefix._Foo.named()
    .method()
    .method()
    .method()
    .method()
    .method();
>>> invocations in method chain
someReceiverObject.method1().method2().method3()(argument)
.method4().method5().method6();
<<<
someReceiverObject
    .method1()
    .method2()
    .method3()(argument)
    .method4()
    .method5()
    .method6();
>>> chained invocations
someReceiverObject.method1().method2().method3()
(argument)(argument)<T, R>(argument, argument, argument, argument, argument)(argument)
.method4().method5().method6();
<<<
someReceiverObject
    .method1()
    .method2()
    .method3()(argument)(argument)
        <T, R>(
            argument,
            argument,
            argument,
            argument,
            argument)(argument)
    .method4()
    .method5()
    .method6();
>>> "!" stays with operand before method call
verylongIdentifier!.longIdentifier().another()!.aThird()!;
<<<
verylongIdentifier!
    .longIdentifier()
    .another()!
    .aThird()!;
>>> "!" stays with operand before property access
verylongIdentifier!.longIdentifier.another!.aThird!;
<<<
verylongIdentifier!
    .longIdentifier.another!.aThird!;
>>> "!" stays with operand before property access
verylongIdentifier!.longIdentifier.another!.aThird!.longerPropertyChain;
<<<
verylongIdentifier!
    .longIdentifier
    .another!
    .aThird!
    .longerPropertyChain;
>>> "!" stays with operand before index
verylongIdentifier![i]![j].longIdentifier[i][j].another[i]![j].aThird!;
<<<
verylongIdentifier![i]![j]
    .longIdentifier[i][j]
    .another[i]![j]
    .aThird!;
>>> "!" stays with operand before call
verylongIdentifier!(i)!(j).longIdentifier(i)(j).another(i)!(j).aThird!;
<<<
verylongIdentifier!(i)!(j)
    .longIdentifier(i)(j)
    .another(i)!(j)
    .aThird!;
>>> do not split null-asserted chained calls if not needed
compiler!.a().b()!.c.d();
<<<
compiler!.a().b()!.c.d();
>>> null-assert in block calls
compiler!.a(() {;})!.b(() {;})!;
<<<
compiler!.a(() {
  ;
})!.b(() {
  ;
})!;
>>> null-aware index
receiver.property1.property2
        .property3?[0][1]?[2]
    .method1()?[0][1]?[2]
    .method2();
<<<
receiver.property1.property2
    .property3?[0][1]?[2]
    .method1()?[0][1]?[2]
    .method2();