Refactor and Add missing docSharedWrapper

pull/83/head
Lennart Spitzner 2017-12-21 15:44:58 +01:00
parent f651d02898
commit 33f23a65ec
3 changed files with 41 additions and 40 deletions

View File

@ -71,12 +71,15 @@ layoutIE lie@(L _ ie) = docWrapNode lie $ case ie of
-- left to the caller since that is context sensitive -- left to the caller since that is context sensitive
layoutAnnAndSepLLIEs :: (Located [LIE RdrName]) -> ToBriDocM [ToBriDocM BriDocNumbered] layoutAnnAndSepLLIEs :: (Located [LIE RdrName]) -> ToBriDocM [ToBriDocM BriDocNumbered]
layoutAnnAndSepLLIEs llies@(L _ lies) = do layoutAnnAndSepLLIEs llies@(L _ lies) = do
let makeIENode ie = docSeq [docCommaSep, ie] let
layoutAnnAndSepLLIEs' ies = case ies of makeIENode ie = docSeq [docCommaSep, ie]
[] -> [] layoutAnnAndSepLLIEs' ies = case splitFirstLast ies of
[ie] -> [docWrapNode llies $ ie] FirstLastEmpty -> []
(ie:ies') -> ie:map makeIENode (List.init ies') FirstLastSingleton ie -> [docWrapNodeRest llies $ ie]
++ [makeIENode $ docWrapNode llies $ List.last ies'] FirstLast ie1 ieMs ieN ->
[ie1]
++ map makeIENode ieMs
++ [makeIENode $ docWrapNodeRest llies $ ieN]
layoutAnnAndSepLLIEs' <$> mapM (docSharedWrapper layoutIE) lies layoutAnnAndSepLLIEs' <$> mapM (docSharedWrapper layoutIE) lies
-- Builds a complete layout for the given located -- Builds a complete layout for the given located

View File

@ -46,13 +46,16 @@ layoutImport :: ToBriDoc ImportDecl
layoutImport limportD@(L _ importD) = docWrapNode limportD $ case importD of layoutImport limportD@(L _ importD) = docWrapNode limportD $ case importD of
ImportDecl _ (L _ modName) pkg src safe q False as mllies -> do ImportDecl _ (L _ modName) pkg src safe q False as mllies -> do
importCol <- mAsk <&> _conf_layout .> _lconfig_importColumn .> confUnpack importCol <- mAsk <&> _conf_layout .> _lconfig_importColumn .> confUnpack
-- NB we don't need to worry about sharing in the below code
-- (docSharedWrapper etc.) because we do not use any docAlt nodes; all
-- "decisions" are made statically.
let let
modNameT = Text.pack $ moduleNameString modName modNameT = Text.pack $ moduleNameString modName
pkgNameT = Text.pack . prepPkg . sl_st <$> pkg pkgNameT = Text.pack . prepPkg . sl_st <$> pkg
asT = Text.pack . moduleNameString . prepModName <$> as asT = Text.pack . moduleNameString . prepModName <$> as
hiding = case mllies of hiding = case mllies of
Just (h, _) -> h Just (h, _) -> h
Nothing -> False Nothing -> False
minQLength = length "import qualified " minQLength = length "import qualified "
qLengthReal = qLengthReal =
let qualifiedPart = if q then length "qualified " else 0 let qualifiedPart = if q then length "qualified " else 0
@ -76,37 +79,31 @@ layoutImport limportD@(L _ importD) = docWrapNode limportD $ case importD of
docEnsureIndent (BrIndentSpecial qLength) $ appSep $ docLit modNameT docEnsureIndent (BrIndentSpecial qLength) $ appSep $ docLit modNameT
hidDoc = hidDoc =
if hiding then appSep $ docLit $ Text.pack "hiding" else docEmpty if hiding then appSep $ docLit $ Text.pack "hiding" else docEmpty
importHead = docSeq [importQualifiers, modNameD] importHead = docSeq [importQualifiers, modNameD]
bindingsH = docParenLSep bindingsD = case mllies of
bindingsT = [docSeq [docSeparator, docParenR]] Nothing -> docSeq [docEmpty]
bindingsD = case mllies of
Nothing -> docSeq [docEmpty]
Just (_, llies) -> do Just (_, llies) -> do
ieDs <- layoutAnnAndSepLLIEs llies ieDs <- layoutAnnAndSepLLIEs llies
hasComments <- hasAnyCommentsBelow llies hasComments <- hasAnyCommentsBelow llies
case ieDs of docWrapNodeRest llies $ case ieDs of
-- ..[hiding].( ) -- ..[hiding].( )
[] -> do [] -> if hasComments
if hasComments then docPar
then (docSeq [hidDoc, docParenLSep, docWrapNode llies docEmpty])
docWrapNodeRest llies $ docPar (docSeq [hidDoc, bindingsH, docWrapNode llies docEmpty]) $ docLines docParenR
bindingsT else docSeq [hidDoc, docParenLSep, docSeparator, docParenR]
else
docWrapNodeRest llies $ docSeq $ hidDoc : bindingsH : bindingsT
-- ..[hiding].( b ) -- ..[hiding].( b )
[ieD] -> do [ieD] -> if hasComments
if hasComments then docPar (docSeq [hidDoc, docParenLSep, ieD]) docParenR
then else docSeq [hidDoc, docParenLSep, ieD, docSeparator, docParenR]
docWrapNodeRest llies $ docPar (docSeq [hidDoc, bindingsH, ieD ]) $ docLines $
bindingsT
else
docWrapNodeRest llies $ docSeq $ hidDoc : bindingsH : ieD : bindingsT
-- ..[hiding].( b -- ..[hiding].( b
-- , b' -- , b'
-- ) -- )
(ieD:ieDs') -> do (ieD:ieDs') ->
docWrapNodeRest llies $ docPar (docSeq [hidDoc, docSetBaseY $ docSeq [bindingsH, ieD]]) docPar (docSeq [hidDoc, docSetBaseY $ docSeq [docParenLSep, ieD]])
$ docLines $ ieDs' ++ bindingsT $ docLines
$ ieDs'
++ [docParenR]
bindingLine = bindingLine =
docEnsureIndent (BrIndentSpecial (importCol - bindingCost)) bindingsD docEnsureIndent (BrIndentSpecial (importCol - bindingCost)) bindingsD
case asT of case asT of

View File

@ -30,11 +30,12 @@ layoutModule lmod@(L _ mod') = do
HsModule Nothing _ imports _ _ _ -> docLines $ map layoutImport imports HsModule Nothing _ imports _ _ _ -> docLines $ map layoutImport imports
HsModule (Just n) les imports _ _ _ -> do HsModule (Just n) les imports _ _ _ -> do
let tn = Text.pack $ moduleNameString $ unLoc n let tn = Text.pack $ moduleNameString $ unLoc n
(hasComments, es) <- case les of (hasComments, exportsDoc) <- case les of
Nothing -> return (False, docEmpty) Nothing -> return (False, docEmpty)
Just llies -> do Just llies -> do
hasComments <- hasAnyCommentsBelow llies hasComments <- hasAnyCommentsBelow llies
return (hasComments, layoutLLIEs llies) exportsDoc <- docSharedWrapper layoutLLIEs llies
return (hasComments, exportsDoc)
docLines docLines
$ docSeq $ docSeq
[ docWrapNode lmod $ docEmpty [ docWrapNode lmod $ docEmpty
@ -44,7 +45,7 @@ layoutModule lmod@(L _ mod') = do
( [ docSeq ( [ docSeq
[ appSep $ docLit $ Text.pack "module" [ appSep $ docLit $ Text.pack "module"
, appSep $ docLit tn , appSep $ docLit tn
, appSep $ docForceSingleline es , appSep $ docForceSingleline exportsDoc
, docLit $ Text.pack "where" , docLit $ Text.pack "where"
] ]
| not hasComments | not hasComments
@ -54,7 +55,7 @@ layoutModule lmod@(L _ mod') = do
( docSeq ( docSeq
[appSep $ docLit $ Text.pack "module", docLit tn] [appSep $ docLit $ Text.pack "module", docLit tn]
) )
(docForceMultiline es) (docForceMultiline exportsDoc)
, docLit $ Text.pack "where" , docLit $ Text.pack "where"
] ]
] ]