1
1
mirror of https://github.com/google/ormolu.git synced 2024-09-11 08:05:24 +03:00

Preserve blank lines in ‘let’ and ‘where’ bindings

This commit is contained in:
Mark Karpov 2020-06-12 14:02:26 +02:00
parent 033bb16032
commit a877785709
9 changed files with 56 additions and 24 deletions

View File

@ -19,6 +19,9 @@
* Fixed rendering of function arguments in multiline layout. [Issue
609](https://github.com/tweag/ormolu/issues/609).
* Blank lines between definitions in `let` and `while` bindings are now
preserved. [Issue 554](https://github.com/tweag/ormolu/issues/554).
## Ormolu 0.1.0.0
* Fixed rendering of type signatures concerning several identifiers. [Issue

View File

@ -0,0 +1,6 @@
foo =
let x = 10
y = 11
z = 12
in x + y + z

View File

@ -0,0 +1,9 @@
foo =
let
x = 10
y = 11
z = 12
in x + y + z

View File

@ -0,0 +1,6 @@
foo = x + y + z
where
x = 10
y = 11
z = 12

View File

@ -0,0 +1,7 @@
foo = x + y + z
where
x = 10
y = 11
z = 12

View File

@ -5,7 +5,7 @@ Formatting is not idempotent:
Please, consider reporting the bug.
Formatting is not idempotent:
src/full/Agda/Syntax/Translation/InternalToAbstract.hs<rendered>:750:4
src/full/Agda/Syntax/Translation/InternalToAbstract.hs<rendered>:769:4
before: " nes\n\n "
after: " nes\n\n -- Andreas"
Please, consider reporting the bug.

View File

@ -1,5 +1,5 @@
Formatting is not idempotent:
src/InteractiveUI.hs<rendered>:3710:33
src/InteractiveUI.hs<rendered>:3757:33
before: "text \"Try\" <+> doWha"
after: "text \"Try\"\n "
Please, consider reporting the bug.

View File

@ -1,5 +1,5 @@
Formatting is not idempotent:
src/IDE/Pane/Modules.hs<rendered>:1187:7
src/IDE/Pane/Modules.hs<rendered>:1189:7
before: "cr\n -- show"
after: "cr\n in -- show"
Please, consider reporting the bug.

View File

@ -353,7 +353,14 @@ p_hsCmdTop = \case
HsCmdTop NoExtField cmd -> located cmd p_hsCmd
XCmdTop x -> noExtCon x
withSpacing :: Data a => (a -> R ()) -> Located a -> R ()
-- | Render an expression preserving blank lines between such consecutive
-- expressions found in the original source code.
withSpacing ::
-- | Rendering function
(a -> R ()) ->
-- | Entity to render
Located a ->
R ()
withSpacing f l = located l $ \x -> do
case getLoc l of
UnhelpfulSpan _ -> f x
@ -464,30 +471,24 @@ gatherStmtBlock (XParStmtBlock x) = noExtCon x
p_hsLocalBinds :: HsLocalBindsLR GhcPs GhcPs -> R ()
p_hsLocalBinds = \case
HsValBinds NoExtField (ValBinds NoExtField bag lsigs) -> do
let ssStart =
either
(srcSpanStart . getLoc)
(srcSpanStart . getLoc)
items =
(Left <$> bagToList bag) ++ (Right <$> lsigs)
p_item (Left x) = located x p_valDecl
p_item (Right x) = located x p_sigDecl
-- When in a single-line layout, there is a chance that the inner
-- elements will also contain semicolons and they will confuse the
-- parser. so we request braces around every element except the last.
br <- layoutToBraces <$> getLayout
sitcc $
sepSemi
( \(p, i) ->
( case p of
SinglePos -> id
FirstPos -> br
MiddlePos -> br
LastPos -> id
)
(p_item i)
)
(attachRelativePos $ sortOn ssStart items)
let items =
let injectLeft (L l x) = L l (Left x)
injectRight (L l x) = L l (Right x)
in (injectLeft <$> bagToList bag) ++ (injectRight <$> lsigs)
positionToBracing = \case
SinglePos -> id
FirstPos -> br
MiddlePos -> br
LastPos -> id
p_item' (p, item) =
positionToBracing p $
withSpacing (either p_valDecl p_sigDecl) item
binds = sortOn (srcSpanStart . getLoc) items
sitcc $ sepSemi p_item' (attachRelativePos binds)
HsValBinds NoExtField _ -> notImplemented "HsValBinds"
HsIPBinds NoExtField (IPBinds NoExtField xs) ->
-- Second argument of IPBind is always Left before type-checking.