40 columns                              |
>>> keeps map on one line if possible
sendPort.send({'type': 'error', 'error': 'oops'});
<<<
sendPort.send(
    {'type': 'error', 'error': 'oops'});
>>> prefers to wrap before "."
new Future.sync(() => callback('msg')).then(
    (result) => replyTo.send()).catchError((error) {});
<<<
new Future.sync(() => callback('msg'))
    .then((result) => replyTo.send())
    .catchError((error) {});
>>>
Stream readInput(AssetId id) => future((input) => input.read());
<<<
Stream readInput(AssetId id) =>
    future((input) => input.read());
>>> nested expression indentation
someFunctionName(argument, argument, argument,
    someOtherFunction(argument, argument, arg));
<<<
someFunctionName(
    argument,
    argument,
    argument,
    someOtherFunction(
        argument, argument, arg));
>>> does not extra indent when multiple levels of nesting happen on one line
someFunctionName(argument, argument, argument,
    some(other(function(argument, argument, arg))));
<<<
someFunctionName(
    argument,
    argument,
    argument,
    some(other(function(
        argument, argument, arg))));
>>> forces extra indent and lines, if later line needs it
callSomeMethod(innerFunction(argument, argument, argument), argument, argument, argument);
<<<
callSomeMethod(
    innerFunction(
        argument, argument, argument),
    argument,
    argument,
    argument);
>>> function inside a collection
[item, obj.method(argument).method(argument).method(() {body;}).another().another()];
<<<
[
  item,
  obj
      .method(argument)
      .method(argument)
      .method(() {
        body;
      })
      .another()
      .another()
];
>>> function inside an argument list
function(argument, obj.method(argument).method(argument).method(() {body;}).another().another());
<<<
function(
    argument,
    obj
        .method(argument)
        .method(argument)
        .method(() {
          body;
        })
        .another()
        .another());
>>> unnested function inside nested expression
function(argument, function(() {;}));
<<<
function(argument, function(() {
  ;
}));
>>> nested function inside nested expression
function(argument, function(() {;}, argument, () {;}));
<<<
function(
    argument,
    function(
        () {
          ;
        },
        argument,
        () {
          ;
        }));
>>> wrap before =>
receiver.firstMethod().next((parameter) => longIdentifier == veryLongIdentifier);
<<<
receiver.firstMethod().next(
    (parameter) =>
        longIdentifier ==
        veryLongIdentifier);
>>> wrap after =>
receiver.firstMethod().next(() => veryveryveryverylongIdentifier == veryLongIdentifier);
<<<
receiver.firstMethod().next(() =>
    veryveryveryverylongIdentifier ==
    veryLongIdentifier);
>>> wrap at nested binary operator
receiver.firstMethod().next(longIdentifier == veryLongIdentifier);
<<<
receiver.firstMethod().next(
    longIdentifier ==
        veryLongIdentifier);
>>> list inside method chain
receiver.first([listItem, secondItem, thirdItem]).second();
<<<
receiver.first([
  listItem,
  secondItem,
  thirdItem
]).second();
>>> list at end of method chain
receiver.first().second([listItem, secondItem, thirdItem, fourthItem]);
<<<
receiver.first().second([
  listItem,
  secondItem,
  thirdItem,
  fourthItem
]);
>>> binary operators in ascending precedence
{
  b___________________ || a______________ && a______________ == a______________ > a______________ + a______________;
}
<<<
{
  b___________________ ||
      a______________ &&
          a______________ ==
              a______________ >
                  a______________ +
                      a______________;
}
>>> binary operators in descending precedence
{
  b___________________ + a______________ > a______________ == a______________ && a______________ || a______________;
}
<<<
{
  b___________________ +
                      a______________ >
                  a______________ ==
              a______________ &&
          a______________ ||
      a______________;
}
>>> mixed multiplicative operators
longName * longName / longName % longName ~/ longName;
<<<
longName *
    longName /
    longName %
    longName ~/
    longName;
>>> mixed additive operators
longName + longName - longName + longName - longName;
<<<
longName +
    longName -
    longName +
    longName -
    longName;
>>> mixed shift operators
longName >> longName << longName >> longName << longName;
<<<
longName >>
    longName <<
    longName >>
    longName <<
    longName;
>>> mixture of same and different precedence
veryLongIdentifier + veryLongIdentifier / veryLongIdentifier *
veryLongIdentifier - veryLongIdentifier * veryLongIdentifier +
veryLongIdentifier / veryLongIdentifier - veryLongIdentifier;
<<<
veryLongIdentifier +
    veryLongIdentifier /
        veryLongIdentifier *
        veryLongIdentifier -
    veryLongIdentifier *
        veryLongIdentifier +
    veryLongIdentifier /
        veryLongIdentifier -
    veryLongIdentifier;
>>> choose extra nesting if it leads to better solution
longIdentifier +
    (longIdentifier ? 0 :
        1) == identifier;
<<<
longIdentifier +
        (longIdentifier ? 0 : 1) ==
    identifier;
>>> normal indent before unsplit binary operators in => body
veryLongFunction() => extremelyLongArgument + argument;
<<<
veryLongFunction() =>
    extremelyLongArgument + argument;
>>> no extra indent before binary operators in => body
veryLongFunction() => longArgument + longArgument + longArgument;
<<<
veryLongFunction() =>
    longArgument +
    longArgument +
    longArgument;
>>> initialize with as expression
var longVariableName = identifierSoLongItWraps as SomeClassName;
<<<
var longVariableName =
    identifierSoLongItWraps
        as SomeClassName;
>>> initialize with is expression
var longVariableName = identifierSoLongItWraps is SomeClassName;
<<<
var longVariableName =
    identifierSoLongItWraps
        is SomeClassName;