40 columns                              |
>>> Single initializers can be on one line
class Foo extends Bar {
  final int b;
  Foo(int a, this.b) : super(a);
}
<<<
class Foo extends Bar {
  final int b;
  Foo(int a, this.b) : super(a);
}
>>> (or not)
class Foo extends Bar {
  final int b;
  Foo(int a, this.b): super(aLongIdentifier);
}
<<<
class Foo extends Bar {
  final int b;
  Foo(int a, this.b)
      : super(aLongIdentifier);
}
>>> Multiple initializers are one per line
class Foo extends Bar {
  final int b;
  Foo(int a, int b) : super(a), this.b = b == null ? 0 : b;
}
<<<
class Foo extends Bar {
  final int b;
  Foo(int a, int b)
      : super(a),
        this.b = b == null ? 0 : b;
}
>>> try to keep constructor call together
var longIdentifier = new Thing(
    argument, argument);
<<<
var longIdentifier =
    new Thing(argument, argument);
>>> splits before ":" if the parameter list does not fit on one line
class Foo {
  Foo(int longArg1, int longArg2, int longArg3) : this._(longArg1);
}
<<<
class Foo {
  Foo(int longArg1, int longArg2,
      int longArg3)
      : this._(longArg1);
}
>>> indent parameters more if body is a wrapped =>
class Foo {
  Foo(firstArgument, secondArgument, third) => "very long body that must wrap";
}
<<<
class Foo {
  Foo(firstArgument, secondArgument,
          third) =>
      "very long body that must wrap";
}
>>> wrap initializers past the ":"
class Foo {
  Foo(parameter)
      : initializer = function(argument, argument),
        initializer2 = function(argument, argument);
}
<<<
class Foo {
  Foo(parameter)
      : initializer = function(
            argument, argument),
        initializer2 = function(
            argument, argument);
}
>>> split at "=" in initializer
class Foo {
  Foo() : initializer =function(argument, arg);
}
<<<
class Foo {
  Foo()
      : initializer =
            function(argument, arg);
}
>>> assert in initializer list, short
class Foo {
  Foo() : assert(1), assert(2);
}
<<<
class Foo {
  Foo()
      : assert(1),
        assert(2);
}
>>> assert in initializer list, long
class Foo {
  Foo() : assert(function(argument, argument, argument)), assert(function(argument, function(argument, argument, argument), argument));
}
<<<
class Foo {
  Foo()
      : assert(function(argument,
            argument, argument)),
        assert(function(
            argument,
            function(argument, argument,
                argument),
            argument));
}
>>> trailing commas and initializer lists
class A {
  A(a,):super();
}
<<<
class A {
  A(
    a,
  ) : super();
}
>>>
class A {
  A({a,}):super();
}
<<<
class A {
  A({
    a,
  }) : super();
}
>>>
class A {
  A(a,):b=1,super();
}
<<<
class A {
  A(
    a,
  )   : b = 1,
        super();
}
>>> extra space after ":" to line up with later initializers
class A {
  A({a,}):b=1,super(){;}
}
<<<
class A {
  A({
    a,
  })  : b = 1,
        super() {
    ;
  }
}
>>> no extra space on a single initializer, even if it splits
class A {
  A(a,):parameter = "some very very long param";
}
<<<
class A {
  A(
    a,
  ) : parameter =
            "some very very long param";
}
>>> split at name if necessary
main() {
  new VeryLongClassName.veryLongNamedConstructor();
}
<<<
main() {
  new VeryLongClassName
      .veryLongNamedConstructor();
}