# Revision history for brittany

## 0.14.0.0 -- November 2021

* #357: Added support for GHC 9.0. Dropped support for all other versions of GHC.
  * ab59e9acc3069551ac4132321b285d000f5f5691: Removed runtime dependency on `ghc-paths`.
  * fa8365a7fa9372043d5a1018f2f7669ce3853edd: Started providing pre-built binaries for Linux, MacOS, and Windows.
  * Many other changes to Brittany's internals and exposed Haskell interface, but (hopefully) no changes to its command-line interface.

## 0.13.1.2 -- May 2021

* #347: Allowed hspec 2.8. Thanks @felixonmars!

## 0.13.1.1 -- February 2021

* #333: Allowed random 1.2. Thanks @felixonmars!
* #334: Updated Arch install instructions. Thanks @ahstro!
* #343: Allowed ghc-exactprint 0.6.4. Thanks @maralorn!

## 0.13.1.0 -- December 2020

* #330: Started sorting imports. Thanks @expipiplus1!

## 0.13.0.0 -- December 2020

* #324: Added support for GHC 8.10.
  * Dropped support for GHC 8.4, 8.2, and 8.0.
  * Thanks @jneira, @bubba, @infinity0, and @expipiplus1!

## 0.12.2.0 -- November 2020

* #207: Fix newtype indent in associated type family.
* #231: Improve comments-affecting-layout behaviour for tuples.
* #259: Data declaration for newtype and records. Thanks @eborden!
* #263: Fix non-idempotent newlines with comment + where.
* #273: Error handling.
* #281: Fix moving comment in export list (haddock header).
* #286: Fix comments in instance/type instances.
* #287: Add support for pattern synonyms. Thanks @RaoulHC!
* #293: Expose main function as a module. Thanks @soareschen!
* #303: Readme: Supports 8.8. Thanks @andys8!
* #311: Allows aeson-1.5.*. Thanks @jkachmar!
* #313: Nondecreasing export list formatting. Thanks @expipiplus1!

## 0.12.1.1 -- December 2019

