[Haskell-cafe] [ANN] brittany - haskell source code formatting tool - experimental/alpha

lennart spitzner lsp at informatik.uni-kiel.de
Sun Sep 4 15:27:21 UTC 2016


I am happy to announce a first alpha release of brittany (,
a haskell source code formatting tool based on ghc-exactprint [2]
(and thus ghc's parser).


Two small feature cases that brittany would produce/leave unmodified:

> -- Newlines are used sparingly: Only after "do" and when the
> -- `liftBaseOpDiscard` application would lead to overflowing 80 columns.
> main :: IO ()
> main = do
>   pool <- createPostgresqlPool (toS databaseConnectionString) 10
>   initiate $ \chan -> forever $ do
>     flip runDbConn pool $ do
>       makeSureQueueIsFull chan
>       void $ liftBaseOpDiscard (consumeMsgs chan responseQueue Ack)
>                                (uncurry processMsg)
>     threadDelay 1000000

> -- Alignment of patterns
> go []                 ""     = True
> go [WildCard        ] ""     = True
> go (WildCard   :rest) (c:cs) = go rest (c : cs) || go (WildCard : rest) cs
> go (Union globs:rest) cs     = any (\glob -> go (glob ++ rest) cs) globs
> go []                 (_:_)  = False
> go (_:_)              ""     = False

Yet this is an alpha release, for the following reasons:

- Brittany currently only transforms top-level type signatures and (function)
- Not all syntactical constructs (even of plain 2010 haskell) are understood.
  All common constructs should work, but "common" is purely subjective.
- Not all (syntactic) extensions are supported, either.
- Needs more testing.
  (And less than a hundred automated testcases is not very much to explore
  every syntactic corner of haskell.)

On the other hand

- I have started using the tool successfully, albeit selectively.
- There are checks in place that detect
  1) if output is not valid haskell or
  2) if source comments are not transcribed to the output.
  That is, running into non-handled cases should lead to error messages that
  are harmless, not into any silent it-overwrote-my-code-with-garbage.

*How to build?*

Brittany requires ghc-8. See https://github.com/lspitzner/brittany#building

A hackage release is not planned yet.

*Brittany's formatting style*

Currently brittany does _not_ give the user many choices. A few flags exist,
most prominently to change the indentation (default 2) or the columns
(default 80). I am open to suggestions of how to improve the style, but trying
to make everyone happy is not a fulfilling goal for me.


The implementation and its core ideas are not documented. The core algorithm
in theory has linear complexity in input size; the implementation probably is
quadratic dues to some misuses of plain lists or other such implementation
details. Providing at least a high-level overview is on my to-do list.

[1] https://github.com/lspitzner/brittany
[2] https://hackage.haskell.org/package/ghc-exactprint

-- lennart

More information about the Haskell-Cafe mailing list