697 lines
24 KiB
Haskell
697 lines
24 KiB
Haskell
{-# LANGUAGE DataKinds #-}
|
|
|
|
module Language.Haskell.Brittany.Layouters.Expr
|
|
( layoutExpr
|
|
, litBriDoc
|
|
, overLitValBriDoc
|
|
)
|
|
where
|
|
|
|
|
|
|
|
#include "prelude.inc"
|
|
|
|
import Language.Haskell.Brittany.Types
|
|
import Language.Haskell.Brittany.LayoutBasics
|
|
|
|
import RdrName ( RdrName(..) )
|
|
import GHC ( runGhc, GenLocated(L), moduleNameString )
|
|
import SrcLoc ( SrcSpan )
|
|
import HsSyn
|
|
import Name
|
|
import qualified FastString
|
|
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
|
|
|
|
|
|
|
|
layoutExpr :: ToBriDoc HsExpr
|
|
layoutExpr lexpr@(L _ expr) = docWrapNode lexpr $ case expr of
|
|
HsVar vname -> do
|
|
docLit =<< lrdrNameToTextAnn vname
|
|
HsUnboundVar var -> case var of
|
|
OutOfScope oname _ -> docLit $ Text.pack $ occNameString oname
|
|
TrueExprHole oname -> docLit $ Text.pack $ occNameString oname
|
|
HsRecFld{} -> do
|
|
-- TODO
|
|
briDocByExact lexpr
|
|
HsOverLabel{} -> do
|
|
-- TODO
|
|
briDocByExact lexpr
|
|
HsIPVar{} -> do
|
|
-- TODO
|
|
briDocByExact lexpr
|
|
HsOverLit (OverLit olit _ _ _) -> do
|
|
allocateNode $ overLitValBriDoc olit
|
|
HsLit lit -> do
|
|
allocateNode $ litBriDoc lit
|
|
HsLam (MG (L _ [lmatch@(L _ (Match _ pats _ (GRHSs [lgrhs@(L _ (GRHS [] body))] (L _ EmptyLocalBinds))))]) _ _ _) -> do
|
|
patDocs <- pats `forM` docSharedWrapper layoutPat
|
|
bodyDoc <- docAddBaseY BrIndentRegular <$> docSharedWrapper layoutExpr body
|
|
let funcPatternPartLine =
|
|
docCols ColCasePattern
|
|
$ (patDocs <&> (\p -> docSeq [docForceSingleline p, docSeparator]))
|
|
docAlt
|
|
[ docSeq
|
|
[ docLit $ Text.pack "\\"
|
|
, docWrapNode lmatch $ docForceSingleline funcPatternPartLine
|
|
, appSep $ docLit $ Text.pack "->"
|
|
, docWrapNode lgrhs $ docForceParSpacing bodyDoc
|
|
]
|
|
, docAddBaseY BrIndentRegular
|
|
$ docPar
|
|
(docSeq
|
|
[ docLit $ Text.pack "\\"
|
|
, docWrapNode lmatch $ appSep $ docForceSingleline funcPatternPartLine
|
|
, docLit $ Text.pack "->"
|
|
])
|
|
(docWrapNode lgrhs $ docNonBottomSpacing bodyDoc)
|
|
]
|
|
HsLam{} ->
|
|
unknownNodeError "HsLam too complex" lexpr
|
|
HsLamCase _ (MG lmatches@(L _ matches) _ _ _) -> do
|
|
binderDoc <- docLit $ Text.pack "->"
|
|
funcPatDocs <- docWrapNode lmatches $ layoutPatternBind Nothing binderDoc `mapM` matches
|
|
docSetParSpacing $ docAddBaseY BrIndentRegular $ docPar
|
|
(docLit $ Text.pack "\\case")
|
|
(docSetIndentLevel $ docNonBottomSpacing $ docLines $ return <$> funcPatDocs)
|
|
HsApp exp1@(L _ HsApp{}) exp2 -> do
|
|
let gather :: [LHsExpr RdrName] -> LHsExpr RdrName -> (LHsExpr RdrName, [LHsExpr RdrName])
|
|
gather list = \case
|
|
(L _ (HsApp l r)) -> gather (r:list) l
|
|
x -> (x, list)
|
|
let (headE, paramEs) = gather [exp2] exp1
|
|
headDoc <- docSharedWrapper layoutExpr headE
|
|
paramDocs <- docSharedWrapper layoutExpr `mapM` paramEs
|
|
docAlt
|
|
[ docCols ColApp
|
|
$ appSep (docForceSingleline headDoc)
|
|
: spacifyDocs (docForceSingleline <$> paramDocs)
|
|
, docSeq
|
|
[ appSep (docForceSingleline headDoc)
|
|
, docSetBaseY
|
|
$ docAddBaseY BrIndentRegular
|
|
$ docLines
|
|
$ paramDocs
|
|
]
|
|
, docSetParSpacing
|
|
$ docAddBaseY BrIndentRegular
|
|
$ docPar
|
|
(docForceSingleline headDoc)
|
|
( docNonBottomSpacing
|
|
$ docLines paramDocs
|
|
)
|
|
, docAddBaseY BrIndentRegular
|
|
$ docPar
|
|
headDoc
|
|
( docNonBottomSpacing
|
|
$ docLines paramDocs
|
|
)
|
|
]
|
|
HsApp exp1 exp2 -> do
|
|
-- TODO: if expDoc1 is some literal, we may want to create a docCols here.
|
|
expDoc1 <- docSharedWrapper layoutExpr exp1
|
|
expDoc2 <- docSharedWrapper layoutExpr exp2
|
|
docAlt
|
|
[ docSeq [appSep $ docForceSingleline expDoc1, docForceSingleline expDoc2]
|
|
, docSetParSpacing
|
|
$ docAddBaseY BrIndentRegular
|
|
$ docPar
|
|
(docForceSingleline expDoc1)
|
|
expDoc2
|
|
, docAddBaseY BrIndentRegular
|
|
$ docPar
|
|
expDoc1
|
|
expDoc2
|
|
]
|
|
HsAppType{} -> do
|
|
-- TODO
|
|
briDocByExact lexpr
|
|
HsAppTypeOut{} -> do
|
|
-- TODO
|
|
briDocByExact lexpr
|
|
OpApp expLeft@(L _ OpApp{}) expOp _ expRight -> do
|
|
let gather :: [(LHsExpr RdrName, LHsExpr RdrName)] -> LHsExpr RdrName -> (LHsExpr RdrName, [(LHsExpr RdrName, LHsExpr RdrName)])
|
|
gather opExprList = \case
|
|
(L _ (OpApp l1 op1 _ r1)) -> gather ((op1, r1): opExprList) l1
|
|
final -> (final, opExprList)
|
|
(leftOperand, appList) = gather [] expLeft
|
|
leftOperandDoc <- docSharedWrapper layoutExpr leftOperand
|
|
appListDocs <- appList `forM` \(x,y) -> [ (xD, yD)
|
|
| xD <- docSharedWrapper layoutExpr x
|
|
, yD <- docSharedWrapper layoutExpr y
|
|
]
|
|
opLastDoc <- docSharedWrapper layoutExpr expOp
|
|
expLastDoc <- docSharedWrapper layoutExpr expRight
|
|
docAlt
|
|
[ docSeq
|
|
[ appSep $ docForceSingleline leftOperandDoc
|
|
, docSeq
|
|
$ (appListDocs <&> \(od, ed) -> docSeq
|
|
[ appSep $ docForceSingleline od
|
|
, appSep $ docForceSingleline ed
|
|
]
|
|
)
|
|
, appSep $ docForceSingleline opLastDoc
|
|
, docForceParSpacing expLastDoc
|
|
]
|
|
-- this case rather leads to some unfortunate layouting than to anything
|
|
-- useful; disabling for now. (it interfers with cols stuff.)
|
|
-- , docSetBaseY
|
|
-- $ docPar
|
|
-- leftOperandDoc
|
|
-- ( docLines
|
|
-- $ (appListDocs <&> \(od, ed) -> docCols ColOpPrefix [appSep od, docSetBaseY ed])
|
|
-- ++ [docCols ColOpPrefix [appSep opLastDoc, docSetBaseY expLastDoc]]
|
|
-- )
|
|
, docAddBaseY BrIndentRegular
|
|
$ docPar
|
|
leftOperandDoc
|
|
( docLines
|
|
$ (appListDocs <&> \(od, ed) -> docCols ColOpPrefix [appSep od, docSetBaseY ed])
|
|
++ [docCols ColOpPrefix [appSep opLastDoc, docSetBaseY expLastDoc]]
|
|
)
|
|
]
|
|
OpApp expLeft expOp _ expRight -> do
|
|
expDocLeft <- docSharedWrapper layoutExpr expLeft
|
|
expDocOp <- docSharedWrapper layoutExpr expOp
|
|
expDocRight <- docSharedWrapper layoutExpr expRight
|
|
docAlt
|
|
$ [ -- one-line
|
|
docSeq
|
|
[ appSep $ docForceSingleline expDocLeft
|
|
, appSep $ docForceSingleline expDocOp
|
|
, docForceSingleline expDocRight
|
|
]
|
|
, -- line + freely indented block for right expression
|
|
docSeq
|
|
[ appSep $ docForceSingleline expDocLeft
|
|
, appSep $ docForceSingleline expDocOp
|
|
, docSetBaseY $ docAddBaseY BrIndentRegular expDocRight
|
|
]
|
|
, -- two-line
|
|
docAddBaseY BrIndentRegular
|
|
$ docPar
|
|
expDocLeft
|
|
( docForceSingleline
|
|
$ docCols ColOpPrefix [appSep $ expDocOp, docSetBaseY expDocRight]
|
|
)
|
|
, -- one-line + par
|
|
docSeq
|
|
[ appSep $ docForceSingleline expDocLeft
|
|
, appSep $ docForceSingleline expDocOp
|
|
, docForceParSpacing expDocRight
|
|
]
|
|
, -- more lines
|
|
docAddBaseY BrIndentRegular
|
|
$ docPar
|
|
expDocLeft
|
|
(docCols ColOpPrefix [appSep $ expDocOp, docSetBaseY expDocRight])
|
|
]
|
|
NegApp{} -> do
|
|
-- TODO
|
|
briDocByExact lexpr
|
|
HsPar innerExp -> do
|
|
innerExpDoc <- docSharedWrapper layoutExpr innerExp
|
|
docAlt
|
|
[ docSeq
|
|
[ docLit $ Text.pack "("
|
|
, docForceSingleline innerExpDoc
|
|
, docLit $ Text.pack ")"
|
|
]
|
|
, docSetBaseY $ docLines
|
|
[ docCols ColOpPrefix
|
|
[ docParenLSep
|
|
, docAddBaseY (BrIndentSpecial 2) innerExpDoc
|
|
]
|
|
, docLit $ Text.pack ")"
|
|
]
|
|
]
|
|
SectionL left op -> do -- TODO: add to testsuite
|
|
leftDoc <- docSharedWrapper layoutExpr left
|
|
opDoc <- docSharedWrapper layoutExpr op
|
|
docSeq [leftDoc, opDoc]
|
|
SectionR op right -> do -- TODO: add to testsuite
|
|
opDoc <- docSharedWrapper layoutExpr op
|
|
rightDoc <- docSharedWrapper layoutExpr right
|
|
docSeq [opDoc, rightDoc]
|
|
ExplicitTuple args boxity
|
|
| Just argExprs <- args `forM` (\case (L _ (Present e)) -> Just e; _ -> Nothing) -> do
|
|
argDocs <- docSharedWrapper layoutExpr `mapM` argExprs
|
|
case boxity of
|
|
Boxed -> docAlt
|
|
[ docSeq
|
|
$ [ docLit $ Text.pack "(" ]
|
|
++ List.intersperse (appSep $ docLit $ Text.pack ",") argDocs
|
|
++ [ docLit $ Text.pack ")"]
|
|
-- TODO
|
|
]
|
|
Unboxed -> docAlt
|
|
[ docSeq
|
|
$ [ docLit $ Text.pack "(#" ]
|
|
++ List.intersperse (appSep $ docLit $ Text.pack ",") argDocs
|
|
++ [ docLit $ Text.pack "#)"]
|
|
-- TODO
|
|
]
|
|
ExplicitTuple{} ->
|
|
unknownNodeError "ExplicitTuple|.." lexpr
|
|
HsCase cExp (MG lmatches@(L _ matches) _ _ _) -> do
|
|
cExpDoc <- docSharedWrapper layoutExpr cExp
|
|
binderDoc <- docLit $ Text.pack "->"
|
|
funcPatDocs <- docWrapNode lmatches $ layoutPatternBind Nothing binderDoc `mapM` matches
|
|
docAlt
|
|
[ docSetParSpacing
|
|
$ docAddBaseY BrIndentRegular
|
|
$ docPar
|
|
( docSeq
|
|
[ appSep $ docLit $ Text.pack "case"
|
|
, appSep $ docForceSingleline cExpDoc
|
|
, docLit $ Text.pack "of"
|
|
])
|
|
(docSetIndentLevel $ docNonBottomSpacing $ docLines $ return <$> funcPatDocs)
|
|
, docPar
|
|
( docAddBaseY BrIndentRegular
|
|
$ docPar (docLit $ Text.pack "case") cExpDoc
|
|
)
|
|
( docAddBaseY BrIndentRegular
|
|
$ docPar (docLit $ Text.pack "of")
|
|
(docSetIndentLevel $ docNonBottomSpacing $ docLines $ return <$> funcPatDocs)
|
|
)
|
|
]
|
|
HsIf _ ifExpr thenExpr elseExpr -> do
|
|
ifExprDoc <- docSharedWrapper layoutExpr ifExpr
|
|
thenExprDoc <- docSharedWrapper layoutExpr thenExpr
|
|
elseExprDoc <- docSharedWrapper layoutExpr elseExpr
|
|
docAlt
|
|
[ docSeq
|
|
[ appSep $ docLit $ Text.pack "if"
|
|
, appSep $ docForceSingleline ifExprDoc
|
|
, appSep $ docLit $ Text.pack "then"
|
|
, appSep $ docForceSingleline thenExprDoc
|
|
, appSep $ docLit $ Text.pack "else"
|
|
, docForceSingleline elseExprDoc
|
|
]
|
|
, docSetParSpacing
|
|
$ docAddBaseY BrIndentRegular
|
|
$ docPar
|
|
( docAddBaseY (BrIndentSpecial 3)
|
|
$ docSeq [appSep $ docLit $ Text.pack "if", docForceSingleline ifExprDoc])
|
|
(docLines
|
|
[ docAddBaseY BrIndentRegular
|
|
$ docAlt
|
|
[ docSeq [appSep $ docLit $ Text.pack "then", docForceParSpacing thenExprDoc]
|
|
, docAddBaseY BrIndentRegular
|
|
$ docPar (docLit $ Text.pack "then") thenExprDoc
|
|
]
|
|
, docAddBaseY BrIndentRegular
|
|
$ docAlt
|
|
[ docSeq [appSep $ docLit $ Text.pack "else", docForceParSpacing elseExprDoc]
|
|
, docAddBaseY BrIndentRegular
|
|
$ docPar (docLit $ Text.pack "else") elseExprDoc
|
|
]
|
|
])
|
|
, docAddBaseY BrIndentRegular
|
|
$ docPar
|
|
( docAddBaseY (BrIndentSpecial 3)
|
|
$ docSeq [appSep $ docLit $ Text.pack "if", ifExprDoc])
|
|
(docLines
|
|
[ docAddBaseY BrIndentRegular
|
|
$ docAlt
|
|
[ docSeq [appSep $ docLit $ Text.pack "then", docForceParSpacing thenExprDoc]
|
|
, docAddBaseY BrIndentRegular
|
|
$ docPar (docLit $ Text.pack "then") thenExprDoc
|
|
]
|
|
, docAddBaseY BrIndentRegular
|
|
$ docAlt
|
|
[ docSeq [appSep $ docLit $ Text.pack "else", docForceParSpacing elseExprDoc]
|
|
, docAddBaseY BrIndentRegular
|
|
$ docPar (docLit $ Text.pack "else") elseExprDoc
|
|
]
|
|
])
|
|
, docLines
|
|
[ docAddBaseY (BrIndentSpecial 3)
|
|
$ docSeq [appSep $ docLit $ Text.pack "if", ifExprDoc]
|
|
, docAddBaseY BrIndentRegular
|
|
$ docPar (docLit $ Text.pack "then") thenExprDoc
|
|
, docAddBaseY BrIndentRegular
|
|
$ docPar (docLit $ Text.pack "else") elseExprDoc
|
|
]
|
|
]
|
|
HsMultiIf _ cases -> do
|
|
clauseDocs <- cases `forM` layoutGrhs
|
|
binderDoc <- docLit $ Text.pack " ->"
|
|
docAddBaseY BrIndentRegular $ docPar
|
|
(docLit $ Text.pack "if")
|
|
(layoutPatternBindFinal binderDoc Nothing clauseDocs Nothing)
|
|
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"
|
|
, docSetIndentLevel $ return bindDoc
|
|
]
|
|
, docSeq
|
|
[ appSep $ docLit $ Text.pack "in "
|
|
, 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"
|
|
, docSetIndentLevel $ docLines $ return <$> bindDocs
|
|
]
|
|
, docSeq
|
|
[ appSep $ docLit $ Text.pack "in "
|
|
, 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
|
|
docSetParSpacing
|
|
$ docAddBaseY BrIndentRegular
|
|
$ docPar
|
|
(docLit $ Text.pack "do")
|
|
(docSetIndentLevel $ docNonBottomSpacing $ docLines stmtDocs)
|
|
HsDo x (L _ stmts) _ | case x of { ListComp -> True
|
|
; MonadComp -> True
|
|
; _ -> False } -> do
|
|
stmtDocs <- docSharedWrapper layoutStmt `mapM` stmts
|
|
docAlt
|
|
[ docSeq
|
|
[ appSep $ docLit $ Text.pack "["
|
|
, appSep $ docForceSingleline $ List.last stmtDocs
|
|
, appSep $ docLit $ Text.pack "|"
|
|
, docSeq $ List.intersperse docCommaSep
|
|
$ fmap docForceSingleline $ List.init stmtDocs
|
|
, docLit $ Text.pack " ]"
|
|
]
|
|
, let
|
|
start = docCols ColListComp
|
|
[appSep $ docLit $ Text.pack "[", List.last stmtDocs]
|
|
(s1:sM) = List.init stmtDocs
|
|
line1 = docCols ColListComp
|
|
[appSep $ docLit $ Text.pack "|", s1]
|
|
lineM = sM <&> \d ->
|
|
docCols ColListComp [docCommaSep, d]
|
|
end = docLit $ Text.pack "]"
|
|
in docSetBaseY $ docLines $ [start, line1] ++ lineM ++ [end]
|
|
]
|
|
HsDo{} -> do
|
|
-- TODO
|
|
briDocByExact lexpr
|
|
ExplicitList _ _ elems@(_:_) -> do
|
|
elemDocs <- elems `forM` docSharedWrapper layoutExpr
|
|
docAlt
|
|
[ docSeq
|
|
$ [docLit $ Text.pack "["]
|
|
++ List.intersperse docCommaSep (docForceSingleline <$> elemDocs)
|
|
++ [docLit $ Text.pack "]"]
|
|
, let
|
|
start = docCols ColList
|
|
[appSep $ docLit $ Text.pack "[", List.head elemDocs]
|
|
lines = List.tail elemDocs <&> \d ->
|
|
docCols ColList [docCommaSep, d]
|
|
end = docLit $ Text.pack "]"
|
|
in docSetBaseY $ docLines $ [start] ++ lines ++ [end]
|
|
]
|
|
ExplicitList _ _ [] ->
|
|
docLit $ Text.pack "[]"
|
|
ExplicitPArr{} -> do
|
|
-- TODO
|
|
briDocByExact lexpr
|
|
RecordCon lname _ _ (HsRecFields [] Nothing) -> do
|
|
let t = lrdrNameToText lname
|
|
docLit $ t <> Text.pack "{}"
|
|
RecordCon lname _ _ (HsRecFields fs@(_:_) Nothing) -> do
|
|
let t = lrdrNameToText lname
|
|
((fd1l, fd1n, fd1e):fdr) <- fs `forM` \fieldl@(L _ (HsRecField (L _ (FieldOcc lnameF _)) fExpr _)) -> do
|
|
fExpDoc <- docSharedWrapper layoutExpr fExpr
|
|
return $ (fieldl, lrdrNameToText lnameF, fExpDoc)
|
|
docAlt
|
|
[ docSetParSpacing
|
|
$ docAddBaseY BrIndentRegular
|
|
$ docPar
|
|
(docLit t)
|
|
(docLines $ let
|
|
line1 = docCols ColRecUpdate
|
|
[ appSep $ docLit $ Text.pack "{"
|
|
, appSep $ docLit $ fd1n
|
|
, docSeq [ appSep $ docLit $ Text.pack "="
|
|
, docWrapNode fd1l $ docAddBaseY BrIndentRegular $ fd1e
|
|
]
|
|
]
|
|
lineR = fdr <&> \(lfield, fText, fDoc) -> docCols ColRecUpdate
|
|
[ appSep $ docLit $ Text.pack ","
|
|
, appSep $ docLit $ fText
|
|
, docSeq [ appSep $ docLit $ Text.pack "="
|
|
, docWrapNode lfield $ docAddBaseY BrIndentRegular fDoc
|
|
]
|
|
]
|
|
lineN = docLit $ Text.pack "}"
|
|
in [line1] ++ lineR ++ [lineN])
|
|
-- TODO oneliner (?)
|
|
]
|
|
RecordCon{} ->
|
|
unknownNodeError "RecordCon with puns" lexpr
|
|
RecordUpd rExpr [] _ _ _ _ -> do
|
|
rExprDoc <- docSharedWrapper layoutExpr rExpr
|
|
docSeq [rExprDoc, docLit $ Text.pack "{}"]
|
|
RecordUpd rExpr fields@(_:_) _ _ _ _ -> do
|
|
rExprDoc <- docSharedWrapper layoutExpr rExpr
|
|
rFs@((rF1f, rF1n, rF1e):rFr) <- fields
|
|
`forM` \lfield@(L _ (HsRecField (L _ ambName) rFExpr _)) -> do
|
|
rFExpDoc <- docSharedWrapper layoutExpr rFExpr
|
|
return $ case ambName of
|
|
Unambiguous n _ -> (lfield, lrdrNameToText n, rFExpDoc)
|
|
Ambiguous n _ -> (lfield, lrdrNameToText n, rFExpDoc)
|
|
docAlt
|
|
-- singleline
|
|
[ docSetParSpacing
|
|
$ docSeq
|
|
[ appSep rExprDoc
|
|
, appSep $ docLit $ Text.pack "{"
|
|
, appSep $ docSeq $ List.intersperse docCommaSep
|
|
$ rFs <&> \(lfield, fieldStr, fieldDoc) ->
|
|
docSeq [ appSep $ docWrapNode lfield $ docLit fieldStr
|
|
, appSep $ docLit $ Text.pack "="
|
|
, docForceSingleline fieldDoc
|
|
]
|
|
, docLit $ Text.pack "}"
|
|
]
|
|
-- wild-indentation block
|
|
, docSeq
|
|
[ appSep rExprDoc
|
|
, docSetBaseY $ docLines $ let
|
|
line1 = docCols ColRecUpdate
|
|
[ appSep $ docLit $ Text.pack "{"
|
|
, appSep $ docLit $ rF1n
|
|
, docSeq [ appSep $ docLit $ Text.pack "="
|
|
, docForceSingleline $ rF1e
|
|
]
|
|
]
|
|
lineR = rFr <&> \(lfield, fText, fDoc) -> docCols ColRecUpdate
|
|
[ appSep $ docLit $ Text.pack ","
|
|
, appSep $ docWrapNode lfield $ docLit $ fText
|
|
, docSeq [ appSep $ docLit $ Text.pack "="
|
|
, docForceSingleline fDoc
|
|
]
|
|
]
|
|
lineN = docLit $ Text.pack "}"
|
|
in [line1] ++ lineR ++ [lineN]
|
|
]
|
|
-- strict indentation block
|
|
, docSetParSpacing
|
|
$ docAddBaseY BrIndentRegular
|
|
$ docPar
|
|
rExprDoc
|
|
(docNonBottomSpacing $ docLines $ let
|
|
line1 = docCols ColRecUpdate
|
|
[ appSep $ docLit $ Text.pack "{"
|
|
, appSep $ docWrapNode rF1f $ docLit $ rF1n
|
|
, docSeq [ appSep $ docLit $ Text.pack "="
|
|
, docAddBaseY BrIndentRegular $ rF1e
|
|
]
|
|
]
|
|
lineR = rFr <&> \(lfield, fText, fDoc) -> docCols ColRecUpdate
|
|
[ appSep $ docLit $ Text.pack ","
|
|
, appSep $ docWrapNode lfield $ docLit $ fText
|
|
, docSeq [ appSep $ docLit $ Text.pack "="
|
|
, docAddBaseY BrIndentRegular fDoc
|
|
]
|
|
]
|
|
lineN = docLit $ Text.pack "}"
|
|
in [line1] ++ lineR ++ [lineN])
|
|
]
|
|
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
|
|
ArithSeq _ Nothing info ->
|
|
case info of
|
|
From e1 -> do
|
|
e1Doc <- docSharedWrapper layoutExpr e1
|
|
docSeq
|
|
[ docLit $ Text.pack "["
|
|
, docForceSingleline e1Doc
|
|
, docLit $ Text.pack "..]"
|
|
]
|
|
FromThen e1 e2 -> do
|
|
e1Doc <- docSharedWrapper layoutExpr e1
|
|
e2Doc <- docSharedWrapper layoutExpr e2
|
|
docSeq
|
|
[ docLit $ Text.pack "["
|
|
, docForceSingleline e1Doc
|
|
, docLit $ Text.pack ","
|
|
, docForceSingleline e2Doc
|
|
, docLit $ Text.pack "..]"
|
|
]
|
|
FromTo e1 eN -> do
|
|
e1Doc <- docSharedWrapper layoutExpr e1
|
|
eNDoc <- docSharedWrapper layoutExpr eN
|
|
docSeq
|
|
[ docLit $ Text.pack "["
|
|
, docForceSingleline e1Doc
|
|
, docLit $ Text.pack ".."
|
|
, docForceSingleline eNDoc
|
|
, docLit $ Text.pack "]"
|
|
]
|
|
FromThenTo e1 e2 eN -> do
|
|
e1Doc <- docSharedWrapper layoutExpr e1
|
|
e2Doc <- docSharedWrapper layoutExpr e2
|
|
eNDoc <- docSharedWrapper layoutExpr eN
|
|
docSeq
|
|
[ docLit $ Text.pack "["
|
|
, docForceSingleline e1Doc
|
|
, docLit $ Text.pack ","
|
|
, docForceSingleline e2Doc
|
|
, docLit $ Text.pack ".."
|
|
, docForceSingleline eNDoc
|
|
, docLit $ Text.pack "]"
|
|
]
|
|
ArithSeq{} ->
|
|
unknownNodeError "ArithSeq" lexpr
|
|
PArrSeq{} -> do
|
|
-- TODO
|
|
briDocByExact lexpr
|
|
HsSCC{} -> do
|
|
-- TODO
|
|
briDocByExact lexpr
|
|
HsCoreAnn{} -> do
|
|
-- TODO
|
|
briDocByExact lexpr
|
|
HsBracket{} -> do
|
|
-- TODO
|
|
briDocByExact lexpr
|
|
HsRnBracketOut{} -> do
|
|
-- TODO
|
|
briDocByExact lexpr
|
|
HsTcBracketOut{} -> do
|
|
-- TODO
|
|
briDocByExact lexpr
|
|
HsSpliceE{} -> do
|
|
-- TODO
|
|
briDocByExact lexpr
|
|
HsProc{} -> do
|
|
-- TODO
|
|
briDocByExact lexpr
|
|
HsStatic{} -> do
|
|
-- TODO
|
|
briDocByExact lexpr
|
|
HsArrApp{} -> do
|
|
-- TODO
|
|
briDocByExact lexpr
|
|
HsArrForm{} -> do
|
|
-- TODO
|
|
briDocByExact lexpr
|
|
HsTick{} -> do
|
|
-- TODO
|
|
briDocByExact lexpr
|
|
HsBinTick{} -> do
|
|
-- TODO
|
|
briDocByExact lexpr
|
|
HsTickPragma{} -> do
|
|
-- TODO
|
|
briDocByExact lexpr
|
|
EWildPat{} -> do
|
|
-- TODO
|
|
briDocByExact lexpr
|
|
EAsPat{} -> do
|
|
-- TODO
|
|
briDocByExact lexpr
|
|
EViewPat{} -> do
|
|
-- TODO
|
|
briDocByExact lexpr
|
|
ELazyPat{} -> do
|
|
-- TODO
|
|
briDocByExact lexpr
|
|
HsWrap{} -> do
|
|
-- TODO
|
|
briDocByExact lexpr
|
|
|
|
litBriDoc :: HsLit -> BriDocFInt
|
|
litBriDoc = \case
|
|
HsChar t _c -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ ['\'', c, '\'']
|
|
HsCharPrim t _c -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ ['\'', c, '\'']
|
|
HsString t _fastString -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ FastString.unpackFS fastString
|
|
HsStringPrim t _byteString -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ Data.ByteString.Char8.unpack byteString
|
|
HsInt t _i -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ show i
|
|
HsIntPrim t _i -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ show i
|
|
HsWordPrim t _i -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ show i
|
|
HsInt64Prim t _i -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ show i
|
|
HsWord64Prim t _i -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ show i
|
|
HsInteger t _i _type -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ show i
|
|
HsRat (FL t _) _type -> BDFLit $ Text.pack t
|
|
HsFloatPrim (FL t _) -> BDFLit $ Text.pack t
|
|
HsDoublePrim (FL t _) -> BDFLit $ Text.pack t
|
|
|
|
overLitValBriDoc :: OverLitVal -> BriDocFInt
|
|
overLitValBriDoc = \case
|
|
HsIntegral t _ -> BDFLit $ Text.pack t
|
|
HsFractional (FL t _) -> BDFLit $ Text.pack t
|
|
HsIsString t _ -> BDFLit $ Text.pack t
|