Copyright | (c) The University of Glasgow 2001 |
---|---|
License | BSD-style (see the file LICENSE) |
Maintainer | Jeffrey Young <jeffrey.young@iohk.io> Luite Stegeman <luite.stegeman@iohk.io> Sylvain Henry <sylvain.henry@iohk.io> Josh Meredith <josh.meredith@iohk.io> |
Stability | experimental |
Safe Haskell | None |
Language | GHC2021 |
Domain and Purpose
GHC.JS.Ppr defines the code generation facilities for the JavaScript backend. That is, this module exports a function from the JS backend IR to JavaScript compliant concrete syntax that can readily be executed by nodejs or called in a browser.
Design
This module follows the architecture and style of the other backends in GHC: it instances Outputable for the relevant types, creates a class that describes a morphism from the IR domain to JavaScript concrete Syntax and then generates that syntax on a case by case basis.
How to use
The key functions are
renderJS
,jsToDoc
, and theRenderJS
record. Use theRenderJS
record andjsToDoc
to define a custom renderers for specific parts of the backend, for example inOpt
a custom renderer ensures allIdent
generated by the linker optimization pass are prefixed differently than the default. UserenderJS
to generate JavaScript concrete syntax in the general case, suitable for human consumption.
Synopsis
- renderJs :: JsToDoc a => a -> SDoc
- renderPrefixJs :: JsToDoc a => a -> SDoc
- renderPrefixJs' :: (JsToDoc a, JsRender doc) => RenderJs doc -> a -> doc
- class JsToDoc a where
- defaultRenderJs :: RenderJs doc
- data RenderJs doc = RenderJs {}
- class IsLine doc => JsRender doc where
- jsToDoc :: JsToDoc a => a -> SDoc
- pprStringLit :: IsLine doc => FastString -> doc
- interSemi :: JsRender doc => [doc] -> doc
- braceNest :: JsRender doc => doc -> doc
- hangBrace :: JsRender doc => doc -> doc -> doc
Documentation
renderJs :: JsToDoc a => a -> SDoc Source #
Render a syntax tree as a pretty-printable document (simply showing the resultant doc produces a nice, well formatted String).
renderPrefixJs :: JsToDoc a => a -> SDoc Source #
Render a syntax tree as a pretty-printable document, using a given prefix to all generated names. Use this with distinct prefixes to ensure distinct generated names between independent calls to render(Prefix)Js.
defaultRenderJs :: RenderJs doc Source #
class IsLine doc => JsRender doc where Source #
JsRender controls the differences in whitespace between HLine and SDoc. Generally, this involves the indentation and newlines in the human-readable SDoc implementation being replaced in the HLine version by the minimal whitespace required for valid JavaScript syntax.
(<+?>) :: doc -> doc -> doc Source #
Concatenate with an optional single space
($$$) :: doc -> doc -> doc Source #
Concatenate with an optional newline
Concatenate these doc
s, either vertically (SDoc) or horizontally (HLine)
Optionally indent the following
addSemi :: doc -> doc Source #
Append semi-colon (and line-break in HLine mode)
pprStringLit :: IsLine doc => FastString -> doc Source #
braceNest :: JsRender doc => doc -> doc Source #
The structure `{body}`, optionally indented over multiple lines
hangBrace :: JsRender doc => doc -> doc -> doc Source #
The structure `hdr {body}`, optionally indented over multiple lines