diff --git a/source/library/Language/Haskell/Brittany/Internal/Components/BriDoc.hs b/source/library/Language/Haskell/Brittany/Internal/Components/BriDoc.hs index ab92630..7a666b7 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Components/BriDoc.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Components/BriDoc.hs @@ -5,6 +5,7 @@ {-# LANGUAGE KindSignatures #-} {-# LANGUAGE StandaloneDeriving #-} {-# LANGUAGE DerivingStrategies #-} +{-# LANGUAGE TypeFamilies #-} module Language.Haskell.Brittany.Internal.Components.BriDoc where import Language.Haskell.Brittany.Internal.Prelude @@ -15,31 +16,48 @@ import GHC (RealSrcLoc, LEpaComment, DeltaPos) --- isomorphic to BriDocF Identity. Provided for ease of use, as we do a lot --- of transformations on `BriDocF Identity`s and it is really annoying to --- `Identity`/`runIdentity` everywhere. -data BriDoc +-- historical design note +-- +-- We previously had +-- data BriDocF (f :: Type -> Type) = … +-- where instead of BriDocRec we used `f (BriDocF f)`. +-- This was very close to what we have now, because: +-- BriDocW Wrapped ~ BriDocF ((,) Int) +-- BriDocW Unwrapped ~ BriDocF Identity +-- but the crucial (and annoying) difference is the existence of `Identity` +-- constructors that are required inside the `BriDocF Identity` values. +-- +-- This new type-family based approach is much neater, yay! + +data IsWrapped = Wrapped | Unwrapped +type family BriDocRec (w :: IsWrapped) where + BriDocRec 'Wrapped = (Int, BriDocW 'Wrapped) + BriDocRec 'Unwrapped = BriDocW 'Unwrapped + + + +data BriDocW (w :: IsWrapped) = -- BDWrapAnnKey AnnKey BriDoc BDEmpty | BDLit !Text - | BDSeq [BriDoc] -- elements other than the last should + | BDSeq [BriDocRec w] -- elements other than the last should -- not contains BDPars. - | BDCols ColSig [BriDoc] -- elements other than the last + | BDCols ColSig [BriDocRec w] -- elements other than the last -- should not contains BDPars | BDSeparator -- semantically, space-unless-at-end-of-line. - | BDAddBaseY BrIndent BriDoc - | BDBaseYPushCur BriDoc - | BDIndentLevelPushCur BriDoc - | BDIndentLevelPop BriDoc + | BDAddBaseY BrIndent (BriDocRec w) + | BDBaseYPushCur (BriDocRec w) + | BDIndentLevelPushCur (BriDocRec w) + | BDIndentLevelPop (BriDocRec w) | BDPar { _bdpar_indent :: BrIndent - , _bdpar_restOfLine :: BriDoc -- should not contain other BDPars - , _bdpar_indented :: BriDoc + , _bdpar_restOfLine :: BriDocRec w -- should not contain other BDPars + , _bdpar_indented :: BriDocRec w } - -- | BDAddIndent BrIndent (BriDocF f) + -- | BDAddIndent BrIndent (BriDocRec w) -- | BDNewline - | BDAlt [BriDoc] - | BDForwardLineMode BriDoc + | BDAlt [BriDocRec w] + | BDForwardLineMode (BriDocRec w) | BDExternal -- AnnKey -- (Set AnnKey) -- set of annkeys contained within the node -- -- to be printed via exactprint @@ -47,14 +65,14 @@ data BriDoc Text | BDPlain !Text -- used for QuasiQuotes, content can be multi-line -- (contrast to BDLit) - | BDQueueComments [LEpaComment] BriDoc + | BDQueueComments [LEpaComment] (BriDocRec w) -- queue to be later flushed when the markers are reached - | BDFlushCommentsPrior RealSrcLoc BriDoc + | BDFlushCommentsPrior RealSrcLoc (BriDocRec w) -- process comments before loc from the queue - | BDFlushCommentsPost RealSrcLoc BriDoc + | BDFlushCommentsPost RealSrcLoc (BriDocRec w) -- process comments before loc from the queue, but flow to end of -- child-nodes - | BDEntryDelta DeltaPos BriDoc + | BDEntryDelta DeltaPos (BriDocRec w) -- Move to the specified delta position before rendering the inner -- element. Currently this only ever respects newlines, i.e. Sameline -- is ignored and only the `n` of DifferentLine n _ is used. @@ -62,77 +80,31 @@ data BriDoc -- a particular declaration - on the top-level spacing is retained by -- other means. -- The deltas should in general derived via `obtainAnnDeltaPos`. - | BDLines [BriDoc] - | BDEnsureIndent BrIndent BriDoc + | BDLines [(BriDocRec w)] + | BDEnsureIndent BrIndent (BriDocRec w) -- the following constructors are only relevant for the alt transformation - -- and are removed afterwards. They should never occur in any BriDoc + -- and are removed afterwards. They should never occur in any (BriDocRec w) -- after the alt transformation. - | BDForceMultiline BriDoc - | BDForceSingleline BriDoc - | BDNonBottomSpacing Bool BriDoc - | BDSetParSpacing BriDoc - | BDForceParSpacing BriDoc + | BDForceMultiline (BriDocRec w) + | BDForceSingleline (BriDocRec w) + | BDNonBottomSpacing Bool (BriDocRec w) + | BDSetParSpacing (BriDocRec w) + | BDForceParSpacing (BriDocRec w) -- pseudo-deprecated - | BDDebug String BriDoc - deriving (Data.Data.Data, Eq, Ord) + | BDDebug String (BriDocRec w) -data BriDocF f - = -- BDWrapAnnKey AnnKey BriDoc - BDFEmpty - | BDFLit !Text - | BDFSeq [f (BriDocF f)] -- elements other than the last should - -- not contains BDPars. - | BDFCols ColSig [f (BriDocF f)] -- elements other than the last - -- should not contains BDPars - | BDFSeparator -- semantically, space-unless-at-end-of-line. - | BDFAddBaseY BrIndent (f (BriDocF f)) - | BDFBaseYPushCur (f (BriDocF f)) - | BDFIndentLevelPushCur (f (BriDocF f)) - | BDFIndentLevelPop (f (BriDocF f)) - | BDFPar - { _bdfpar_indent :: BrIndent - , _bdfpar_restOfLine :: f (BriDocF f) -- should not contain other BDPars - , _bdfpar_indented :: f (BriDocF f) - } - -- | BDAddIndent BrIndent (BriDocF f) - -- | BDNewline - | BDFAlt [f (BriDocF f)] - | BDFForwardLineMode (f (BriDocF f)) - | BDFExternal -- AnnKey - -- (Set AnnKey) -- set of annkeys contained within the node - -- -- to be printed via exactprint - Bool -- should print extra comment ? - Text - | BDFPlain !Text -- used for QuasiQuotes, content can be multi-line - -- (contrast to BDLit) - | BDFQueueComments [LEpaComment] (f (BriDocF f)) - -- ^ true = comments will be left in the queue when the node is left - | BDFFlushCommentsPrior RealSrcLoc (f (BriDocF f)) - -- process comments before loc from the queue - | BDFFlushCommentsPost RealSrcLoc (f (BriDocF f)) - -- process comments before loc from the queue, but flow to end of - -- child-nodes - | BDFEntryDelta DeltaPos (f (BriDocF f)) - | BDFLines [(f (BriDocF f))] - | BDFEnsureIndent BrIndent (f (BriDocF f)) - | BDFForceMultiline (f (BriDocF f)) - | BDFForceSingleline (f (BriDocF f)) - | BDFNonBottomSpacing Bool (f (BriDocF f)) - | BDFSetParSpacing (f (BriDocF f)) - | BDFForceParSpacing (f (BriDocF f)) - | BDFDebug String (f (BriDocF f)) +deriving instance Data.Data.Data (BriDocW 'Unwrapped) +deriving instance Data.Data.Data (BriDocW 'Wrapped) + +type BriDoc = BriDocW 'Unwrapped +type BriDocWrapped = BriDocW 'Wrapped +type BriDocNumbered = (Int, BriDocWrapped) data BrIndent = BrIndentNone | BrIndentRegular | BrIndentSpecial Int deriving (Eq, Ord, Data.Data.Data, Show) --- deriving instance Data.Data.Data (BriDocF Identity) -deriving instance Data.Data.Data (BriDocF ((,) Int)) - -type BriDocFInt = BriDocF ((,) Int) -type BriDocNumbered = (Int, BriDocFInt) - instance Uniplate.Uniplate BriDoc where uniplate x@BDEmpty{} = plate x uniplate x@BDLit{} = plate x @@ -204,32 +176,32 @@ isNotEmpty _ = True -- TODO: rename to "dropLabels" ? unwrapBriDocNumbered :: BriDocNumbered -> BriDoc unwrapBriDocNumbered tpl = case snd tpl of - BDFEmpty -> BDEmpty - BDFLit t -> BDLit t - BDFSeq list -> BDSeq $ rec <$> list - BDFCols sig list -> BDCols sig $ rec <$> list - BDFSeparator -> BDSeparator - BDFAddBaseY ind bd -> BDAddBaseY ind $ rec bd - BDFBaseYPushCur bd -> BDBaseYPushCur $ rec bd - BDFIndentLevelPushCur bd -> BDIndentLevelPushCur $ rec bd - BDFIndentLevelPop bd -> BDIndentLevelPop $ rec bd - BDFPar ind line indented -> BDPar ind (rec line) (rec indented) - BDFAlt alts -> BDAlt $ rec <$> alts -- not that this will happen - BDFForwardLineMode bd -> BDForwardLineMode $ rec bd - BDFExternal c t -> BDExternal c t - BDFPlain t -> BDPlain t - BDFQueueComments comms bd -> BDQueueComments comms $ rec bd - BDFFlushCommentsPrior loc bd -> BDFlushCommentsPrior loc $ rec bd - BDFFlushCommentsPost loc bd -> BDFlushCommentsPost loc $ rec bd - BDFEntryDelta dp bd -> BDEntryDelta dp $ rec bd - BDFLines lines -> BDLines $ rec <$> lines - BDFEnsureIndent ind bd -> BDEnsureIndent ind $ rec bd - BDFForceMultiline bd -> BDForceMultiline $ rec bd - BDFForceSingleline bd -> BDForceSingleline $ rec bd - BDFNonBottomSpacing b bd -> BDNonBottomSpacing b $ rec bd - BDFSetParSpacing bd -> BDSetParSpacing $ rec bd - BDFForceParSpacing bd -> BDForceParSpacing $ rec bd - BDFDebug s bd -> BDDebug (s ++ "@" ++ show (fst tpl)) $ rec bd + BDEmpty -> BDEmpty + BDLit t -> BDLit t + BDSeq list -> BDSeq $ rec <$> list + BDCols sig list -> BDCols sig $ rec <$> list + BDSeparator -> BDSeparator + BDAddBaseY ind bd -> BDAddBaseY ind $ rec bd + BDBaseYPushCur bd -> BDBaseYPushCur $ rec bd + BDIndentLevelPushCur bd -> BDIndentLevelPushCur $ rec bd + BDIndentLevelPop bd -> BDIndentLevelPop $ rec bd + BDPar ind line indented -> BDPar ind (rec line) (rec indented) + BDAlt alts -> BDAlt $ rec <$> alts -- not that this will happen + BDForwardLineMode bd -> BDForwardLineMode $ rec bd + BDExternal c t -> BDExternal c t + BDPlain t -> BDPlain t + BDQueueComments comms bd -> BDQueueComments comms $ rec bd + BDFlushCommentsPrior loc bd -> BDFlushCommentsPrior loc $ rec bd + BDFlushCommentsPost loc bd -> BDFlushCommentsPost loc $ rec bd + BDEntryDelta dp bd -> BDEntryDelta dp $ rec bd + BDLines lines -> BDLines $ rec <$> lines + BDEnsureIndent ind bd -> BDEnsureIndent ind $ rec bd + BDForceMultiline bd -> BDForceMultiline $ rec bd + BDForceSingleline bd -> BDForceSingleline $ rec bd + BDNonBottomSpacing b bd -> BDNonBottomSpacing b $ rec bd + BDSetParSpacing bd -> BDSetParSpacing $ rec bd + BDForceParSpacing bd -> BDForceParSpacing $ rec bd + BDDebug s bd -> BDDebug (s ++ "@" ++ show (fst tpl)) $ rec bd where rec = unwrapBriDocNumbered data ColSig diff --git a/source/library/Language/Haskell/Brittany/Internal/S3_ToBriDocTools.hs b/source/library/Language/Haskell/Brittany/Internal/S3_ToBriDocTools.hs index c815e52..ee289b4 100644 --- a/source/library/Language/Haskell/Brittany/Internal/S3_ToBriDocTools.hs +++ b/source/library/Language/Haskell/Brittany/Internal/S3_ToBriDocTools.hs @@ -99,7 +99,7 @@ briDocByExactInlineOnly infoStr ast = do mAsk <&> _conf_errorHandling .> _econf_ExactPrintFallback .> confUnpack let exactPrintNode t = - allocateNode $ BDFExternal + allocateNode $ BDExternal -- (ExactPrint.Types.mkAnnKey ast) -- (foldedAnnKeys ast) False t @@ -312,7 +312,7 @@ astConnectedComments = -- new BriDoc stuff allocateNode - :: MonadMultiState NodeAllocIndex m => BriDocFInt -> m BriDocNumbered + :: MonadMultiState NodeAllocIndex m => BriDocWrapped -> m BriDocNumbered allocateNode bd = do i <- allocNodeIndex return (i, bd) @@ -324,20 +324,20 @@ allocNodeIndex = do return i docEmpty :: ToBriDocM BriDocNumbered -docEmpty = allocateNode BDFEmpty +docEmpty = allocateNode BDEmpty docLit :: Text -> ToBriDocM BriDocNumbered -docLit t = allocateNode $ BDFLit t +docLit t = allocateNode $ BDLit t docLitS :: String -> ToBriDocM BriDocNumbered -docLitS s = allocateNode $ BDFLit $ Text.pack s +docLitS s = allocateNode $ BDLit $ Text.pack s docExt :: (ExactPrint.ExactPrint (GenLocated l ast)) => GenLocated l ast -> Bool -> ToBriDocM BriDocNumbered -docExt x shouldAddComment = allocateNode $ BDFExternal +docExt x shouldAddComment = allocateNode $ BDExternal -- (ExactPrint.Types.mkAnnKey x) -- (foldedAnnKeys x) shouldAddComment @@ -348,7 +348,7 @@ docExt x shouldAddComment = allocateNode $ BDFExternal ) docAlt :: [ToBriDocM BriDocNumbered] -> ToBriDocM BriDocNumbered -docAlt l = allocateNode . BDFAlt =<< sequence l +docAlt l = allocateNode . BDAlt =<< sequence l newtype CollectAltM a = CollectAltM (Writer.Writer [ToBriDocM BriDocNumbered] a) deriving (Functor, Applicative, Monad) @@ -365,51 +365,51 @@ runFilteredAlternative (CollectAltM action) = docAlt $ Writer.execWriter action docSeq :: [ToBriDocM BriDocNumbered] -> ToBriDocM BriDocNumbered docSeq [] = docEmpty -docSeq l = allocateNode . BDFSeq =<< sequence l +docSeq l = allocateNode . BDSeq =<< sequence l docLines :: [ToBriDocM BriDocNumbered] -> ToBriDocM BriDocNumbered -docLines l = allocateNode . BDFLines =<< sequence l +docLines l = allocateNode . BDLines =<< sequence l docCols :: ColSig -> [ToBriDocM BriDocNumbered] -> ToBriDocM BriDocNumbered -docCols sig l = allocateNode . BDFCols sig =<< sequence l +docCols sig l = allocateNode . BDCols sig =<< sequence l docAddBaseY :: BrIndent -> ToBriDocM BriDocNumbered -> ToBriDocM BriDocNumbered -docAddBaseY ind bdm = allocateNode . BDFAddBaseY ind =<< bdm +docAddBaseY ind bdm = allocateNode . BDAddBaseY ind =<< bdm docSetBaseY :: ToBriDocM BriDocNumbered -> ToBriDocM BriDocNumbered docSetBaseY bdm = do bd <- bdm -- the order here is important so that these two nodes can be treated -- properly over at `transformAlts`. - allocateNode $ BDFBaseYPushCur bd + allocateNode $ BDBaseYPushCur bd docSetIndentLevel :: ToBriDocM BriDocNumbered -> ToBriDocM BriDocNumbered docSetIndentLevel bdm = do bd <- bdm - n1 <- allocateNode $ BDFIndentLevelPushCur bd - n2 <- allocateNode $ BDFIndentLevelPop n1 + n1 <- allocateNode $ BDIndentLevelPushCur bd + n2 <- allocateNode $ BDIndentLevelPop n1 return n2 docSetBaseAndIndent :: ToBriDocM BriDocNumbered -> ToBriDocM BriDocNumbered docSetBaseAndIndent = docSetBaseY . docSetIndentLevel docSeparator :: ToBriDocM BriDocNumbered -docSeparator = allocateNode BDFSeparator +docSeparator = allocateNode BDSeparator docNonBottomSpacing :: ToBriDocM BriDocNumbered -> ToBriDocM BriDocNumbered -docNonBottomSpacing bdm = allocateNode . BDFNonBottomSpacing False =<< bdm +docNonBottomSpacing bdm = allocateNode . BDNonBottomSpacing False =<< bdm docNonBottomSpacingS :: ToBriDocM BriDocNumbered -> ToBriDocM BriDocNumbered -docNonBottomSpacingS bdm = allocateNode . BDFNonBottomSpacing True =<< bdm +docNonBottomSpacingS bdm = allocateNode . BDNonBottomSpacing True =<< bdm docSetParSpacing :: ToBriDocM BriDocNumbered -> ToBriDocM BriDocNumbered -docSetParSpacing bdm = allocateNode . BDFSetParSpacing =<< bdm +docSetParSpacing bdm = allocateNode . BDSetParSpacing =<< bdm docForceParSpacing :: ToBriDocM BriDocNumbered -> ToBriDocM BriDocNumbered -docForceParSpacing bdm = allocateNode . BDFForceParSpacing =<< bdm +docForceParSpacing bdm = allocateNode . BDForceParSpacing =<< bdm docDebug :: String -> ToBriDocM BriDocNumbered -> ToBriDocM BriDocNumbered -docDebug s bdm = allocateNode . BDFDebug s =<< bdm +docDebug s bdm = allocateNode . BDDebug s =<< bdm appSep :: ToBriDocM BriDocNumbered -> ToBriDocM BriDocNumbered appSep x = docSeq [x, docSeparator] @@ -456,22 +456,22 @@ docPar docPar lineM indentedM = do line <- lineM indented <- indentedM - allocateNode $ BDFPar BrIndentNone line indented + allocateNode $ BDPar BrIndentNone line indented docForceSingleline :: ToBriDocM BriDocNumbered -> ToBriDocM BriDocNumbered -docForceSingleline bdm = allocateNode . BDFForceSingleline =<< bdm +docForceSingleline bdm = allocateNode . BDForceSingleline =<< bdm docForceMultiline :: ToBriDocM BriDocNumbered -> ToBriDocM BriDocNumbered -docForceMultiline bdm = allocateNode . BDFForceMultiline =<< bdm +docForceMultiline bdm = allocateNode . BDForceMultiline =<< bdm docEnsureIndent :: BrIndent -> ToBriDocM BriDocNumbered -> ToBriDocM BriDocNumbered -docEnsureIndent ind mbd = mbd >>= \bd -> allocateNode $ BDFEnsureIndent ind bd +docEnsureIndent ind mbd = mbd >>= \bd -> allocateNode $ BDEnsureIndent ind bd docAddEntryDelta :: GHC.DeltaPos -> ToBriDocM BriDocNumbered -> ToBriDocM BriDocNumbered docAddEntryDelta dp bdm = do bd <- bdm - allocateNode (BDFEntryDelta dp bd) + allocateNode (BDEntryDelta dp bd) docFlushRemaining :: FastString -> ToBriDocM BriDocNumbered -> ToBriDocM BriDocNumbered docFlushRemaining fileThing = docFlushCommsPost @@ -486,7 +486,7 @@ instance DocHandleComms [LEpaComment] (ToBriDocM BriDocNumbered) where docHandleComms comms bdm = do bd <- bdm i1 <- allocNodeIndex - pure (i1, BDFQueueComments comms bd) + pure (i1, BDQueueComments comms bd) instance DocHandleComms (EpAnn a) (ToBriDocM BriDocNumbered) where docHandleComms epAnn bdm = case epAnn of @@ -494,15 +494,15 @@ instance DocHandleComms (EpAnn a) (ToBriDocM BriDocNumbered) where bd <- bdm i1 <- allocNodeIndex pure - (i1, BDFFlushCommentsPrior (GHC.realSrcSpanStart $ GHC.anchor anch) bd) + (i1, BDFlushCommentsPrior (GHC.realSrcSpanStart $ GHC.anchor anch) bd) EpAnn anch _ (EpaComments comms) -> do bd <- bdm i1 <- allocNodeIndex i2 <- allocNodeIndex pure ( i1 - , BDFFlushCommentsPrior (GHC.realSrcSpanStart $ GHC.anchor anch) - (i2, BDFQueueComments (reverse comms) bd) + , BDFlushCommentsPrior (GHC.realSrcSpanStart $ GHC.anchor anch) + (i2, BDQueueComments (reverse comms) bd) ) EpAnn anch _ (EpaCommentsBalanced commsB commsA) -> do bd <- bdm @@ -510,10 +510,10 @@ instance DocHandleComms (EpAnn a) (ToBriDocM BriDocNumbered) where i2 <- allocNodeIndex pure ( i1 - , BDFQueueComments + , BDQueueComments (reverse commsB ++ reverse commsA) ( i2 - , BDFFlushCommentsPrior (GHC.realSrcSpanStart $ GHC.anchor anch) bd + , BDFlushCommentsPrior (GHC.realSrcSpanStart $ GHC.anchor anch) bd ) ) EpAnnNotUsed -> bdm @@ -525,7 +525,7 @@ instance DocHandleComms (GHC.RealSrcLoc) (ToBriDocM BriDocNumbered) where docHandleComms loc bdm = do bd <- bdm i1 <- allocNodeIndex - pure (i1, BDFFlushCommentsPrior loc bd) + pure (i1, BDFlushCommentsPrior loc bd) instance DocHandleComms (Maybe GHC.RealSrcSpan) (ToBriDocM BriDocNumbered) where docHandleComms Nothing bdm = bdm @@ -680,7 +680,7 @@ instance DocFlushCommsPost (ToBriDocM BriDocNumbered) where Just span -> \bdm -> do i1 <- allocNodeIndex bd <- bdm - pure (i1, BDFFlushCommentsPost span bd) + pure (i1, BDFlushCommentsPost span bd) instance DocFlushCommsPost (ToBriDocM [BriDocNumbered]) where docFlushCommsPost loc bdm = do diff --git a/source/library/Language/Haskell/Brittany/Internal/ToBriDoc/Decl.hs b/source/library/Language/Haskell/Brittany/Internal/ToBriDoc/Decl.hs index a7e4a8f..8d90848 100644 --- a/source/library/Language/Haskell/Brittany/Internal/ToBriDoc/Decl.hs +++ b/source/library/Language/Haskell/Brittany/Internal/ToBriDoc/Decl.hs @@ -906,7 +906,7 @@ layoutClsInst (L declLoc _) cid = do :: [ToBriDocM (Located BriDocNumbered)] -> ToBriDocM BriDocNumbered docSortedLines l = allocateNode - . BDFLines + . BDLines . fmap unLoc . List.sortOn (ExactPrint.rs . getLoc) =<< sequence l diff --git a/source/library/Language/Haskell/Brittany/Internal/ToBriDoc/Expr.hs b/source/library/Language/Haskell/Brittany/Internal/ToBriDoc/Expr.hs index ae7652a..7d7c835 100644 --- a/source/library/Language/Haskell/Brittany/Internal/ToBriDoc/Expr.hs +++ b/source/library/Language/Haskell/Brittany/Internal/ToBriDoc/Expr.hs @@ -991,7 +991,7 @@ layoutExpr lexpr@(L _ expr) = do -- TODO briDocByExactInlineOnly "HsTcBracketOut{}" lexpr HsSpliceE _ (HsQuasiQuote _ _ quoter _loc content) -> do - allocateNode $ BDFPlain + allocateNode $ BDPlain (Text.pack $ "[" ++ showOutputable quoter @@ -1197,26 +1197,26 @@ recordExpression dotdot wrapO wrapDD wrapC indentPolicy _lexpr nameDoc nameLayou in fieldLines ++ [dotdotLine, lineN] ) -litBriDoc :: HsLit GhcPs -> BriDocFInt +litBriDoc :: HsLit GhcPs -> BriDocWrapped litBriDoc = \case - HsChar (SourceText t) _c -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ ['\'', c, '\''] - HsCharPrim (SourceText t) _c -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ ['\'', c, '\''] - HsString (SourceText t) _fastString -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ FastString.unpackFS fastString - HsStringPrim (SourceText t) _byteString -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ Data.ByteString.Char8.unpack byteString - HsInt _ (IL (SourceText t) _ _) -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ show i - HsIntPrim (SourceText t) _i -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ show i - HsWordPrim (SourceText t) _i -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ show i - HsInt64Prim (SourceText t) _i -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ show i - HsWord64Prim (SourceText t) _i -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ show i - HsInteger (SourceText t) _i _type -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ show i - HsRat _ (FL (SourceText t) _ _ _ _) _type -> BDFLit $ Text.pack t - HsFloatPrim _ (FL (SourceText t) _ _ _ _) -> BDFLit $ Text.pack t - HsDoublePrim _ (FL (SourceText t) _ _ _ _) -> BDFLit $ Text.pack t + HsChar (SourceText t) _c -> BDLit $ Text.pack t -- BDLit $ Text.pack $ ['\'', c, '\''] + HsCharPrim (SourceText t) _c -> BDLit $ Text.pack t -- BDLit $ Text.pack $ ['\'', c, '\''] + HsString (SourceText t) _fastString -> BDLit $ Text.pack t -- BDLit $ Text.pack $ FastString.unpackFS fastString + HsStringPrim (SourceText t) _byteString -> BDLit $ Text.pack t -- BDLit $ Text.pack $ Data.ByteString.Char8.unpack byteString + HsInt _ (IL (SourceText t) _ _) -> BDLit $ Text.pack t -- BDLit $ Text.pack $ show i + HsIntPrim (SourceText t) _i -> BDLit $ Text.pack t -- BDLit $ Text.pack $ show i + HsWordPrim (SourceText t) _i -> BDLit $ Text.pack t -- BDLit $ Text.pack $ show i + HsInt64Prim (SourceText t) _i -> BDLit $ Text.pack t -- BDLit $ Text.pack $ show i + HsWord64Prim (SourceText t) _i -> BDLit $ Text.pack t -- BDLit $ Text.pack $ show i + HsInteger (SourceText t) _i _type -> BDLit $ Text.pack t -- BDLit $ Text.pack $ show i + HsRat _ (FL (SourceText t) _ _ _ _) _type -> BDLit $ Text.pack t + HsFloatPrim _ (FL (SourceText t) _ _ _ _) -> BDLit $ Text.pack t + HsDoublePrim _ (FL (SourceText t) _ _ _ _) -> BDLit $ Text.pack t _ -> error "litBriDoc: literal with no SourceText" -overLitValBriDoc :: OverLitVal -> BriDocFInt +overLitValBriDoc :: OverLitVal -> BriDocWrapped overLitValBriDoc = \case - HsIntegral (IL (SourceText t) _ _) -> BDFLit $ Text.pack t - HsFractional (FL (SourceText t) _ _ _ _) -> BDFLit $ Text.pack t - HsIsString (SourceText t) _ -> BDFLit $ Text.pack t + HsIntegral (IL (SourceText t) _ _) -> BDLit $ Text.pack t + HsFractional (FL (SourceText t) _ _ _ _) -> BDLit $ Text.pack t + HsIsString (SourceText t) _ -> BDLit $ Text.pack t _ -> error "overLitValBriDoc: literal with no SourceText" diff --git a/source/library/Language/Haskell/Brittany/Internal/ToBriDoc/Expr.hs-boot b/source/library/Language/Haskell/Brittany/Internal/ToBriDoc/Expr.hs-boot index a1f52d3..76a6a3c 100644 --- a/source/library/Language/Haskell/Brittany/Internal/ToBriDoc/Expr.hs-boot +++ b/source/library/Language/Haskell/Brittany/Internal/ToBriDoc/Expr.hs-boot @@ -10,6 +10,6 @@ import Language.Haskell.Brittany.Internal.Components.BriDoc layoutExpr :: ToBriDoc HsExpr -litBriDoc :: HsLit GhcPs -> BriDocFInt +litBriDoc :: HsLit GhcPs -> BriDocWrapped -overLitValBriDoc :: OverLitVal -> BriDocFInt +overLitValBriDoc :: OverLitVal -> BriDocWrapped diff --git a/source/library/Language/Haskell/Brittany/Internal/Transformations/T1_Alt.hs b/source/library/Language/Haskell/Brittany/Internal/Transformations/T1_Alt.hs index 9bb2212..38fe7aa 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Transformations/T1_Alt.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Transformations/T1_Alt.hs @@ -116,28 +116,28 @@ transformAlts = -- go = Memo.memo $ \bdX -> do -- i <- lift $ incGet -- fmap (\bd' -> (i,bd')) $ case bdX of - -- BDEmpty -> return $ BDFEmpty - -- BDLit t -> return $ BDFLit t - -- BDSeq list -> BDFSeq <$> go `mapM` list - -- BDCols sig list -> BDFCols sig <$> go `mapM` list - -- BDSeparator -> return $ BDFSeparator - -- BDAddBaseY ind bd -> BDFAddBaseY ind <$> go bd - -- BDSetBaseY bd -> BDFSetBaseY <$> go bd - -- BDSetIndentLevel bd -> BDFSetIndentLevel <$> go bd - -- BDPar ind line indented -> [ BDFPar ind line' indented' + -- BDEmpty -> return $ BDEmpty + -- BDLit t -> return $ BDLit t + -- BDSeq list -> BDSeq <$> go `mapM` list + -- BDCols sig list -> BDCols sig <$> go `mapM` list + -- BDSeparator -> return $ BDSeparator + -- BDAddBaseY ind bd -> BDAddBaseY ind <$> go bd + -- BDSetBaseY bd -> BDSetBaseY <$> go bd + -- BDSetIndentLevel bd -> BDSetIndentLevel <$> go bd + -- BDPar ind line indented -> [ BDPar ind line' indented' -- | line' <- go line -- , indented' <- go indented -- ] - -- BDAlt alts -> BDFAlt <$> go `mapM` alts -- not that this will happen - -- BDForceMultiline bd -> BDFForceMultiline <$> go bd - -- BDForceSingleline bd -> BDFForceSingleline <$> go bd - -- BDForwardLineMode bd -> BDFForwardLineMode <$> go bd - -- BDExternal k ks c t -> return $ BDFExternal k ks c t - -- BDAnnotationPrior annKey bd -> BDFAnnotationPrior annKey <$> go bd - -- BDAnnotationPost annKey bd -> BDFAnnotationPost annKey <$> go bd - -- BDLines lines -> BDFLines <$> go `mapM` lines - -- BDEnsureIndent ind bd -> BDFEnsureIndent ind <$> go bd - -- BDProhibitMTEL bd -> BDFProhibitMTEL <$> go bd + -- BDAlt alts -> BDAlt <$> go `mapM` alts -- not that this will happen + -- BDForceMultiline bd -> BDForceMultiline <$> go bd + -- BDForceSingleline bd -> BDForceSingleline <$> go bd + -- BDForwardLineMode bd -> BDForwardLineMode <$> go bd + -- BDExternal k ks c t -> return $ BDExternal k ks c t + -- BDAnnotationPrior annKey bd -> BDAnnotationPrior annKey <$> go bd + -- BDAnnotationPost annKey bd -> BDAnnotationPost annKey <$> go bd + -- BDLines lines -> BDLines <$> go `mapM` lines + -- BDEnsureIndent ind bd -> BDEnsureIndent ind <$> go bd + -- BDProhibitMTEL bd -> BDProhibitMTEL <$> go bd @@ -156,12 +156,12 @@ transformAlts = -- acp <- mGet -- mSet $ acp { _acp_forceMLFlag = altLineModeDecay $ _acp_forceMLFlag acp } -- BDWrapAnnKey annKey <$> rec bd - BDFEmpty{} -> processSpacingSimple bdX $> bdX - BDFLit{} -> processSpacingSimple bdX $> bdX - BDFSeq list -> reWrap . BDFSeq <$> list `forM` rec - BDFCols sig list -> reWrap . BDFCols sig <$> list `forM` rec - BDFSeparator -> processSpacingSimple bdX $> bdX - BDFAddBaseY indent bd -> do + BDEmpty{} -> processSpacingSimple bdX $> bdX + BDLit{} -> processSpacingSimple bdX $> bdX + BDSeq list -> reWrap . BDSeq <$> list `forM` rec + BDCols sig list -> reWrap . BDCols sig <$> list `forM` rec + BDSeparator -> processSpacingSimple bdX $> bdX + BDAddBaseY indent bd -> do acp <- mGet indAdd <- fixIndentationForMultiple acp indent mSet $ acp { _acp_indentPrep = max (_acp_indentPrep acp) indAdd } @@ -170,22 +170,22 @@ transformAlts = mSet $ acp' { _acp_indent = _acp_indent acp } return $ case indent of BrIndentNone -> r - BrIndentRegular -> reWrap $ BDFAddBaseY (BrIndentSpecial indAdd) r - BrIndentSpecial i -> reWrap $ BDFAddBaseY (BrIndentSpecial i) r - BDFBaseYPushCur bd -> do + BrIndentRegular -> reWrap $ BDAddBaseY (BrIndentSpecial indAdd) r + BrIndentSpecial i -> reWrap $ BDAddBaseY (BrIndentSpecial i) r + BDBaseYPushCur bd -> do acp <- mGet mSet $ acp { _acp_indent = _acp_line acp } r <- rec bd acp' <- mGet mSet $ acp' { _acp_indent = _acp_indent acp } - return $ reWrap $ BDFBaseYPushCur r - BDFEntryDelta dp bd -> do - return $ reWrap $ BDFEntryDelta dp bd - BDFIndentLevelPushCur bd -> do - reWrap . BDFIndentLevelPushCur <$> rec bd - BDFIndentLevelPop bd -> do - reWrap . BDFIndentLevelPop <$> rec bd - BDFPar indent sameLine indented -> do + return $ reWrap $ BDBaseYPushCur r + BDEntryDelta dp bd -> do + return $ reWrap $ BDEntryDelta dp bd + BDIndentLevelPushCur bd -> do + reWrap . BDIndentLevelPushCur <$> rec bd + BDIndentLevelPop bd -> do + reWrap . BDIndentLevelPop <$> rec bd + BDPar indent sameLine indented -> do indAmount <- mAsk <&> _conf_layout .> _lconfig_indentAmount .> confUnpack let @@ -199,12 +199,12 @@ transformAlts = sameLine' <- rec sameLine mModify $ \acp' -> acp' { _acp_line = ind, _acp_indent = ind } indented' <- rec indented - return $ reWrap $ BDFPar indent sameLine' indented' - BDFAlt [] -> error "empty BDAlt" -- returning BDEmpty instead is a + return $ reWrap $ BDPar indent sameLine' indented' + BDAlt [] -> error "empty BDAlt" -- returning BDEmpty instead is a -- possibility, but i will prefer a -- fail-early approach; BDEmpty does not -- make sense semantically for Alt[]. - BDFAlt alts -> do + BDAlt alts -> do altChooser <- mAsk <&> _conf_layout .> _lconfig_altChooser .> confUnpack case altChooser of AltChooserSimpleQuick -> do @@ -263,7 +263,7 @@ transformAlts = $ fromMaybe (-- trace ("choosing last") $ List.last alts) $ Data.List.Extra.firstJust (fmap snd) checkedOptions - BDFForceMultiline bd -> do + BDForceMultiline bd -> do acp <- mGet x <- do mSet $ mergeLineMode acp (AltLineModeStateForceML False) @@ -271,7 +271,7 @@ transformAlts = acp' <- mGet mSet $ acp' { _acp_forceMLFlag = _acp_forceMLFlag acp } return $ x - BDFForceSingleline bd -> do + BDForceSingleline bd -> do acp <- mGet x <- do mSet $ mergeLineMode acp AltLineModeStateForceSL @@ -279,7 +279,7 @@ transformAlts = acp' <- mGet mSet $ acp' { _acp_forceMLFlag = _acp_forceMLFlag acp } return $ x - BDFForwardLineMode bd -> do + BDForwardLineMode bd -> do acp <- mGet x <- do mSet $ acp @@ -289,29 +289,29 @@ transformAlts = acp' <- mGet mSet $ acp' { _acp_forceMLFlag = _acp_forceMLFlag acp } return $ x - BDFExternal{} -> processSpacingSimple bdX $> bdX - BDFPlain{} -> processSpacingSimple bdX $> bdX - BDFQueueComments comms bd -> - reWrap . BDFQueueComments comms <$> rec bd - BDFFlushCommentsPrior loc bd -> + BDExternal{} -> processSpacingSimple bdX $> bdX + BDPlain{} -> processSpacingSimple bdX $> bdX + BDQueueComments comms bd -> + reWrap . BDQueueComments comms <$> rec bd + BDFlushCommentsPrior loc bd -> -- TODO92 for AnnotationPrior we had this here: -- > acp <- mGet -- > mSet -- > $ acp { _acp_forceMLFlag = altLineModeDecay $ _acp_forceMLFlag acp } -- > bd' <- rec bd -- not sure if the lineModeDecay is relevant any longer though.. - reWrap . BDFFlushCommentsPrior loc <$> rec bd - BDFFlushCommentsPost loc bd -> - reWrap . BDFFlushCommentsPost loc <$> rec bd - BDFLines [] -> return $ reWrap BDFEmpty -- evil transformation. or harmless. - BDFLines (l : lr) -> do + reWrap . BDFlushCommentsPrior loc <$> rec bd + BDFlushCommentsPost loc bd -> + reWrap . BDFlushCommentsPost loc <$> rec bd + BDLines [] -> return $ reWrap BDEmpty -- evil transformation. or harmless. + BDLines (l : lr) -> do ind <- _acp_indent <$> mGet l' <- rec l lr' <- lr `forM` \x -> do mModify $ \acp -> acp { _acp_line = ind, _acp_indent = ind } rec x - return $ reWrap $ BDFLines (l' : lr') - BDFEnsureIndent indent bd -> do + return $ reWrap $ BDLines (l' : lr') + BDEnsureIndent indent bd -> do acp <- mGet indAdd <- fixIndentationForMultiple acp indent mSet $ acp @@ -320,7 +320,7 @@ transformAlts = , _acp_indent = _acp_indent acp + indAdd , _acp_line = max (_acp_line acp) (_acp_indent acp + indAdd) -- we cannot use just _acp_line acp + indAdd because of the case - -- where there are multiple BDFEnsureIndents in the same line. + -- where there are multiple BDEnsureIndents in the same line. -- Then, the actual indentation is relative to the current -- indentation, not the current cursor position. } @@ -330,21 +330,21 @@ transformAlts = return $ case indent of BrIndentNone -> r BrIndentRegular -> - reWrap $ BDFEnsureIndent (BrIndentSpecial indAdd) r - BrIndentSpecial i -> reWrap $ BDFEnsureIndent (BrIndentSpecial i) r - BDFNonBottomSpacing _ bd -> rec bd - BDFSetParSpacing bd -> rec bd - BDFForceParSpacing bd -> rec bd - BDFDebug s bd -> do + reWrap $ BDEnsureIndent (BrIndentSpecial indAdd) r + BrIndentSpecial i -> reWrap $ BDEnsureIndent (BrIndentSpecial i) r + BDNonBottomSpacing _ bd -> rec bd + BDSetParSpacing bd -> rec bd + BDForceParSpacing bd -> rec bd + BDDebug s bd -> do acp :: AltCurPos <- mGet tellDebugMess - $ "transformAlts: BDFDEBUG " + $ "transformAlts: BDDEBUG " ++ s ++ " (node-id=" ++ show brDcId ++ "): acp=" ++ show acp - reWrap . BDFDebug s <$> rec bd + reWrap . BDDebug s <$> rec bd processSpacingSimple :: ( MonadMultiReader Config m , MonadMultiState AltCurPos m @@ -391,17 +391,17 @@ getSpacing !bridoc = rec bridoc let colMax = config & _conf_layout & _lconfig_cols & confUnpack result <- case brDc of -- BDWrapAnnKey _annKey bd -> rec bd - BDFEmpty -> + BDEmpty -> return $ LineModeValid $ VerticalSpacing 0 VerticalSpacingParNone False - BDFLit t -> return $ LineModeValid $ VerticalSpacing + BDLit t -> return $ LineModeValid $ VerticalSpacing (Text.length t) VerticalSpacingParNone False - BDFSeq list -> sumVs <$> rec `mapM` list - BDFCols _sig list -> sumVs <$> rec `mapM` list - BDFSeparator -> + BDSeq list -> sumVs <$> rec `mapM` list + BDCols _sig list -> sumVs <$> rec `mapM` list + BDSeparator -> return $ LineModeValid $ VerticalSpacing 1 VerticalSpacingParNone False - BDFAddBaseY indent bd -> do + BDAddBaseY indent bd -> do mVs <- rec bd return $ mVs <&> \vs -> vs { _vs_paragraph = case _vs_paragraph vs of @@ -423,7 +423,7 @@ getSpacing !bridoc = rec bridoc i + (confUnpack $ _lconfig_indentAmount $ _conf_layout $ config) BrIndentSpecial j -> i + j } - BDFBaseYPushCur bd -> do + BDBaseYPushCur bd -> do mVs <- rec bd return $ mVs <&> \vs -> vs -- We leave par as-is, even though it technically is not @@ -440,9 +440,9 @@ getSpacing !bridoc = rec bridoc ) , _vs_paragraph = VerticalSpacingParSome 0 } - BDFIndentLevelPushCur bd -> rec bd - BDFIndentLevelPop bd -> rec bd - BDFPar BrIndentNone sameLine indented -> do + BDIndentLevelPushCur bd -> rec bd + BDIndentLevelPop bd -> rec bd + BDPar BrIndentNone sameLine indented -> do mVs <- rec sameLine mIndSp <- rec indented return @@ -465,33 +465,33 @@ getSpacing !bridoc = rec bridoc == VerticalSpacingParNone && _vs_parFlag indSp ] - BDFPar{} -> error "BDPar with indent in getSpacing" - BDFAlt [] -> error "empty BDAlt" - BDFAlt (alt : _) -> rec alt - BDFForceMultiline bd -> do + BDPar{} -> error "BDPar with indent in getSpacing" + BDAlt [] -> error "empty BDAlt" + BDAlt (alt : _) -> rec alt + BDForceMultiline bd -> do mVs <- rec bd return $ mVs >>= _vs_paragraph .> \case VerticalSpacingParNone -> LineModeInvalid _ -> mVs - BDFForceSingleline bd -> do + BDForceSingleline bd -> do mVs <- rec bd return $ mVs >>= _vs_paragraph .> \case VerticalSpacingParNone -> mVs _ -> LineModeInvalid - BDFForwardLineMode bd -> rec bd - BDFExternal _ txt -> return $ LineModeValid $ case Text.lines txt of + BDForwardLineMode bd -> rec bd + BDExternal _ txt -> return $ LineModeValid $ case Text.lines txt of [t] -> VerticalSpacing (Text.length t) VerticalSpacingParNone False _ -> VerticalSpacing 999 VerticalSpacingParNone False - BDFPlain txt -> return $ LineModeValid $ case Text.lines txt of + BDPlain txt -> return $ LineModeValid $ case Text.lines txt of [t] -> VerticalSpacing (Text.length t) VerticalSpacingParNone False _ -> VerticalSpacing 999 VerticalSpacingParNone False - BDFQueueComments _comms bd -> rec bd - BDFFlushCommentsPrior _loc bd -> rec bd - BDFFlushCommentsPost _loc bd -> rec bd - BDFEntryDelta _dp bd -> rec bd - BDFLines [] -> + BDQueueComments _comms bd -> rec bd + BDFlushCommentsPrior _loc bd -> rec bd + BDFlushCommentsPost _loc bd -> rec bd + BDEntryDelta _dp bd -> rec bd + BDLines [] -> return $ LineModeValid $ VerticalSpacing 0 VerticalSpacingParNone False - BDFLines (l1 : lR) -> do + BDLines (l1 : lR) -> do mVs <- rec l1 mVRs <- rec `mapM` lR let lSps = mVs : mVRs @@ -500,7 +500,7 @@ getSpacing !bridoc = rec bridoc | VerticalSpacing lsp _ _ <- mVs , lineMax <- getMaxVS $ maxVs $ lSps ] - BDFEnsureIndent indent bd -> do + BDEnsureIndent indent bd -> do mVs <- rec bd let addInd = case indent of @@ -510,7 +510,7 @@ getSpacing !bridoc = rec bridoc BrIndentSpecial i -> i return $ mVs <&> \(VerticalSpacing lsp psp pf) -> VerticalSpacing (lsp + addInd) psp pf - BDFNonBottomSpacing b bd -> do + BDNonBottomSpacing b bd -> do mVs <- rec bd return $ mVs <|> LineModeValid (VerticalSpacing @@ -521,20 +521,20 @@ getSpacing !bridoc = rec bridoc ) False ) - BDFSetParSpacing bd -> do + BDSetParSpacing bd -> do mVs <- rec bd return $ mVs <&> \vs -> vs { _vs_parFlag = True } - BDFForceParSpacing bd -> do + BDForceParSpacing bd -> do mVs <- rec bd return $ [ vs | vs <- mVs , _vs_parFlag vs || _vs_paragraph vs == VerticalSpacingParNone ] - BDFDebug s bd -> do + BDDebug s bd -> do r <- rec bd tellDebugMess - $ "getSpacing: BDFDebug " + $ "getSpacing: BDDebug " ++ show s ++ " (node-id=" ++ show brDcId @@ -690,13 +690,13 @@ getSpacings limit bridoc = preFilterLimit <$> rec bridoc . preFilterLimit result <- case brdc of -- BDWrapAnnKey _annKey bd -> rec bd - BDFEmpty -> return $ [VerticalSpacing 0 VerticalSpacingParNone False] - BDFLit t -> + BDEmpty -> return $ [VerticalSpacing 0 VerticalSpacingParNone False] + BDLit t -> return $ [VerticalSpacing (Text.length t) VerticalSpacingParNone False] - BDFSeq list -> fmap sumVs . mapM filterAndLimit <$> rec `mapM` list - BDFCols _sig list -> fmap sumVs . mapM filterAndLimit <$> rec `mapM` list - BDFSeparator -> return $ [VerticalSpacing 1 VerticalSpacingParNone False] - BDFAddBaseY indent bd -> do + BDSeq list -> fmap sumVs . mapM filterAndLimit <$> rec `mapM` list + BDCols _sig list -> fmap sumVs . mapM filterAndLimit <$> rec `mapM` list + BDSeparator -> return $ [VerticalSpacing 1 VerticalSpacingParNone False] + BDAddBaseY indent bd -> do mVs <- rec bd return $ mVs <&> \vs -> vs { _vs_paragraph = case _vs_paragraph vs of @@ -718,7 +718,7 @@ getSpacings limit bridoc = preFilterLimit <$> rec bridoc i + (confUnpack $ _lconfig_indentAmount $ _conf_layout $ config) BrIndentSpecial j -> i + j } - BDFBaseYPushCur bd -> do + BDBaseYPushCur bd -> do mVs <- rec bd return $ mVs <&> \vs -> vs -- We leave par as-is, even though it technically is not @@ -738,9 +738,9 @@ getSpacings limit bridoc = preFilterLimit <$> rec bridoc VerticalSpacingParSome i -> VerticalSpacingParSome i VerticalSpacingParAlways i -> VerticalSpacingParAlways i } - BDFIndentLevelPushCur bd -> rec bd - BDFIndentLevelPop bd -> rec bd - BDFPar BrIndentNone sameLine indented -> do + BDIndentLevelPushCur bd -> rec bd + BDIndentLevelPop bd -> rec bd + BDPar BrIndentNone sameLine indented -> do mVss <- filterAndLimit <$> rec sameLine indSps <- filterAndLimit <$> rec indented let mVsIndSp = take limit $ [ (x, y) | x <- mVss, y <- indSps ] @@ -761,24 +761,24 @@ getSpacings limit bridoc = preFilterLimit <$> rec bridoc && _vs_parFlag indSp ) - BDFPar{} -> error "BDPar with indent in getSpacing" - BDFAlt [] -> error "empty BDAlt" + BDPar{} -> error "BDPar with indent in getSpacing" + BDAlt [] -> error "empty BDAlt" -- BDAlt (alt:_) -> rec alt - BDFAlt alts -> do + BDAlt alts -> do r <- rec `mapM` alts return $ filterAndLimit =<< r - BDFForceMultiline bd -> do + BDForceMultiline bd -> do mVs <- filterAndLimit <$> rec bd return $ filter ((/= VerticalSpacingParNone) . _vs_paragraph) mVs - BDFForceSingleline bd -> do + BDForceSingleline bd -> do mVs <- filterAndLimit <$> rec bd return $ filter ((== VerticalSpacingParNone) . _vs_paragraph) mVs - BDFForwardLineMode bd -> rec bd - BDFExternal _ txt | [t] <- Text.lines txt -> + BDForwardLineMode bd -> rec bd + BDExternal _ txt | [t] <- Text.lines txt -> return $ [VerticalSpacing (Text.length t) VerticalSpacingParNone False] - BDFExternal{} -> return $ [] -- yes, we just assume that we cannot properly layout + BDExternal{} -> return $ [] -- yes, we just assume that we cannot properly layout -- this. - BDFPlain t -> return + BDPlain t -> return [ case Text.lines t of [] -> VerticalSpacing 0 VerticalSpacingParNone False [t1] -> @@ -787,12 +787,12 @@ getSpacings limit bridoc = preFilterLimit <$> rec bridoc VerticalSpacing (Text.length t1) (VerticalSpacingParAlways 0) True | allowHangingQuasiQuotes ] - BDFQueueComments _comms bd -> rec bd - BDFFlushCommentsPrior _loc bd -> rec bd - BDFFlushCommentsPost _loc bd -> rec bd - BDFEntryDelta _dp bd -> rec bd - BDFLines [] -> return $ [VerticalSpacing 0 VerticalSpacingParNone False] - BDFLines ls@(_ : _) -> do + BDQueueComments _comms bd -> rec bd + BDFlushCommentsPrior _loc bd -> rec bd + BDFlushCommentsPost _loc bd -> rec bd + BDEntryDelta _dp bd -> rec bd + BDLines [] -> return $ [VerticalSpacing 0 VerticalSpacingParNone False] + BDLines ls@(_ : _) -> do -- we simply assume that lines is only used "properly", i.e. in -- such a way that the first line can be treated "as a part of the -- paragraph". That most importantly means that Lines should never @@ -819,7 +819,7 @@ getSpacings limit bridoc = preFilterLimit <$> rec bridoc -- [] -> [] -- (lSps:_) -> mVs <&> \(VerticalSpacing lsp _) -> -- VerticalSpacing lsp $ VerticalSpacingParSome $ getMaxVS $ maxVs lSps - BDFEnsureIndent indent bd -> do + BDEnsureIndent indent bd -> do mVs <- rec bd let addInd = case indent of @@ -829,7 +829,7 @@ getSpacings limit bridoc = preFilterLimit <$> rec bridoc BrIndentSpecial i -> i return $ mVs <&> \(VerticalSpacing lsp psp parFlag) -> VerticalSpacing (lsp + addInd) psp parFlag - BDFNonBottomSpacing b bd -> do + BDNonBottomSpacing b bd -> do -- TODO: the `b` flag is an ugly hack, but I was not able to make -- all tests work without it. It should be possible to have -- `spMakePar` map VSPAlways{} to VSPSome x1, which fixes this @@ -864,7 +864,7 @@ getSpacings limit bridoc = preFilterLimit <$> rec bridoc -- leading to unnecessary new-lines. Disabled for now. A better -- solution would require conditionally folding the search-space -- only in appropriate locations (i.e. a new BriDoc node type - -- for this purpose, perhaps "BDFNonBottomSpacing1"). + -- for this purpose, perhaps "BDNonBottomSpacing1"). -- else -- [ Foldable.foldl1 -- (\(VerticalSpacing x1 x2 _) (VerticalSpacing y1 y2 _) -> @@ -884,20 +884,20 @@ getSpacings limit bridoc = preFilterLimit <$> rec bridoc -- False) -- mVs -- ] - BDFSetParSpacing bd -> do + BDSetParSpacing bd -> do mVs <- rec bd return $ mVs <&> \vs -> vs { _vs_parFlag = True } - BDFForceParSpacing bd -> do + BDForceParSpacing bd -> do mVs <- preFilterLimit <$> rec bd return $ [ vs | vs <- mVs , _vs_parFlag vs || _vs_paragraph vs == VerticalSpacingParNone ] - BDFDebug s bd -> do + BDDebug s bd -> do r <- rec bd tellDebugMess - $ "getSpacings: BDFDebug " + $ "getSpacings: BDDebug " ++ show s ++ " (node-id=" ++ show brDcId