Implement HsLet/ExprWithTySig/NPat

pull/1/head
Lennart Spitzner 2016-07-31 14:26:03 +02:00
parent beaf121b66
commit f96dceb74b
3 changed files with 71 additions and 6 deletions

View File

@ -5,6 +5,7 @@ module Language.Haskell.Brittany.Layouters.Expr
, litBriDoc
, isExpressionTypeHeadPar
, isExpressionTypeHeadPar'
, overLitValBriDoc
)
where
@ -26,6 +27,7 @@ import BasicTypes
import Language.Haskell.Brittany.Layouters.Pattern
import Language.Haskell.Brittany.Layouters.Decl
import Language.Haskell.Brittany.Layouters.Stmt
import Language.Haskell.Brittany.Layouters.Type
@ -294,9 +296,62 @@ layoutExpr lexpr@(L _ expr) = docWrapNode lexpr $ case expr of
docAddBaseY BrIndentRegular $ docPar
(docLit $ Text.pack "if")
(layoutPatternBindFinal binderDoc Nothing clauseDocs Nothing)
HsLet{} -> do
-- TODO
briDocByExact lexpr
HsLet binds exp1 -> do
expDoc1 <- docSharedWrapper layoutExpr exp1
mBindDocs <- layoutLocalBinds binds
case mBindDocs of
Just [bindDoc] -> docAlt
[ docSeq
[ appSep $ docLit $ Text.pack "let"
, appSep $ docForceSingleline $ return bindDoc
, appSep $ docLit $ Text.pack "in"
, docForceSingleline $ expDoc1
]
, docLines
[ docSeq
[ appSep $ docLit $ Text.pack "let"
, docSetBaseY $ docSetIndentLevel $ return bindDoc
]
, docSeq
[ appSep $ docLit $ Text.pack "in "
, docSetBaseY $ docSetIndentLevel $ expDoc1
]
]
, docLines
[ docAddBaseY BrIndentRegular
$ docPar
(appSep $ docLit $ Text.pack "let")
(docSetIndentLevel $ return bindDoc)
, docAddBaseY BrIndentRegular
$ docPar
(appSep $ docLit $ Text.pack "in")
(docSetIndentLevel $ expDoc1)
]
]
Just bindDocs@(_:_) -> docAlt
[ docLines
[ docSeq
[ appSep $ docLit $ Text.pack "let"
, docSetBaseY $ docSetIndentLevel $ docLines $ return <$> bindDocs
]
, docSeq
[ appSep $ docLit $ Text.pack "in "
, docSetBaseY $ docSetIndentLevel $ expDoc1
]
]
, docLines
[ docAddBaseY BrIndentRegular
$ docPar
(appSep $ docLit $ Text.pack "let")
(docSetIndentLevel $ docLines $ return <$> bindDocs)
, docAddBaseY BrIndentRegular
$ docPar
(appSep $ docLit $ Text.pack "in")
(docSetIndentLevel $ expDoc1)
]
]
_ -> docSeq [appSep $ docLit $ Text.pack "let in", expDoc1]
-- docSeq [appSep $ docLit "let in", expDoc1]
HsDo DoExpr (L _ stmts) _ -> do
stmtDocs <- docSharedWrapper layoutStmt `mapM` stmts
docAddBaseY BrIndentRegular
@ -449,9 +504,14 @@ layoutExpr lexpr@(L _ expr) = docWrapNode lexpr $ case expr of
lineN = docLit $ Text.pack "}"
in [line1] ++ lineR ++ [lineN])
]
ExprWithTySig{} -> do
-- TODO
briDocByExact lexpr
ExprWithTySig exp1 (HsIB _ (HsWC _ _ typ1)) -> do
expDoc <- docSharedWrapper layoutExpr exp1
typDoc <- docSharedWrapper layoutType typ1
docSeq
[ appSep expDoc
, appSep $ docLit $ Text.pack "::"
, typDoc
]
ExprWithTySigOut{} -> do
-- TODO
briDocByExact lexpr

View File

@ -5,6 +5,7 @@ module Language.Haskell.Brittany.Layouters.Expr
, litBriDoc
, isExpressionTypeHeadPar
, isExpressionTypeHeadPar'
, overLitValBriDoc
)
where
@ -31,3 +32,5 @@ litBriDoc :: HsLit -> BriDocFInt
isExpressionTypeHeadPar :: LHsExpr RdrName -> Bool
isExpressionTypeHeadPar' :: LHsExpr RdrName -> Bool
overLitValBriDoc :: OverLitVal -> BriDocFInt

View File

@ -107,6 +107,8 @@ layoutPat lpat@(L _ pat) = docWrapNode lpat $ case pat of
BangPat pat1 -> do
patDoc <- docSharedWrapper layoutPat pat1
docSeq [docLit $ Text.pack "!", patDoc]
NPat llit@(L _ (OverLit olit _ _ _)) _ _ _ -> do
docWrapNode llit $ allocateNode $ overLitValBriDoc olit
-- #if MIN_VERSION_ghc(8,0,0)
-- VarPat n -> return $ stringLayouter lpat $ lrdrNameToText n