blob: 9fb5922ccc6a690a81b65c9feaa8a24dc72670f9 [file] [log] [blame] [view]
## 3.1.3-wip
* No longer format imports with configurations and a prefix in the wrong order.
The parser used to accept this without error even though it violated the
language spec. The parser is being fixed, so the formatter will no longer
accept or format code like:
```dart
import 'foo.dart' as prefix if (cond) 'bar.dart';
```
* Don't force a space between `?` and `.` if a null-aware element contains a
dot shorthand.
### Bug fixes
* Respect `@dart=` version comments when determining which >3.7 style to apply.
The formatter correctly used those comments to switch between the old short
and new tall style, but ignored them for language versioned style rule changes
after 3.7. Now the language version of the file is consistently respected for
all style rules (#1762).
## 3.1.2
* Support dot shorthand syntax.
* Update to the latest `package:analyzer`.
* Enable language version 3.10.
### Bug fixes
* Preserved trailing commas (`trailing_commas: preserve`) applies to record
type annotations too (#1721).
### Style changes
This change only applies to code whose language version is 3.10 or higher:
* When `trailing_commas` is `preserve`, preserve a trailing comma after the last
enum constant when members are present (#1678, #1729).
```dart
// Before formatting:
enum { constant, ; member() {} }
// After formatting at language version 3.9 or lower:
enum {
constant;
member() {}
}
// After formatting at language version 3.10 or higher:
enum {
constant,
;
member() {}
}
```
(Thanks to jellynoone@ for this change.)
## 3.1.1
* Update to latest analyzer and enable language version 3.9.
## 3.1.0
This release contains a fairly large number of style changes in response to
feedback we got from shipping the new tall style formatter.
### Features
* Allow preserving trailing commas and forcing the surrounding construct to
split even when it would otherwise fit on one line. This is off by default
(because it breaks [reversibility][] among other reasons) but can be enabled
by adding this to a surrounding `analysis_options.yaml` file:
```yaml
formatter:
trailing_commas: preserve
```
This is similar to how trailing commas work in the old short style formatter
applied to code before language version 3.7.
[reversibility]: https://github.com/dart-lang/dart_style/wiki/Reversibility-principle
### Bug fixes
* Don't add a trailing comma in lists that don't allow it, even when there is
a trailing comment (#1639).
### Style changes
The following style changes are language versioned and only affect code whose
language version is 3.8 or later. Dart code at 3.7 or earlier is formatted the
same as it was before.
* Allow more code on the same line as a named argument or `=>` (#1536, #1545,
#1668, #1679).
```dart
// Before:
function(
name:
(param, another) =>
veryLongBody,
);
function(
name:
(param) => another(
argument1,
argument2,
argument3,
),
);
// After:
function(
name: (param, another) =>
veryLongBody,
);
function(
name: (param) => another(
argument1,
argument2,
argument3,
),
);
```
* Avoid splitting chains containing only properties.
```dart
// Before:
variable = target
.property
.another;
// After:
variable =
target.property.another;
```
Note that this only applies to `.` chains that are only properties. If there
are method calls in the chain, then it prefers to split the chain instead of
splitting at `=`, `:`, or `=>`.
* Allow the target or property chain part of a split method chain on the RHS of
`=`, `:`, and `=>` (#1466).
```dart
// Before:
variable =
target.property
.method()
.another();
// After:
variable = target.property
.method()
.another();
```
* Allow the condition part of a split conditional expression on the RHS of `=`,
`:`, and `=>` (#1465).
```dart
// Before:
variable =
condition
? longThenBranch
: longElseBranch;
// After:
variable = condition
? longThenBranch
: longElseBranch;
```
* Don't indent conditional branches redundantly after `=`, `:`, and `=>`.
```dart
// Before:
function(
argument:
condition
? thenBranch
: elseBranch,
)
// After:
function(
argument:
condition
? thenBranch
: elseBranch,
)
```
* Indent conditional branches past the operators (#1534).
```dart
// Before:
condition
? thenBranch +
anotherOperand
: elseBranch(
argument,
);
// After:
condition
? thenBranch +
anotherOperand
: elseBranch(
argument,
);
```
* Block format record types in typedefs (#1651):
```dart
// Before:
typedef ExampleRecordTypedef =
(
String firstParameter,
int secondParameter,
String thirdParameter,
String fourthParameter,
);
// After:
typedef ExampleRecordTypedef = (
String firstParameter,
int secondParameter,
String thirdParameter,
String fourthParameter,
);
```
* Eagerly split argument lists whose contents are complex enough to be easier
to read spread across multiple lines even if they would otherwise fit on a
single line (#1660). The rules are basically:
* If an argument list contains at least three named arguments, at least one
of which must be directly in the argument list and at least one of which
must be nested in an inner argument list, then force the outer one to split.
We make an exception where a named argument whose expression is a simple
number, Boolean, or null literal doesn't count as a named argument.
* If a list, set, or map literal is the immediate expression in a named
argument and contains any argument lists with a named argument, then force
the collection to split.
```dart
// Before:
TabBar(tabs: [Tab(text: 'A'), Tab(text: 'B')], labelColor: Colors.white70);
// After:
TabBar(
tabs: [
Tab(text: 'A'),
Tab(text: 'B'),
],
labelColor: Colors.white70,
);
```
## 3.0.1
* Handle trailing commas in for-loop updaters (#1354).
* Format `||` patterns like fallthrough cases in switch expressions (#1602).
* Handle comments and metadata before variables more gracefully (#1604).
* Ensure comment formatting is idempotent (#1606).
* Better indentation of leading comments on property accesses in binary operator
operands (#1611).
* Don't crash on doc comments in local variable declarations (#1621).
## 3.0.0
This is a large change. Under the hood, the formatter was almost completely
rewritten, with the codebase now containing both the old and new
implementations. The old formatter exists to support the older "short" style
and the new code implements [the new "tall" style][tall].
[tall]: https://github.com/dart-lang/dart_style/issues/1253
The formatter uses the language version of the formatted code to determine
which style you get. If the language version is 3.6 or lower, the code is
formatted with the old style. If 3.7 or later, you get the new tall style. You
typically control the language version by [setting a min SDK constraint in your
package's pubspec][versioning].
[versioning]: https://dart.dev/guides/language/evolution
In addition to the new formatting style, a number of other API and CLI changes
are included, some of them breaking:
* **Support project-wide page width configuration.** By long request, you can
now configure your preferred formatting page width on a project-wide basis.
When formatting files, the formatter will look in the file's directory and
any surrounding directories for an `analysis_options.yaml` file. If it finds
one, it looks for the following YAML:
```yaml
formatter:
page_width: 123
```
If it finds a `formatter` key containing a map with a `page_width` key whose
value is an integer, then that is the page width that the file is formatted
using. Since the formatter will walk the surrounding directories until it
finds an `analysis_options.yaml` file, this can be used to globally set the
page width for an entire directory, package, or even collection of packages.
* **Support overriding the page width for a single file.** In code formatted
using the new tall style, you can use a special marker comment to control the
page width that it's formatted using:
```dart
// dart format width=30
main() {
someExpression +
thatSplitsAt30;
}
```
This comment must appear before any code in the file and must match that
format exactly. The width set by the comment overrides the width set by any
surrounding `analysis_options.yaml` file.
This feature is mainly for code generators that generate and immediately
format code but don't know about any surrounding `analysis_options.yaml`
that might be configuring the page width. By inserting this comment in the
generated code before formatting, it ensures that the code generator's
behavior matches the behavior of `dart format`.
End users should mostly use `analysis_options.yaml` for configuring their
preferred page width (or do nothing and use the default page width of 80).
* **Support opting out a region of code from formatting.** In code formatted
using the new tall style, you can use a pair of special marker comments to
opt a region of code out of automated formatting:
```dart
main() {
this.isFormatted();
// dart format off
no + formatting
+
here;
// dart format on
formatting.isBackOnHere();
}
```
The comments must be exactly `// dart format off` and `// dart format on`.
A file may have multiple regions, but they can't overlap or nest.
This can be useful for highly structured data where custom layout can help
a reader understand the data, like large lists of numbers.
* **Remove support for fixes and `--fix`.** The tools that come with the Dart
SDK provide two ways to apply automated changes to code: `dart format --fix`
and `dart fix`. The former is older and used to be faster. But it can only
apply a few fixes and hasn't been maintained in many years. The `dart fix`
command is actively maintained, can apply all of the fixes that
`dart format --fix` could apply and many many more.
In order to avoid duplicate engineering effort, we decided to consolidate on
`dart fix` as the one way to make automated changes that go beyond the simple
formatting and style changes that `dart format` applies.
The ability to apply fixes is also removed from the `DartFormatter()` library
API.
* **Make the language version parameter to `DartFormatter()` mandatory.** This
way, the formatter always knows what language version the input is intended
to be treated as. Note that a `// @dart=` language version comment, if
present, overrides the specified language version. You can think of the
version passed to the `DartFormatter()` constructor as a "default" language
version which the file's contents may then override.
If you don't particularly care about the version of what you're formatting,
you can pass in `DartFormatter.latestLanguageVersion` to unconditionally get
the latest language version that the formatter supports. Note that doing so
means you will also implicitly opt into the new tall style.
This change only affects the library API. When using the formatter from the
command line, you can use `--language-version=` to specify a language version
or pass `--language-version=latest` to use the latest supported version. If
omitted, the formatter will look in the surrounding directories for a package
config file and infer the language version for the package from that, similar
to how other Dart tools behave like `dart analyze` and `dart run`.
* **Remove the old formatter executables and CLI options.** Before the
`dart format` command was added to the core Dart SDK, users accessed the
formatter by running a separate `dartfmt` executable that was included with
the Dart SDK. That executable had a different CLI interface. For example, you
had to pass `-w` to get it to overwrite files. When we added `dart format`,
we took that opportunity to revamp the CLI options.
However, the dart_style package still exposed an executable with the old CLI.
If you ran `dart pub global activate dart_style`, this would give you a
`dartfmt` (and `dartformat`) executable with the old CLI options. Now that
almost everyone is using `dart format`, we have removed the old CLI and the
old package executables.
You can still run the formatter on the CLI through the package (for example,
if you want to use a particular version of dart_style instead of the one
bundled with your Dart SDK). But it now uses the exact same CLI options and
arguments as the `dart format` command. You can invoke it with
`dart run dart_style:format <args...>`.
* **Treat the `--stdin-name` name as a path when inferring language version.**
When reading input on stdin, the formatter still needs to know what language
version to parse the code as. If the `--stdin-name` option is set, then that
is treated as a file path and the formatter looks for a package config
surrounding that file path to infer the language version from.
If you don't want that behavior, pass in an explicit language version using
`--language-version=`, or use `--language-version=latest` to parse the input
using the latest language version supported by the formatter.
If `--stdin-name` and `--language-version` are both omitted, then the
formatter parses stdin using the latest supported language version.
* **Rename the `--line-length` option to `--page-width`.** This is consistent
with the public API, internal implementation, and docs, which all use "page
width" to refer to the limit that the formatter tries to fit code into.
The `--line-length` name is still supported for backwards compatibility, but
may be removed at some point in the future. You're encouraged to move to
`--page-width`. Use of this option (however it's named) is rare, and will
likely be even rarer now that project-wide configuration is supported, so
this shouldn't affect many users.
* **Apply class modifiers to API classes.** The dart_style package exposes only
a few classes in its public API: `DartFormatter`, `SourceCode`,
`FormatterException`, and `UnexpectedOutputException`. None were ever
intended to be extended or implemented. They are now all marked `final` to
make that intention explicit.
* Require `package:analyzer` `>=6.5.0 <8.0.0`.
## 2.3.7
* Allow passing a language version to `DartFomatter()`. Formatted code will be
parsed at that version. If omitted, defaults to the latest version. In a
future release, this parameter will become required.
* Allow opting out of formatting for a region of code using `// dart format off`
and `// dart format on` comments. Note: This only works using the new tall
style and requires passing the `--enable-experiment=tall-style` experiment
flag (#361).
* Preserve type parameters on old-style function-typed formals that also use
`this.` or `super.` (#1321).
* Correctly format imports with both `as` and `if` clauses (#1544).
* Remove temporary work around for analyzer 6.2.0 from dart_style 2.3.6.
* Require `package:analyzer` `>=6.5.0 <7.0.0`.
## 2.3.6
* Fix compile error when using dart_style with analyzer 6.2.0.
## 2.3.5
* Ensure switch expressions containing line comments split (#1404).
* Use language version `3.3` to parse so that code with extension types can be
formatted.
* Support formatting the `macro` modifier when the `macros` experiment flag
is passed.
## 2.3.4
* Add `tall-style` experiment flag to enable the in-progress unstable new
formatting style (#1253).
* Format extension types.
* Normalize ignored whitespace and "escaped whitespace" on first line
of multiline string literals (#1235).
## 2.3.3
* Always split enum declarations containing a line comment (#1254).
* Fix regression in splitting type annotations with library prefixes (#1249).
* Remove support for `inline class` since that syntax has changed.
* Add `--enable-experiment` command-line option to enable language experiments.
The library API also supports this with `DartFormatter.experimentFlags`.
## 2.3.2
* Don't indent parameters that have metadata annotations. Instead, align them
with the metadata and other parameters.
* Allow metadata annotations on parameters to split independently of annotations
on other parameters (#1212).
* Don't split before `.` following a record literal (#1213).
* Don't force split on a line comment before a switch expression case (#1215).
* Require `package:analyzer` `>=5.12.0 <7.0.0`.
* Preserve `?` on nullable empty record types (#1224).
## 2.3.1
* Hide `--fix` and related options in `--help`. The options are still there and
supported, but are no longer shown by default. Eventually, we would like all
users to move to using `dart fix` instead of `dart format --fix`.
* Don't indent `||` pattern operands in switch expression cases.
* Don't format `sealed`, `interface`, and `final` keywords on mixin
declarations. The proposal was updated to no longer support them.
* Don't split before a single-section cascade following a record literal.
* Give records block-like formatting in argument lists (#1205).
## 2.3.0
### New language features
* Format patterns and related features.
* Format record expressions and record type annotations.
* Format class modifiers `base`, `final`, `interface`, `mixin`, and `sealed`.
* Format `inline class` declarations.
* Format unnamed libraries.
### Bug fixes and style changes
* Handle `sync*` and `async*` functions with `=>` bodies.
* Fix bug where parameter metadata wouldn't always split when it should.
* Don't split after `<` in collection literals.
* Better indentation of multiline function types inside type argument lists.
### Internal changes
* Use typed `_visitFunctionOrMethodDeclaration` instead of dynamically typed.
* Fix metadata test to not fail when record syntax makes whitespace between
metadata annotation names and `(` significant ([sdk#50769][]).
* Require Dart 2.19.
* Require `package:analyzer` `^5.7.0`.
[sdk#50769]: https://github.com/dart-lang/sdk/issues/50769
## 2.2.5
* Format unnamed libraries.
* Require Dart 2.17.
## 2.2.4
* Unify how brace-delimited syntax is formatted. This is mostly an internal
refactoring, but slightly changes how a type body containing only an inline
block comment is formatted.
* Refactor Chunk to store split before text instead of after. This mostly does
not affect the visible behavior of the formatter, but a few edge cases are
handled slightly differently. These are all bug fixes where the previous
behavior was unintentional. The changes are:
* Consistently discard blank lines between a `{` or `[` and a subsequent
comment. It used to do this before the `{` in type bodies, but not switch
bodies, optional parameter sections, or named parameter sections.
* Don't allow splitting an empty class body.
* Allow splitting after an inline block comment in some places where it makes
sense.
* Don't allow a line comment in an argument list to cause preceding arguments
to be misformatted.
* Remove blank lines after a line comment at the end of a body.
* Require `package:analyzer` `>=4.4.0 <6.0.0`.
## 2.2.3
* Allow the latest version of `package:analyzer`.
## 2.2.2
* Format named arguments anywhere (#1072).
* Format enhanced enums (#1075).
* Format "super." parameters (#1091).
## 2.2.1
* Require `package:analyzer` version `2.6.0`.
* Use `NamedType` instead of `TypeName`.
## 2.2.0
* Fix analyzer dependency constraint (#1051).
## 2.1.1
* Republish 2.0.3 as 2.1.1 in order to avoid users getting 2.1.0, which has a
bad dependency constraint (#1051).
## 2.1.0
* Support generic function references and constructor tear-offs (#1028).
## 2.0.3
* Fix hang when reading from stdin (https://github.com/dart-lang/sdk/issues/46600).
## 2.0.2
* Don't unnecessarily split argument lists with `/* */` comments (#837).
* Return correct exit code from `FormatCommand` when formatting stdin (#1035).
* Always split cascades with multiple sections (#1006).
* Don't indent cascades farther than their receiver method chains.
* Optimize line splitting cascades (#811).
* Split empty catch blocks with finally clauses (#1029).
* Split empty catch blocks with catches after them.
* Allow the latest version of `package:analyzer`.
## 2.0.1
* Support triple-shift `>>>` and `>>>=` operators (#992).
* Support non-function type aliases (#993).
* Correct constructor initializer indentation after `required` (#1010).
## 2.0.0
* Migrate to null safety.
## 1.3.14
* Add support for generic annotations.
* `FormatCommand.run()` now returns the value set in `exitCode` during
formatting.
## 1.3.13
- Allow the latest version of `package:analyzer`.
## 1.3.12
- Allow the latest versions of `package:args` and `package:pub_semver`.
## 1.3.11
* Remove use of deprecated analyzer API and List constructor.
* Fix performance issue with constructors that have no initializer list.
## 1.3.10
* Allow analyzer version 0.41.x.
## 1.3.9
* Don't duplicate comments on chained if elements (#966).
## 1.3.8
* Preserve `?` in initializing formal function-typed parameters (#960).
## 1.3.7
* Split help into verbose and non-verbose lists (#938).
* Don't crash when non-ASCII whitespace is trimmed (#901).
* Split all conditional expressions (`?:`) when they are nested (#927).
* Handle `external` and `abstract` fields and variables (#946).
## 1.3.6
* Change the path used in error messages when reading from stdin from "<stdin>"
to "stdin". The former crashes on Windows since it is not a valid Windows
pathname. To get the old behavior, pass `--stdin-name=<stdin>`.
## 1.3.5
* Restore command line output accidentally removed in 1.3.4.
## 1.3.4
* Add `--fix-single-cascade-statements`.
* Correctly handle `var` in `--fix-function-typedefs` (#826).
* Preserve leading indentation in fixed doc comments (#821).
* Split outer nested control flow elements (#869).
* Always place a blank line after script tags (#782).
* Don't add unneeded splits on if elements near comments (#888).
* Indent blocks in initializers of multiple-variable declarations.
* Update the null-aware subscript syntax from `?.[]` to `?[]`.
## 1.3.3
* Support `package:analyzer` `0.39.0`.
## 1.3.2
* Restore the code that publishes the dart-style npm package.
* Preserve comma after nullable function-typed parameters (#862).
## 1.3.1
* Fix crash in formatting complex method chains (#855).
## 1.3.0
* Add support for formatting extension methods (#830).
* Format `?` in types.
* Format the `late` modifier.
* Format the `required` modifier.
* Better formatting of empty spread collections (#831).
* Don't force split before `.` when the target is parenthesized (#704).
## 1.2.10
* Format null assertion operators.
* Better formatting for invocation expressions inside method call chains.
* Support `package:analyzer` `0.38.0`.
## 1.2.9
* Support `package:analyzer` `0.37.0`.
## 1.2.8
* Better indentation of function expressions inside trailing comma argument
lists. (Thanks a14@!)
* Avoid needless indentation on chained if-else elements (#813).
## 1.2.7
* Improve indentation of adjacent strings inside `=>` functions.
## 1.2.6
* Properly format trailing commas in assertions.
* Improve indentation of adjacent strings. This fixes a regression introduced
in 1.2.5 and hopefully makes adjacent strings generally look better.
Adjacent strings in argument lists now format the same regardless of whether
the argument list contains a trailing comma. The rule is that if the
argument list contains no other strings, then the adjacent strings do not
get extra indentation. This keeps them lined up when doing so is unlikely to
be confused as showing separate independent string arguments.
Previously, adjacent strings were never indented in argument lists without a
trailing comma and always in argument lists that did. With this change,
adjacent strings are still always indented in collection literals because
readers are likely to interpret a series of unindented lines there as showing
separate collection elements.
## 1.2.5
* Add support for spreads inside collections (#778).
* Add support for `if` and `for` elements inside collections (#779).
* Require at least Dart 2.1.0.
* Require analyzer 0.36.0.
## 1.2.4
* Update to latest analyzer package AST API.
* Tweak set literal formatting to follow other collection literals.
## 1.2.3
* Update `package:analyzer` constraint to `'>=0.33.0 <0.36.0'`.
## 1.2.2
* Support set literals (#751).
## 1.2.1
* Add `--fix-function-typedefs` to convert the old typedef syntax for function
types to the new preferred syntax.
## 1.2.0
* Add `--stdin-name` to specify name shown when reading from stdin (#739).
* Add `--fix-doc-comments` to turn `/** ... */` doc comments into `///` (#730).
* Add support for new mixin syntax (#727).
* Remove `const` in all metadata annotations with --fix-optional-const` (#720).
## 1.1.4
* Internal changes to support using the new common front end for parsing.
## 1.1.3
* Preserve whitespace in multi-line strings inside string interpolations (#711).
**Note!** This bug means that dart_style 1.1.2 may make semantics changes to
your strings. You should avoid that version and use 1.1.3.
* Set max SDK version to <3.0.0, and adjusted other dependencies.
## 1.1.2
* Don't split inside string interpolations.
## 1.1.1
* Format expressions in string interpolations (#226).
* Apply fixes inside string interpolations (#707).
## 1.1.0
* Add support for "style fixes", opt-in non-whitespace changes.
* Add fix to convert `:` to `=` as the named parameter default value separator.
* Add fix to remove `new` keywords.
* Add fix to remove unneeded `const` keywords.
* Uniformly format constructor invocations and other static method calls.
* Don't crash when showing parse errors in Dart 2 mode (#697).
## 1.0.14
* Support metadata on enum cases (#688).
## 1.0.13
* Support the latest release of `package:analyzer`.
## 1.0.12
* Fix another failure when running in Dart 2.
## 1.0.11
* Fix cast failure when running in Dart 2.
* Updated SDK version to 2.0.0-dev.17.0.
* Force split in empty then block in if with an else (#680).
## 1.0.10
* Don't split before `.` if the target expression is an argument list with a
trailing comma (#548, #665).
* Preserve metadata on for-in variables (#648).
* Support optional `new`/`const` (#652).
* Better formatting of initialization lists after trailing commas (#658).
## 1.0.9
* Updated tests. No user-facing changes.
## 1.0.8
* Support v1 of `pkg/args`.
## 1.0.7
* Format multiline strings as block arguments (#570).
* Fix call to analyzer API.
* Support assert in initializer list experimental syntax (#522).
## 1.0.6
* Support URIs in part-of directives (#615).
## 1.0.5
* Support the latest version of `pkg/analyzer`.
## 1.0.4
* Ensure formatter throws an exception instead of introducing non-whitespace
changes. This sanity check ensures the formatter does not erase user code
when the formatter itself contains a bug.
* Preserve type arguments in generic typedefs (#619).
* Preserve type arguments in function expression invocations (#621).
## 1.0.3
* Preserve type arguments in generic function-typed parameters (#613).
## 1.0.2
* Support new generic function typedef syntax (#563).
## 1.0.1
* Ensure space between `-` and `--` (#170).
* Preserve a blank line between enum cases (#606).
## 1.0.0
* Handle mixed block and arrow bodied function arguments uniformly (#500).
* Don't add a spurious space after "native" (#541).
* Handle parenthesized and immediately invoked functions in argument lists
like other function literals (#566).
* Preserve a blank line between an annotation and the first directive (#571).
* Fix splitting in generic methods with `=>` bodies (#584).
* Allow splitting between a parameter name and type (#585).
* Don't split after `<` when a collection is in statement position (#589).
* Force a split if the cascade target has non-obvious precedence (#590).
* Split more often if a cascade target contains a split (#591).
* Correctly report unchanged formatting when reading from stdin.
## 0.2.16
* Don't discard type arguments on method calls with closure arguments (#582).
## 0.2.15
* Support `covariant` modifier on methods.
## 0.2.14
* Update to analyzer 0.29.3. This should make dart_style a little more resilient
to breaking changes in analyzer that add support for new syntax that
dart_style can't format yet.
## 0.2.13
* Support generic method *parameters* as well as arguments.
## 0.2.12
* Add support for assert() in constructor initializers.
* Correctly indent the right-hand side of `is` and `as` expressions.
* Avoid splitting in index operators when possible.
* Support generic methods (#556).
## 0.2.11+1
* Fix test to not depend on analyzer error message.
## 0.2.11
* Widen dependency on analyzer to allow 0.29.x.
## 0.2.10
* Handle metadata annotations before parameters with trailing commas (#520).
* Always split enum declarations if they end in a trailing comma (#529).
* Add `--set-exit-if-changed` to set the exit code on a change (#365).
## 0.2.9
* Require analyzer 0.27.4, which makes trailing commas on by default.
## 0.2.8
* Format parameter lists with trailing commas like argument lists (#447).
## 0.2.7
* Make it strong mode clean.
* Put labels on their own line (#43).
* Gracefully handle IO errors when failing to overwrite a file (#473).
* Add a blank line after local functions, to match top level ones (#488).
* Improve indentation in non-block-bodied control flow statements (#494).
* Better indentation on very long return types (#503).
* When calling from JS, guess at which error to show when the code cannot be
parsed (#504).
* Force a conditional operator to split if the condition does (#506).
* Preserve trailing commas in argument and parameter lists (#509).
* Split arguments preceded by comments (#511).
* Remove newlines after script tags (#513).
* Split before a single named argument if the argument itself splits (#514).
* Indent initializers in multiple variable declarations.
* Avoid passing an invalid Windows file URI to analyzer.
* Always split comma-separated sequences that contain a trailing comma.
## 0.2.6
* Support deploying an npm package exporting a formatCode method.
## 0.2.4
* Better handling for long collections with comments (#484).
## 0.2.3
* Support messages in assert() (#411).
* Don't put spaces around magic generic method annotation comments (#477).
* Always put member metadata annotations on their own line (#483).
* Indent functions in named argument lists with non-functions (#478).
* Force the parameter list to split if a split occurs inside a function-typed
parameter.
* Don't force a split for before a single named argument if the argument itself
splits.
## 0.2.2
* Upgrade to analyzer 0.27.0.
* Format configured imports and exports.
## 0.2.1
* `--version` command line argument (#240).
* Split the first `.` in a method chain if the target splits (#255).
* Don't collapse states that differ by unbound rule constraints (#424).
* Better handling for functions in method chains (#367, #398).
* Better handling of large parameter metadata annotations (#387, #444).
* Smarter splitting around collections in named parameters (#394).
* Split calls if properties in a chain split (#399).
* Don't allow splitting inside empty functions (#404).
* Consider a rule live if it constrains a rule in the overflow line (#407).
* Allow splitting in prefix expressions (#410).
* Correctly constrain collections in argument lists (#420, #463, #465).
* Better indentation of collection literals (#421, #469).
* Only show a hidden directory once in the output (#428).
* Allow splitting between type and variable name (#429, #439, #454).
* Better indentation for binary operators in `=>` bodies (#434.
* Tweak splitting around assignment (#436, #437).
* Indent multi-line collections in default values (#441).
* Don't drop metadata on part directives (#443).
* Handle `if` statements without curly bodies better (#448).
* Handle loop statements without curly bodies better (#449).
* Allow splitting before `get` and `set` (#462).
* Add `--indent` to specify leading indent (#464).
* Ensure collection elements line split separately (#474).
* Allow redirecting constructors to wrap (#475).
* Handle index expressions in the middle of call chains.
* Optimize splitting lines with many rules.
## 0.2.0
* Treat functions nested inside function calls like block arguments (#366).
## 0.2.0-rc.4
* Smarter indentation for function arguments (#369).
## 0.2.0-rc.3
* Optimize splitting complex lines (#391).
## 0.2.0-rc.2
* Allow splitting between adjacent strings (#201).
* Force multi-line comments to the next line (#241).
* Better splitting in metadata annotations in parameter lists (#247).
* New optimized line splitter (#360, #380).
* Allow splitting after argument name (#368).
* Parsing a statement fails if there is unconsumed input (#372).
* Don't force `for` fully split if initializers or updaters do (#375, #377).
* Split before `deferred` (#381).
* Allow splitting on `as` and `is` expressions (#384).
* Support null-aware operators (`?.`, `??`, and `??=`) (#385).
* Allow splitting before default parameter values (#389).
## 0.2.0-rc.1
* **BREAKING:** The `indent` argument to `new DartFormatter()` is now a number
of *spaces*, not *indentation levels*.
* This version introduces a new n-way constraint system replacing the previous
binary constraints. It's mostly an internal change, but allows us to fix a
number of bugs that the old solver couldn't express solutions to.
In particular, it forces argument and parameter lists to go one-per-line if
they don't all fit in two lines. And it allows function and collection
literals inside expressions to indent like expressions in some contexts.
(#78, #97, #101, #123, #139, #141, #142, #143, et. al.)
* Indent cascades more deeply when the receiver is a method call (#137).
* Preserve newlines in collections containing line comments (#139).
* Allow multiple variable declarations on one line if they fit (#155).
* Prefer splitting at "." on non-identifier method targets (#161).
* Enforce a blank line before and after classes (#168).
* More precisely control newlines between declarations (#173).
* Preserve mandatory newlines in inline block comments (#178).
* Splitting inside type parameter and type argument lists (#184).
* Nest blocks deeper inside a wrapped conditional operator (#186).
* Split named arguments if the positional arguments split (#189).
* Re-indent line doc comments even if they are flush left (#192).
* Nest cascades like expressions (#200, #203, #205, #221, #236).
* Prefer splitting after `=>` over other options (#217).
* Nested non-empty collections force surrounding ones to split (#223).
* Allow splitting inside with and implements clauses (#228, #259).
* Allow splitting after `=` in a constructor initializer (#242).
* If a `=>` function's parameters split, split after the `=>` too (#250).
* Allow splitting between successive index operators (#256).
* Correctly indent wrapped constructor initializers (#257).
* Set failure exit code for malformed input when reading from stdin (#359).
* Do not nest blocks inside single-argument function and method calls.
* Do nest blocks inside `=>` functions.
## 0.1.8+2
* Allow using analyzer 0.26.0-alpha.0.
## 0.1.8+1
* Use the new `test` package runner internally.
## 0.1.8
* Update to latest `analyzer` and `args` packages.
* Allow cascades with repeated method names to be one line.
## 0.1.7
* Update to latest analyzer (#177).
* Don't discard annotations on initializing formals (#197).
* Optimize formatting deeply nested expressions (#108).
* Discard unused nesting level to improve performance (#108).
* Discard unused spans to improve performance (#108).
* Harden splits that contain too much nesting (#108).
* Try to avoid splitting single-element lists (#211).
* Avoid splitting when the first argument is a function expression (#211).
## 0.1.6
* Allow passing in selection to preserve through command line (#194).
## 0.1.5+1, 0.1.5+2, 0.1.5+3
* Fix test files to work in main Dart repo test runner.
## 0.1.5
* Change executable name from `dartformat` to `dartfmt`.
## 0.1.4
* Don't mangle comma after function-typed initializing formal (#156).
* Add `--dry-run` option to show files that need formatting (#67).
* Try to avoid splitting in before index argument (#158, #160).
* Support `await for` statements (#154).
* Don't delete commas between enum values with doc comments (#171).
* Put a space between nested unary `-` calls (#170).
* Allow `-t` flag to preserve compatibility with old formatter (#166).
* Support `--machine` flag for machine-readable output (#164).
* If no paths are provided, read source from stdin (#165).
## 0.1.3
* Split different operators with the same precedence equally (#130).
* No spaces for empty for loop clauses (#132).
* Don't touch files whose contents did not change (#127).
* Skip formatting files in hidden directories (#125).
* Don't include trailing whitespace when preserving selection (#124).
* Force constructor initialization lists to their own line if the parameter
list is split across multiple lines (#151).
* Allow splitting in index operator calls (#140).
* Handle sync* and async* syntax (#151).
* Indent the parameter list more if the body is a wrapped "=>" (#144).
## 0.1.2
* Move split conditional operators to the beginning of the next line.
## 0.1.1
* Support formatting enums (#120).
* Handle Windows line endings in multiline strings (#126).
* Increase nesting for conditional operators (#122).