From 8ad1f0fa2eb74cba33282320c71f6ebaa2d68bd7 Mon Sep 17 00:00:00 2001 From: Lennart Spitzner Date: Sat, 16 Mar 2024 23:23:13 +0100 Subject: [PATCH] Fix a case of comments going missing --- data/15-regressions.blt | 11 +++++++++++ .../Haskell/Brittany/Internal/ToBriDoc/Decl.hs | 8 ++++---- .../Haskell/Brittany/Internal/ToBriDocTools.hs | 15 +++++++++++++++ 3 files changed, 30 insertions(+), 4 deletions(-) diff --git a/data/15-regressions.blt b/data/15-regressions.blt index 321bd87..6edd128 100644 --- a/data/15-regressions.blt +++ b/data/15-regressions.blt @@ -1126,3 +1126,14 @@ otherFunc very long patterrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr where ccccccc = "abc" ddddd = True + +#test another comment-case +getMimeType fp + -- ODT + | fp == "layout-cache" + = Just "application/binary" + | "Formula-" `isPrefixOf` fp && "/" `isSuffixOf` fp + = Just "application/vnd.oasis.opendocument.formula" + -- generic + | otherwise + = M.lookup (T.toLower $ T.drop 1 $ T.pack $ takeExtension fp) mimeTypes diff --git a/source/library/Language/Haskell/Brittany/Internal/ToBriDoc/Decl.hs b/source/library/Language/Haskell/Brittany/Internal/ToBriDoc/Decl.hs index 10afe90..666e0c4 100644 --- a/source/library/Language/Haskell/Brittany/Internal/ToBriDoc/Decl.hs +++ b/source/library/Language/Haskell/Brittany/Internal/ToBriDoc/Decl.hs @@ -154,13 +154,13 @@ layoutBind lbind@(L _ bind) = case bind of funcPatDocs <- docHandleComms lbind $ matches `forM` layoutPatternBind (Just idStr) binderDoc return $ Left $ funcPatDocs - PatBind _epAnn pat (GRHSs _ grhss whereBinds) ([], []) -> do -- TODO92 are we ignoring something in whereBinds? + PatBind _epAnn pat (GRHSs comms grhss whereBinds) ([], []) -> do -- TODO92 are we ignoring something in whereBinds? patDocs <- callLayouter layout_colsWrapPat =<< callLayouter layout_pat pat mWhereDocs <- layoutLocalBinds whereBinds -- let mWhereArg = mWhereDocs <&> (,) (mkAnnKey lbind) -- TODO: is this the right AnnKey? binderDoc <- docLit $ Text.pack "=" let hasComments = hasAnyCommentsBelow lbind - fmap Right $ docHandleComms lbind $ layoutPatternBindFinal + fmap Right $ docHandleComms lbind $ docHandleComms comms $ layoutPatternBindFinal Nothing binderDoc (Just patDocs) @@ -250,7 +250,7 @@ layoutPatternBind -> LMatch GhcPs (LHsExpr GhcPs) -> ToBriDocM BriDocNumbered layoutPatternBind funId binderDoc lmatch@(L _ match) = do - let Match epAnn matchCtx pats (GRHSs _ grhss whereBinds) = match + let Match epAnn matchCtx pats (GRHSs comms grhss whereBinds) = match patDocs <- pats `forM` \p -> fmap return $ callLayouter layout_colsWrapPat =<< callLayouter layout_pat p let isInfix = isInfixMatch match @@ -296,7 +296,7 @@ layoutPatternBind funId binderDoc lmatch@(L _ match) = do -- let mWhereArg = mWhereDocs <&> (,) (mkAnnKey lmatch) let alignmentToken = if null pats then Nothing else funId let hasComments = hasAnyCommentsBelow lmatch - docHandleComms lmatch $ docHandleComms epAnn $ docFlushCommsPost True matchEndLoc + docHandleComms lmatch $ docHandleComms epAnn $ docHandleComms comms $ docFlushCommsPost True matchEndLoc $ layoutPatternBindFinal alignmentToken binderDoc diff --git a/source/library/Language/Haskell/Brittany/Internal/ToBriDocTools.hs b/source/library/Language/Haskell/Brittany/Internal/ToBriDocTools.hs index 91229ce..9c2c8cc 100644 --- a/source/library/Language/Haskell/Brittany/Internal/ToBriDocTools.hs +++ b/source/library/Language/Haskell/Brittany/Internal/ToBriDocTools.hs @@ -518,6 +518,21 @@ instance DocHandleComms [LEpaComment] (ToBriDocM BriDocNumbered) where i1 <- allocNodeIndex pure (i1, BDQueueComments comms bd) +instance DocHandleComms EpAnnComments (ToBriDocM BriDocNumbered) where + docHandleComms (EpaComments comms) bdm = do + bd <- bdm + i1 <- allocNodeIndex + pure (i1, BDQueueComments comms bd) + docHandleComms (EpaCommentsBalanced commsB commsA) bdm = do + bd <- bdm + i1 <- allocNodeIndex + pure + ( i1 + , BDQueueComments + (commsB ++ commsA) + bd + ) + instance DocHandleComms (EpAnn a) (ToBriDocM BriDocNumbered) where docHandleComms epAnn bdm = case epAnn of EpAnn anch _ (EpaComments []) -> do