Safe Haskell | None |
---|---|
Language | Haskell2010 |
In most cases import Ormolu.Printer.Combinators instead, these
functions are the low-level building blocks and should not be used on
their own. The R
monad is re-exported from Ormolu.Printer.Combinators
as well.
Synopsis
- data R a
- runR :: R () -> SpanStream -> CommentStream -> Anns -> Text
- txt :: Text -> R ()
- atom :: Outputable a => a -> R ()
- space :: R ()
- newline :: R ()
- isLineDirty :: R Bool
- inci :: R () -> R ()
- sitcc :: R () -> R ()
- data Layout
- enterLayout :: Layout -> R () -> R ()
- vlayout :: R a -> R a -> R a
- getLayout :: R Layout
- useBraces :: R () -> R ()
- dontUseBraces :: R () -> R ()
- canUseBraces :: R Bool
- data CommentPosition
- registerPendingCommentLine :: CommentPosition -> Text -> R ()
- trimSpanStream :: RealSrcSpan -> R ()
- nextEltSpan :: R (Maybe RealSrcSpan)
- popComment :: (RealLocated Comment -> Bool) -> R (Maybe (RealLocated Comment))
- getEnclosingSpan :: (RealSrcSpan -> Bool) -> R (Maybe RealSrcSpan)
- withEnclosingSpan :: RealSrcSpan -> R () -> R ()
- data HaddockStyle
- setLastCommentSpan :: Maybe HaddockStyle -> RealSrcSpan -> R ()
- getLastCommentSpan :: R (Maybe (Maybe HaddockStyle, RealSrcSpan))
- getAnns :: SrcSpan -> R [AnnKeywordId]
The R
monad
The R
monad hosts combinators that allow us to describe how to render
AST.
:: R () | Monad to run |
-> SpanStream | Span stream |
-> CommentStream | Comment stream |
-> Anns | Annotations |
-> Text | Resulting rendition |
Run an R
monad.
Internal functions
Output a fixed Text
fragment. The argument may not contain any line
breaks. txt
is used to output all sorts of “fixed” bits of syntax like
keywords and pipes |
in functional dependencies.
To separate various bits of syntax with white space use space
instead
of
. To output txt
" "Outputable
Haskell entities like numbers use
atom
.
atom :: Outputable a => a -> R () Source #
Output Outputable
fragment of AST. This can be used to output numeric
literals and similar. Everything that doesn't have inner structure but
does have an Outputable
instance.
This primitive does not necessarily output a space. It just ensures that the next thing that will be printed on the same line will be separated by a single space from the previous output. Using this combinator twice results in at most one space.
In practice this design prevents trailing white space and makes it hard to output more than one delimiting space in a row, which is what we usually want.
Output a newline. First time newline
is used after some non-newline
output it gets inserted immediately. Second use of newline
does not
output anything but makes sure that the next non-white space output will
be prefixed by a newline. Using newline
more than twice in a row has no
effect. Also, using newline
at the very beginning has no effect, this
is to avoid leading whitespace.
Similarly to space
, this design prevents trailing newlines and makes it
hard to output more than one blank newline in a row.
isLineDirty :: R Bool Source #
Check if the current line is “dirty”, that is, there is something on it that can have comments attached to it.
Increase indentation level by one indentation step for the inner
computation. inci
should be used when a part of code must be more
indented relative to the parts outside of inci
in order for the output
to be valid Haskell. When layout is single-line there is no obvious
effect, but with multi-line layout correct indentation levels matter.
sitcc :: R () -> R () Source #
Set indentation level for the inner computation equal to current column. This makes sure that the entire inner block is uniformly "shifted" to the right. Only works (and makes sense) when enclosing layout is multi-line.
Layout
options.
SingleLine | Put everything on single line |
MultiLine | Use multiple lines |
Do one or another thing depending on current Layout
.
Helpers for braces
dontUseBraces :: R () -> R () Source #
Make the inner computation omit braces around single-line layouts.
Special helpers for comment placement
data CommentPosition Source #
Modes for rendering of pending comments.
OnTheSameLine | Put the comment on the same line |
OnNextLine | Put the comment on next line |
Instances
Eq CommentPosition Source # | |
Defined in Ormolu.Printer.Internal (==) :: CommentPosition -> CommentPosition -> Bool # (/=) :: CommentPosition -> CommentPosition -> Bool # | |
Show CommentPosition Source # | |
Defined in Ormolu.Printer.Internal showsPrec :: Int -> CommentPosition -> ShowS # show :: CommentPosition -> String # showList :: [CommentPosition] -> ShowS # |
registerPendingCommentLine Source #
:: CommentPosition | Comment position |
-> Text |
|
-> R () |
Register a comment line for outputting. It will be inserted right before next newline. When the comment goes after something else on the same line, a space will be inserted between preceding text and the comment when necessary.
:: RealSrcSpan | Reference span |
-> R () |
Drop elements that begin before or at the same place as given
SrcSpan
.
nextEltSpan :: R (Maybe RealSrcSpan) Source #
Get location of next element in AST.
popComment :: (RealLocated Comment -> Bool) -> R (Maybe (RealLocated Comment)) Source #
Pop a Comment
from the CommentStream
if given predicate is
satisfied and there are comments in the stream.
Get the first enclosing RealSrcSpan
that satisfies given predicate.
withEnclosingSpan :: RealSrcSpan -> R () -> R () Source #
Set RealSrcSpan
of enclosing span for the given computation.
:: Maybe HaddockStyle |
|
-> RealSrcSpan | Location of last printed comment |
-> R () |
Set span of last output comment.
getLastCommentSpan :: R (Maybe (Maybe HaddockStyle, RealSrcSpan)) Source #
Get span of last output comment.