Compare commits

...

2 Commits

2 changed files with 42 additions and 18 deletions

View File

@ -13,6 +13,7 @@ module Language.Haskell.Brittany.Internal.S2_SplitModule
import Language.Haskell.Brittany.Internal.Prelude import Language.Haskell.Brittany.Internal.Prelude
import qualified Data.Generics as SYB import qualified Data.Generics as SYB
import qualified Data.List.Extra
import qualified Data.Map as Map import qualified Data.Map as Map
import qualified GHC import qualified GHC
import GHC ( AddEpAnn(AddEpAnn) import GHC ( AddEpAnn(AddEpAnn)
@ -91,16 +92,42 @@ extractDeclMap modul =
splitModuleDecls :: GHC.ParsedSource -> FinalList ModuleElement ExactPrint.Pos splitModuleDecls :: GHC.ParsedSource -> FinalList ModuleElement ExactPrint.Pos
splitModuleDecls lmod = do splitModuleDecls lmod = do
let L moduleSpan modl = lmod let
HsModule _ _layout _name _exports _imports decls _ _ = modl L moduleSpan modl = lmod
(hsModAnn', finalComments) = case GHC.hsmodAnn modl of HsModule _ _layout _name _exports imports decls _ _ = modl
EpAnn a modAnns (EpaCommentsBalanced prior post) -> (hsModAnn', finalComments) = case GHC.hsmodAnn modl of
(EpAnn a modAnns (EpaCommentsBalanced prior []), post) EpAnn a modAnns (EpaCommentsBalanced prior post) ->
_ -> (GHC.hsmodAnn modl, []) (EpAnn a modAnns (EpaCommentsBalanced prior []), post)
moduleWithoutComments = L moduleSpan modl { GHC.hsmodAnn = hsModAnn' _ -> (GHC.hsmodAnn modl, [])
, GHC.hsmodDecls = [] (newImports, commsAfterImports) = case Data.List.Extra.unsnoc imports of
} Just (allButLast, L (SrcSpanAnn epAnn s@(RealSrcSpan span _)) lastImp) ->
lastSpan <- do case epAnn of
EpAnnNotUsed -> (imports, [])
EpAnn anch anns (EpaComments cs) ->
let
(keepImports, moveImports) =
partition
(\(L cAnch _) ->
GHC.srcSpanEndLine (anchor cAnch) <= GHC.srcSpanEndLine span
)
cs
newLastImport =
L (SrcSpanAnn (EpAnn anch anns (EpaComments keepImports)) s)
lastImp
in
( allButLast ++ [newLastImport]
, List.sortOn (\(L l _) -> l) moveImports
)
EpAnn anch anns (EpaCommentsBalanced cs1 cs2) ->
let newLastImport =
L (SrcSpanAnn (EpAnn anch anns (EpaComments cs1)) s) lastImp
in (allButLast ++ [newLastImport], List.sortOn (\(L l _) -> l) cs2)
_ -> ([], [])
moduleWithoutComments = L moduleSpan modl { GHC.hsmodAnn = hsModAnn'
, GHC.hsmodDecls = []
, GHC.hsmodImports = newImports
}
spanAfterImports <- do
finalYield $ MEExactModuleHead moduleWithoutComments finalYield $ MEExactModuleHead moduleWithoutComments
pure pure
$ maybe (0, 1) (ExactPrint.ss2posEnd) $ maybe (0, 1) (ExactPrint.ss2posEnd)
@ -111,17 +138,14 @@ splitModuleDecls lmod = do
EpAnnNotUsed -> error "unexpected EpAnnNotUsed" EpAnnNotUsed -> error "unexpected EpAnnNotUsed"
] ]
++ [ s | AddEpAnn _ (EpaSpan s) <- GHC.am_main $ GHC.anns hsModAnn' ] ++ [ s | AddEpAnn _ (EpaSpan s) <- GHC.am_main $ GHC.anns hsModAnn' ]
++ [ GHC.anchor a ++ [ span
| L da _ <- GHC.hsmodImports modl | L (SrcSpanAnn _ (RealSrcSpan span _)) _ <- GHC.hsmodImports modl
, L a _ <- case GHC.ann da of
EpAnn _ _ (EpaComments l ) -> l
EpAnn _ _ (EpaCommentsBalanced _ l) -> l
EpAnnNotUsed -> []
] ]
++ [ span ++ [ span
| L (SrcSpanAnn _ (GHC.RealSrcSpan span _)) _ <- GHC.hsmodImports modl | L (SrcSpanAnn _ (GHC.RealSrcSpan span _)) _ <- GHC.hsmodImports modl
] ]
spanAfterDecls <- enrichDecls lastSpan decls spanBeforeDecls <- enrichComms spanAfterImports commsAfterImports
spanAfterDecls <- enrichDecls spanBeforeDecls decls
enrichComms spanAfterDecls finalComments enrichComms spanAfterDecls finalComments
splitModuleStart splitModuleStart

View File

@ -494,7 +494,7 @@ createDetailsDoc consNameStr details = case details of
] ]
, docSeq , docSeq
[ docHandleComms posOpen $ docLitS "{" [ docHandleComms posOpen $ docLitS "{"
, docSeparator , docHandleComms epAnn docSeparator
, docSetBaseY $ docAddBaseY BrIndentRegular $ docPar , docSetBaseY $ docAddBaseY BrIndentRegular $ docPar
fName1 fName1
(docSeq [docLitS "::", docSeparator, fType1]) (docSeq [docLitS "::", docSeparator, fType1])