This change adds an ad-hoc parser for module pragmas to handle
OPTIONS_* pragmas. I did not want to use an existing tokenizer,
because I felt like tokenizing and pretty printing the GHC options
are more prone to error without providing much benefit.
The issue was simply indenting the closing `|]` one more level. However
there were a few more issues around them, which led me to a slightly
bigger refactor.
main reason is that, all `p_*Decl` functions used to print a trailing
newline. This makes sense for top-level constructs, however it was making
printing something like `[d|data Foo = Foo|]` impossible.
In this commit, I removed trailing newlines from individual printers
and gave that responsibility to `p_hsDecls`, and inserted an additional
trailing newline when printing modules.
While doing that, I noticed a few bugs/inconsistencies, and I had to
fix them in the process:
* Warning pragmas used to not print a trailing newline, so they were
always attached to the next expression. I made it more like the other
pragmas, where we attach it to a neighbour function if the name matches,
otherwise we separate it with a newline.
* We used to print single line GADT's and single line `do` notations
using multiple lines, which breaks idempotency. I tweak them to prefer
single line layout if possible (sometimes it is not possible because
of the semicolon syntax).
Function id obtained through pattern matching on ‘FunBind’ should not be
used to print the actual equations because the different ‘RdrNames’ used in
the equations may have different “decorations” (such as backticks and
paretheses) associated with them. It is necessary to use per-equation names
obtained from ‘m_ctxt’ of ‘Match’.
This puts out the fire, but I'm not fully content with the solution. I also
do not understand why it fails in the original issue but succeeds for e.g.:
foo = do
1
+
2
Goals:
* Make the set of combinators clearer and smaller.
* Solve a number of issues, such as those about parse failures related to
patterns.
* Solve the bug from #244.
The idea is very simple, we stop doing this
( foo
, bar
)
and start doing this
( foo,
bar
)
* We switch to trailing commas which solves the indentation issues for
patterns automatically.
* The new general ‘sep’ combinator finally is clear enough, and all the old
zoo of ‘velt’ and ‘velt'’ and ‘sepWith’, etc. which was confusing and
overlapping goes away.