ghc-lib-parser-9.8.1.20231009: The GHC API, decoupled from GHC versions
Copyright(c) The University of Glasgow 2001
LicenseBSD-style (see the file LICENSE)
MaintainerJeffrey Young <jeffrey.young@iohk.io> Luite Stegeman <luite.stegeman@iohk.io> Sylvain Henry <sylvain.henry@iohk.io> Josh Meredith <josh.meredith@iohk.io>
Stabilityexperimental
Safe HaskellSafe-Inferred
LanguageHaskell2010

GHC.JS.Ppr

Description

  • 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 intances 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 the RenderJS record. Use the RenderJS record and jsToDoc to define a custom renderers for specific parts of the backend, for example in Opt a custom renderer ensures all Ident generated by the linker optimization pass are prefixed differently than the default. Use renderJS to generate JavaScript concrete syntax in the general case, suitable for human consumption.

Synopsis

Documentation

renderJs :: JsToDoc a => a -> SDoc #

Render a syntax tree as a pretty-printable document (simply showing the resultant doc produces a nice, well formatted String).

renderPrefixJs :: (JsToDoc a, JMacro a) => a -> SDoc #

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.

renderPrefixJs' :: (JsToDoc a, JMacro a, JsRender doc) => RenderJs doc -> a -> doc #

class JsToDoc a where #

Methods

jsToDocR :: JsRender doc => RenderJs doc -> a -> doc #

Instances

Instances details
JsToDoc JExpr # 
Instance details

Defined in GHC.JS.Ppr

Methods

jsToDocR :: JsRender doc => RenderJs doc -> JExpr -> doc #

JsToDoc JStat # 
Instance details

Defined in GHC.JS.Ppr

Methods

jsToDocR :: JsRender doc => RenderJs doc -> JStat -> doc #

JsToDoc JVal # 
Instance details

Defined in GHC.JS.Ppr

Methods

jsToDocR :: JsRender doc => RenderJs doc -> JVal -> doc #

JsToDoc Ident # 
Instance details

Defined in GHC.JS.Ppr

Methods

jsToDocR :: JsRender doc => RenderJs doc -> Ident -> doc #

JsToDoc [JExpr] # 
Instance details

Defined in GHC.JS.Ppr

Methods

jsToDocR :: JsRender doc => RenderJs doc -> [JExpr] -> doc #

JsToDoc [JStat] # 
Instance details

Defined in GHC.JS.Ppr

Methods

jsToDocR :: JsRender doc => RenderJs doc -> [JStat] -> doc #

data RenderJs doc #

Constructors

RenderJs 

Fields

class IsLine doc => JsRender doc where #

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.

Methods

(<+?>) :: doc -> doc -> doc #

Concatenate with an optional single space

($$$) :: doc -> doc -> doc #

Concatenate with an optional newline

jcat :: [doc] -> doc #

Concatenate these docs, either vertically (SDoc) or horizontally (HLine)

jnest :: doc -> doc #

Optionally indent the following

addSemi :: doc -> doc #

Append semi-colon (and line-break in HLine mode)

Instances

Instances details
JsRender HLine # 
Instance details

Defined in GHC.JS.Ppr

Methods

(<+?>) :: HLine -> HLine -> HLine #

($$$) :: HLine -> HLine -> HLine #

jcat :: [HLine] -> HLine #

jnest :: HLine -> HLine #

addSemi :: HLine -> HLine #

JsRender SDoc # 
Instance details

Defined in GHC.JS.Ppr

Methods

(<+?>) :: SDoc -> SDoc -> SDoc #

($$$) :: SDoc -> SDoc -> SDoc #

jcat :: [SDoc] -> SDoc #

jnest :: SDoc -> SDoc #

addSemi :: SDoc -> SDoc #

jsToDoc :: JsToDoc a => a -> SDoc #

pprStringLit :: IsLine doc => FastString -> doc #

interSemi :: JsRender doc => [doc] -> doc #

braceNest :: JsRender doc => doc -> doc #

The structure `{body}`, optionally indented over multiple lines

hangBrace :: JsRender doc => doc -> doc -> doc #

The structure `hdr {body}`, optionally indented over multiple lines

Orphan instances

Outputable JExpr # 
Instance details

Methods

ppr :: JExpr -> SDoc #

Outputable JVal # 
Instance details

Methods

ppr :: JVal -> SDoc #