* Bugfixes:
    - Fix layouting regression of record update for many/large fields
    - Fix whitespace regression on ExplicitForall notation
      (`foo :: forall  a . Show a => a -> a`, note the double space)
      introduced in 0.12. (#264)
    - Fix roundtripping of type equality constraint
      `f :: ((~) a b) => a -> b` (#267)
* One experimental feature addition: Turning brace notation semicolons into
  newlines when formatting (see #270)

## 0.12.1.0 -- September 2019

* Support ghc-8.8
* Support for OverloadedLabels extension
  (thanks to Evan Rutledge Borden @eborden)
* Support for Implicit Params extension (thanks to pepe iborra @pepeiborra)
* Add flag `--no-user-config` to enable only using manually passed config
* Disable the performance test suite by default to prevent spurious failures
  on certain CI setups. The github/travis brittany CI still has all tests
  enabled. See the `brittany-test-perf` flag in the cabal file.
* Bugfixes:
    - Fix one wandering-comment bug for let-in expressions
    - Fix invalid result for prefix operator pattern matches
    - Fix lambda expression with laziness/strictness annotation
    - Fix parenthesis handling for infix pattern matches with 3+ arguments
* Changes to layouting behaviour:
    - For pattern matching and data/instance definitions, the usage of
      parenthesis is now "normalized", i.e. superfluous parens are removed by
      brittany.

## 0.12.0.0 -- June 2019

* Support for ghc-8.6 (basic support, not necessarily all new syntactic
  extensions)
* Support -XExplicitNamespaces and -XPatternSynonyms
* Allow a --dry-run sort of operation via flag "-c/--check-mode"
  (thanks to Doug Beardsley @mightybyte)
* Include file name in errors about unsupported syntax nodes (thanks to @5outh)
* Partially implement layouting class instances: Layouts children, but
  falls back on ghc-exactprint for the instance head
  (thanks to Rupert Horlick @ruhatch)
* Implement layouting for type synonyms (thanks to Rupert Horlick @ruhatch)
* Support -XMagicHash, -XUnboxedTuples (thanks to Sergey Vinokurov @sergv)
* Support -XQuasiQuotes (no formatting applied to the splices; they are simply
  retained without causing the dreaded "Unknown construct: HsSpliceE{}")
    - `lconfig_allowHangingQuasiQuotes` controls whether multi-line
      QuasiQuotes are allowed to start at the end of the current line, or
      whether they are always placed in new lines.
* Bugfixes:
    - Fix rare-case alignment bug with IndentPolicyMultiple (#144)
    - Make inline layout config apply to module header (#151)
    - Fix unaligned import-hiding layout (#150)
    - Fix idempotence violation for comments around if-then-else (#167)
    - Fix comments having an effect on far-away parent node's layout (#159)
    - Fix imports of type operators ("symbolic data types")
      (thanks to Phil Hazelden @ChickenProp)
    - Work around GHC and cabal-install misfeature ".ghc.environment files"
      that could break brittany in unexpected and hard-to-understand ways
    - Stop removing empty lines before `where` keyword in a couple of cases
    - Fix functions with mixing prefix/infix style causing error (#234)
* Changes to layout:
    - Align usage of spaces for record update vs record construction (#126)
    - More indentation to import-hiding-paragraph (follow-up to #150 fix)
    - Record construction and update now are layouted in the same way
      (thanks to Evan Rutledge Borden @eborden)
    - Stop allowing single-line layout when there are comments between
      arguments (#214) (thanks to @matt-noonan)
* Various build-instructions and editor integrations

## 0.11.0.0 -- May 2018

* Support for ghc-8.4
* Implement inline-config
    e.g. "-- brittany --indent=4"

    respects the following comment forms as input:

    ~~~~
    source comment                       affected target
    ======================================================
    "-- brittany CONFIG"                 whole module
    "-- brittany-next-binding CONFIG"    next binding
    "-- brittany-disable-next-binding"   next binding
    "-- brittany @ myExampleFunc CONFIG" `myExampleFunc`
    ~~~~

    multiline-comments are supported too, although
    the specification must still be a single line. E.g.

    > "{- brittany --columns 50 -}"

    CONFIG is either:

    1) one or more flags in the form of what brittany accepts
       on the commandline, e.g. "--columns 50", or
    2) one or more specifications in the form of what brittany
       accepts in its config files for the layouting config
       (a one-line yaml document), e.g. "{ lconfig_cols: 50 }"
* Implement `IndentPolicyMultiple` (thanks to Bryan Richter @chreekat)
    Restrict indentation amounts to `n * indentAmount`
* Implement `--obfuscate` that replaces non-keyword identifiers with random
  names
* Do not write files unless there are changes (don't update modtime)
  (`--write-mode=inplace`) (#93)
* Bugfixes:
    - Fix empty function constraints (`() => IO ()`) (#133)
    - Fix overflowing columns caused by aligning with surrounding lines
      for certain complex cases
    - Implement hacky workaround for `type instance`s (`-XTypeFamilies`) (#89)
* Layouting changes:
    - On default settings, allow single-line module header
      `module MyModule where` when no exports
    - Fix one case of non-optimal layouting for if-then-else
    - Allow same-line let binding inside do-notation with
      `IndentPolicyLeft/Multiple` and `indentAmount>=4`

## 0.10.0.0 -- March 2018

* Implement module/exports/imports layouting (thanks to sniperrifle2004)
* Expose config paths/parsing functions (thanks to Alexey Raga)
* Bugfixes:
    - Fix layouting of `NOINLINE` pragma
    - Fix ticked type operator (e.g. `':-`) losing tick (#125)
    - Fix alignment issue with cases involving operators (#65)
    - Fix comments in tuples being dropped (#37)
    - Fix comment placements with let-in (#110)
* Layouting changes:
    - Align arguments only if it is the same function being called (#128)
    - Do not use single-line layout when infix operator expression contains
      comments (#111)
* New layouting config items:
    - `lconfig_importColumn`/`--import-col`: column for import items
    - `lconfig_importAsColumn`/`--import-as-col`: column for the "as" name of
      a module
    - `lconfig_reformatModulePreamble`: controls module/export/import layouting
      (default True)
    - `lconfig_allowSingleLineExportList`: permit one-line module header, e.g.
      `module Main (main)` (default False)

## 0.9.0.1  -- February 2018

* Support `TupleSections` (thanks to Matthew Piziak)
* Bugfixes:
    - Fix Shebang handling with stdin input (#92)
    - Fix bug that effectively deleted strict/lazy matches (BangPatterns) (#116)
    - Fix infix operator whitespace bug (#101, #114)
    - Fix help command output and its layouting (#103)
    - Fix crash when config dir does not exist yet (#115)
* Layouting changes:
    - no space after opening non-tuple parenthesis even for multi-line case
    - use spaces around infix operators (applies to sections and in pattern
      matches)
    - Let-in is layouted more flexibly in fewer lines, if possible
      (thanks to Evan Borden)

## 0.9.0.0  -- December 2017

* Change default global config path (use XDG spec)
    Existing config should still be respected, so this should not break
    compatibility
* Support per-project config
* ! Slight rework of the commandline interface:
    - Support multiple inputs and outputs
    - Support inplace-transformation for multiple files via
      `--write-mode=inplace`
* Implement `IndentPolicyLeft` - the indentation mode that never adds more
  than the base indentation for nested parts (no hanging indentation)

    (thanks to Evan Borden)
* Fix bug that manifested in bad output for (top-level) template haskell splices
* Extension support:
    - RecordWildCards
    - RecursiveDo (was only partially supported previously)
* Layouting Bugfixes:
    - Properly reproduce parentheses around kind signatures
    - Fix issue around promoted lists
      (example good: `'[ 'True]` bad: `'['True]`)
    - Trim text from exactprint used as workaround for unknown nodes
      (unsupported extension workaround)
* Layouting changes
    - Insert spaces around operator in sections

## 0.8.0.3  -- September 2017

* Support for ghc-8.2.1
* Bugfixes:
    - Fix quadratic performance issue
    - Fix special "where" indentation with indentAmount /= 2
    - Fix negative literals in patterns
    - Support type applications
* Accept `-h` for `--help` and improve help layouting (via butcher-1.1.0.2)
* Add continuous integration via travis (cabal, cabal-new, stack)
  (brittle due compilation time limit)
* Reduce compilation memory usage a bit

## 0.8.0.2  -- August 2017

* Add library interface, to be used by `haskell-ide-engine`.
* Publish to hackage.

## 0.8.0.1  -- May 2017

* Document the high-level design of the program
* Improve layouting for many different cases, too many to list here. Brittany
  still does only reformat top-level type signatures and bindings.
* Publish all dependencies on hackage; `ghc-exactprint ` adaptions got merged
  upstream as well.
* Reduce the aggressiveness of horizontal alignment; this is configurable
  via the `lconfig_alignmentLimit` and `lconfig_alignmentBreakOnMultiline`
  values (config file only for now).
* (!) Breaking change to the config file format: The keys previously contained
  underscore (e.g. `_econf_Werror`) but do not anymore (`econf_Werror`).
  Add config version; also
* Move config value `conf_errorHandling.econf_CPPMode` to
  `conf_preprocessor.ppconf_CPPMode`.
* Cope with unhandled syntactical constructs more gracefully by falling back
  on the ghc-exactprint output; Brittany simply won't touch certain
  subexpressions instead of aborting. This is further configurable via the
  `econf_omit_output_valid_check` config value.
* Due to improvements to the `butcher` library: Accept `--key=value` on
  commandline (only `--key value` was supported previously).
* Improve testsuite setup: The `tests.blt` file contains many different
  testcases that allow quick addition - feel free to report bugs directly
  by making PRs with additions to that file.
* Release under the terms of the AGPLv3

## 0.7.1.0  -- 2016-09-06

* Support stack
* Fix --ghc-options handling
* Add commandline param to allow shortcut `brittany Foo.hs`
  meaning `brittany -i Foo.hs`

## 0.7.0.0  -- 2016-09-04

* First official alpha release
* Fix commandline flag parsing
* Implement/Improve horizontal aligning
* Various minor fixes and layouting improvements

## 0.6.0.0  -- 2016-08-12

* Add check that output is syntactically valid
* (!) Change config format, breaking previous configs
* Various layouting additions/imporements
* Various minor fixes

## 0.5.0.0  -- 2016-08-08

* Support --ghc-options
* Support user and local config files: Local config file is not mandatory
  anymore.

## 0.4.0.0  -- 2016-08-06

* Make comment handling a bit more clever
* Various layouting additions/imporements

## 0.3.0.0  -- 2016-08-04

* Various layouting additions/imporements

## 0.2.0.0  -- 2016-07-30

* Basic and partial implementation for
  expression/decl/statement/pattern layouting
* Prevent exponential behaviour using manual stablenames

## 0.1.0.0  -- 2016-06-05

* First working code for type signature layouting
