{-# LANGUAGE FlexibleInstances, UndecidableInstances #-}
{-# LANGUAGE CPP #-}
module Language.ECMAScript3.PrettyPrint (Pretty (..)
,javaScript
,renderStatements
,renderExpression
,PP (..)
,unsafeInExprStmt
) where
import qualified Text.PrettyPrint.ANSI.Leijen as Pretty
import Text.PrettyPrint.ANSI.Leijen hiding (Pretty, parens)
import Language.ECMAScript3.Syntax
import Prelude hiding (maybe, id)
import qualified Prelude
import Data.Char
import Numeric
{-# DEPRECATED PP, javaScript, renderStatements, renderExpression "These interfaces are outdated and would be removed/hidden in version 1.0. Use the Pretty class instead." #-}
parens :: Doc -> Doc
parens :: Doc -> Doc
parens = Doc -> Doc
Pretty.parens (Doc -> Doc) -> (Doc -> Doc) -> Doc -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Doc -> Doc
align
class Pretty a where
prettyPrint :: a -> Doc
instance Pretty (JavaScript a) where
prettyPrint :: JavaScript a -> Doc
prettyPrint (Script a
_ [Statement a]
ss) = [Statement a] -> Doc
forall a. Pretty a => a -> Doc
prettyPrint [Statement a]
ss
instance Pretty [Statement a] where
prettyPrint :: [Statement a] -> Doc
prettyPrint = [Doc] -> Doc
vcat ([Doc] -> Doc) -> ([Statement a] -> [Doc]) -> [Statement a] -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Statement a -> Doc) -> [Statement a] -> [Doc]
forall a b. (a -> b) -> [a] -> [b]
map Statement a -> Doc
forall a. Pretty a => a -> Doc
prettyPrint
instance Pretty (Expression a) where
prettyPrint :: Expression a -> Doc
prettyPrint = Bool -> Expression a -> Doc
forall a. Bool -> Expression a -> Doc
ppExpression Bool
True
parenList :: (a -> Doc) -> [a] -> Doc
parenList :: forall a. (a -> Doc) -> [a] -> Doc
parenList a -> Doc
ppElem = Doc -> Doc -> Doc -> [Doc] -> Doc
encloseSep (String -> Doc
text String
"(") (String -> Doc
text String
")") Doc
comma ([Doc] -> Doc) -> ([a] -> [Doc]) -> [a] -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> Doc) -> [a] -> [Doc]
forall a b. (a -> b) -> [a] -> [b]
map a -> Doc
ppElem
isIf :: Statement a -> Bool
isIf :: forall a. Statement a -> Bool
isIf IfSingleStmt {} = Bool
True
isIf IfStmt {} = Bool
True
isIf Statement a
_ = Bool
False
instance Pretty (Statement a) where
prettyPrint :: Statement a -> Doc
prettyPrint Statement a
s = case Statement a
s of
BlockStmt a
_ [Statement a]
ss -> [Statement a] -> Doc
forall a. [Statement a] -> Doc
asBlock [Statement a]
ss
EmptyStmt a
_ -> Doc
semi
ExprStmt a
_ Expression a
e | Expression a -> Bool
forall a. Expression a -> Bool
unsafeInExprStmt (Expression a
e) -> Doc -> Doc
parens (Int -> Doc -> Doc
nest Int
4 (Bool -> Expression a -> Doc
forall a. Bool -> Expression a -> Doc
ppExpression Bool
True Expression a
e)) Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Doc
semi
ExprStmt a
_ Expression a
e | Bool
otherwise -> Int -> Doc -> Doc
nest Int
4 (Bool -> Expression a -> Doc
forall a. Bool -> Expression a -> Doc
ppExpression Bool
True Expression a
e) Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Doc
semi
IfSingleStmt a
_ Expression a
test Statement a
cons -> String -> Doc
text String
"if" Doc -> Doc -> Doc
<+>
Doc -> Doc
parens (Bool -> Expression a -> Doc
forall a. Bool -> Expression a -> Doc
ppExpression Bool
True Expression a
test) Doc -> Doc -> Doc
</>
Int -> Statement a -> Doc
forall a. Int -> Statement a -> Doc
indented Int
3 Statement a
cons
IfStmt a
_ Expression a
test Statement a
cons Statement a
alt -> String -> Doc
text String
"if" Doc -> Doc -> Doc
<+> Doc -> Doc
parens (Bool -> Expression a -> Doc
forall a. Bool -> Expression a -> Doc
ppExpression Bool
True Expression a
test) Doc -> Doc -> Doc
</>
Int -> Statement a -> Doc
forall a. Int -> Statement a -> Doc
indented Int
3 Statement a
cons Doc -> Doc -> Doc
</> String -> Doc
text String
"else"
Doc -> Doc -> Doc
<+> if Statement a -> Bool
forall a. Statement a -> Bool
isIf Statement a
alt
then Statement a -> Doc
forall a. Pretty a => a -> Doc
prettyPrint Statement a
alt
else Int -> Statement a -> Doc
forall a. Int -> Statement a -> Doc
indented Int
3 Statement a
alt
SwitchStmt a
_ Expression a
e [CaseClause a]
cases ->
String -> Doc
text String
"switch" Doc -> Doc -> Doc
<+> Doc -> Doc
parens (Bool -> Expression a -> Doc
forall a. Bool -> Expression a -> Doc
ppExpression Bool
True Expression a
e) Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Doc
line Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<>
Int -> Doc -> Doc
ppBlock Int
2 ([Doc] -> Doc
vcat ((CaseClause a -> Doc) -> [CaseClause a] -> [Doc]
forall a b. (a -> b) -> [a] -> [b]
map CaseClause a -> Doc
forall a. Pretty a => a -> Doc
prettyPrint [CaseClause a]
cases))
WhileStmt a
_ Expression a
test Statement a
body -> String -> Doc
text String
"while" Doc -> Doc -> Doc
<+> Doc -> Doc
parens (Bool -> Expression a -> Doc
forall a. Bool -> Expression a -> Doc
ppExpression Bool
True Expression a
test) Doc -> Doc -> Doc
</>
Int -> Statement a -> Doc
forall a. Int -> Statement a -> Doc
indented Int
3 Statement a
body
ReturnStmt a
_ Maybe (Expression a)
Nothing -> String -> Doc
text String
"return" Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Doc
semi
ReturnStmt a
_ (Just Expression a
e) -> String -> Doc
text String
"return" Doc -> Doc -> Doc
<+> Int -> Doc -> Doc
nest Int
4 (Bool -> Expression a -> Doc
forall a. Bool -> Expression a -> Doc
ppExpression Bool
True Expression a
e) Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Doc
semi
DoWhileStmt a
_ Statement a
s Expression a
e ->
String -> Doc
text String
"do" Doc -> Doc -> Doc
</>
(Int -> Statement a -> Doc
forall a. Int -> Statement a -> Doc
indented Int
3 Statement a
s Doc -> Doc -> Doc
</> String -> Doc
text String
"while" Doc -> Doc -> Doc
<+> Doc -> Doc
parens (Bool -> Expression a -> Doc
forall a. Bool -> Expression a -> Doc
ppExpression Bool
True Expression a
e)
Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Doc
semi)
BreakStmt a
_ Maybe (Id a)
Nothing -> String -> Doc
text String
"break" Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Doc
semi
BreakStmt a
_ (Just Id a
label) -> String -> Doc
text String
"break" Doc -> Doc -> Doc
<+> Id a -> Doc
forall a. Pretty a => a -> Doc
prettyPrint Id a
label Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Doc
semi
ContinueStmt a
_ Maybe (Id a)
Nothing -> String -> Doc
text String
"continue" Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Doc
semi
ContinueStmt a
_ (Just Id a
label) -> String -> Doc
textString
"continue" Doc -> Doc -> Doc
<+> Id a -> Doc
forall a. Pretty a => a -> Doc
prettyPrint Id a
label
Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Doc
semi
LabelledStmt a
_ Id a
label Statement a
s -> Id a -> Doc
forall a. Pretty a => a -> Doc
prettyPrint Id a
label Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Doc
colon Doc -> Doc -> Doc
</> Statement a -> Doc
forall a. Pretty a => a -> Doc
prettyPrint Statement a
s
ForInStmt a
p ForInInit a
init Expression a
e Statement a
body ->
String -> Doc
text String
"for" Doc -> Doc -> Doc
<+>
Doc -> Doc
parens (ForInInit a -> Doc
forall a. Pretty a => a -> Doc
prettyPrint ForInInit a
init Doc -> Doc -> Doc
<+> String -> Doc
text String
"in" Doc -> Doc -> Doc
<+> Bool -> Expression a -> Doc
forall a. Bool -> Expression a -> Doc
ppExpression Bool
True Expression a
e) Doc -> Doc -> Doc
</>
Int -> Statement a -> Doc
forall a. Int -> Statement a -> Doc
indented Int
3 Statement a
body
ForStmt a
_ ForInit a
init Maybe (Expression a)
incr Maybe (Expression a)
test Statement a
body ->
String -> Doc
text String
"for" Doc -> Doc -> Doc
<+>
Doc -> Doc
parens (ForInit a -> Doc
forall a. Pretty a => a -> Doc
prettyPrint ForInit a
init Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Doc
semi Doc -> Doc -> Doc
<+> Maybe (Expression a) -> (Expression a -> Doc) -> Doc
forall a. Maybe a -> (a -> Doc) -> Doc
maybe Maybe (Expression a)
incr (Bool -> Expression a -> Doc
forall a. Bool -> Expression a -> Doc
ppExpression Bool
True) Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<>
Doc
semi Doc -> Doc -> Doc
<+> Maybe (Expression a) -> (Expression a -> Doc) -> Doc
forall a. Maybe a -> (a -> Doc) -> Doc
maybe Maybe (Expression a)
test (Bool -> Expression a -> Doc
forall a. Bool -> Expression a -> Doc
ppExpression Bool
True)) Doc -> Doc -> Doc
</>
Int -> Statement a -> Doc
forall a. Int -> Statement a -> Doc
indented Int
3 Statement a
body
TryStmt a
_ Statement a
stmt Maybe (CatchClause a)
mcatch Maybe (Statement a)
mfinally ->
String -> Doc
text String
"try" Doc -> Doc -> Doc
</> Statement a -> Doc
forall a. Statement a -> Doc
inBlock Statement a
stmt Doc -> Doc -> Doc
</> Doc
ppCatch Doc -> Doc -> Doc
</> Doc
ppFinally
where ppFinally :: Doc
ppFinally = case Maybe (Statement a)
mfinally of
Maybe (Statement a)
Nothing -> Doc
empty
Just Statement a
stmt -> String -> Doc
text String
"finally" Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Statement a -> Doc
forall a. Statement a -> Doc
inBlock Statement a
stmt
ppCatch :: Doc
ppCatch = case Maybe (CatchClause a)
mcatch of
Maybe (CatchClause a)
Nothing -> Doc
empty
Just CatchClause a
cc -> CatchClause a -> Doc
forall a. Pretty a => a -> Doc
prettyPrint CatchClause a
cc
ThrowStmt a
_ Expression a
e -> String -> Doc
text String
"throw" Doc -> Doc -> Doc
<+> Bool -> Expression a -> Doc
forall a. Bool -> Expression a -> Doc
ppExpression Bool
True Expression a
e Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Doc
semi
WithStmt a
_ Expression a
e Statement a
s -> String -> Doc
text String
"with" Doc -> Doc -> Doc
<+> Doc -> Doc
parens (Bool -> Expression a -> Doc
forall a. Bool -> Expression a -> Doc
ppExpression Bool
True Expression a
e)
Doc -> Doc -> Doc
</> Int -> Statement a -> Doc
forall a. Int -> Statement a -> Doc
indented Int
3 Statement a
s
VarDeclStmt a
_ [VarDecl a]
decls ->
String -> Doc
text String
"var" Doc -> Doc -> Doc
<+> [Doc] -> Doc
cat (Doc -> [Doc] -> [Doc]
punctuate Doc
comma ((VarDecl a -> Doc) -> [VarDecl a] -> [Doc]
forall a b. (a -> b) -> [a] -> [b]
map (Bool -> VarDecl a -> Doc
forall a. Bool -> VarDecl a -> Doc
ppVarDecl Bool
True) [VarDecl a]
decls))
Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Doc
semi
FunctionStmt a
_ Id a
name [Id a]
args [Statement a]
body ->
String -> Doc
text String
"function" Doc -> Doc -> Doc
<+> Id a -> Doc
forall a. Pretty a => a -> Doc
prettyPrint Id a
name Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<>
(Id a -> Doc) -> [Id a] -> Doc
forall a. (a -> Doc) -> [a] -> Doc
parenList Id a -> Doc
forall a. Pretty a => a -> Doc
prettyPrint [Id a]
args Doc -> Doc -> Doc
<+>
[Statement a] -> Doc
forall a. [Statement a] -> Doc
asBlock [Statement a]
body
unsafeInExprStmt :: Expression a -> Bool
unsafeInExprStmt :: forall a. Expression a -> Bool
unsafeInExprStmt = Integer -> Expression a -> Bool
forall {t} {a}. (Ord t, Num t) => t -> Expression a -> Bool
unsafeInExprStmt_ Integer
15
where unsafeInExprStmt_ :: t -> Expression a -> Bool
unsafeInExprStmt_ t
prec Expression a
e =
case Expression a
e of
ObjectLit {} -> Bool
True
DotRef a
_ Expression a
obj Id a
_ | t
prec t -> t -> Bool
forall a. Ord a => a -> a -> Bool
>= t
1 -> t -> Expression a -> Bool
unsafeInExprStmt_ t
1 Expression a
obj
BracketRef a
_ Expression a
obj Expression a
_ | t
prec t -> t -> Bool
forall a. Ord a => a -> a -> Bool
> t
0 -> t -> Expression a -> Bool
unsafeInExprStmt_ t
1 Expression a
obj
UnaryAssignExpr a
a UnaryAssignOp
op LValue a
lv | (UnaryAssignOp
op UnaryAssignOp -> [UnaryAssignOp] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [UnaryAssignOp
PostfixInc, UnaryAssignOp
PostfixDec])
Bool -> Bool -> Bool
&& (t
prec t -> t -> Bool
forall a. Ord a => a -> a -> Bool
> t
3) -> t -> LValue a -> Bool
unsafeLv t
2 LValue a
lv
InfixExpr a
_ InfixOp
_ Expression a
l Expression a
_ | t
prec t -> t -> Bool
forall a. Ord a => a -> a -> Bool
>= t
5 -> t -> Expression a -> Bool
unsafeInExprStmt_ t
5 Expression a
l
CondExpr a
_ Expression a
c Expression a
_ Expression a
_ | t
prec t -> t -> Bool
forall a. Ord a => a -> a -> Bool
>= t
12 -> t -> Expression a -> Bool
unsafeInExprStmt_ t
12 Expression a
c
AssignExpr a
_ AssignOp
_ LValue a
lv Expression a
_ | t
prec t -> t -> Bool
forall a. Ord a => a -> a -> Bool
>= t
13 -> t -> LValue a -> Bool
unsafeLv t
2 LValue a
lv
ListExpr a
_ (Expression a
e:[Expression a]
_) | t
prec t -> t -> Bool
forall a. Ord a => a -> a -> Bool
>= t
14 -> t -> Expression a -> Bool
unsafeInExprStmt_ t
14 Expression a
e
CallExpr a
_ Expression a
e [Expression a]
_ | t
prec t -> t -> Bool
forall a. Ord a => a -> a -> Bool
>= t
2 -> t -> Expression a -> Bool
unsafeInExprStmt_ t
2 Expression a
e
FuncExpr {} -> Bool
True
Expression a
_ -> Bool
False
unsafeLv :: t -> LValue a -> Bool
unsafeLv t
prec LValue a
lv = case LValue a
lv of
LVar {} -> Bool
False
LDot a
_ Expression a
obj String
_ -> t -> Expression a -> Bool
unsafeInExprStmt_ t
prec Expression a
obj
LBracket a
_ Expression a
obj Expression a
_ -> t -> Expression a -> Bool
unsafeInExprStmt_ t
prec Expression a
obj
instance Pretty (CatchClause a) where
prettyPrint :: CatchClause a -> Doc
prettyPrint (CatchClause a
_ Id a
id Statement a
s) =
String -> Doc
text String
"catch" Doc -> Doc -> Doc
<+> (Doc -> Doc
parens(Doc -> Doc) -> (Id a -> Doc) -> Id a -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
.Id a -> Doc
forall a. Pretty a => a -> Doc
prettyPrint) Id a
id Doc -> Doc -> Doc
<+> Statement a -> Doc
forall a. Statement a -> Doc
inBlock Statement a
s
instance Pretty (ForInit a) where
prettyPrint :: ForInit a -> Doc
prettyPrint ForInit a
t = case ForInit a
t of
ForInit a
NoInit -> Doc
empty
VarInit [VarDecl a]
vs -> String -> Doc
text String
"var"
Doc -> Doc -> Doc
<+> [Doc] -> Doc
cat (Doc -> [Doc] -> [Doc]
punctuate Doc
comma ([Doc] -> [Doc]) -> [Doc] -> [Doc]
forall a b. (a -> b) -> a -> b
$ (VarDecl a -> Doc) -> [VarDecl a] -> [Doc]
forall a b. (a -> b) -> [a] -> [b]
map (Bool -> VarDecl a -> Doc
forall a. Bool -> VarDecl a -> Doc
ppVarDecl Bool
False) [VarDecl a]
vs)
ExprInit Expression a
e -> Bool -> Expression a -> Doc
forall a. Bool -> Expression a -> Doc
ppExpression Bool
False Expression a
e
instance Pretty (ForInInit a) where
prettyPrint :: ForInInit a -> Doc
prettyPrint ForInInit a
t = case ForInInit a
t of
ForInVar Id a
id -> String -> Doc
text String
"var" Doc -> Doc -> Doc
<+> Id a -> Doc
forall a. Pretty a => a -> Doc
prettyPrint Id a
id
ForInLVal LValue a
lv -> LValue a -> Doc
forall a. Pretty a => a -> Doc
prettyPrint LValue a
lv
instance Pretty (LValue a) where
prettyPrint :: LValue a -> Doc
prettyPrint LValue a
lv = case LValue a
lv of
LVar a
_ String
x -> String -> Doc
printIdentifierName String
x
LDot a
_ Expression a
e String
x -> Expression a -> (Expression a -> Doc) -> Doc
forall a. Expression a -> (Expression a -> Doc) -> Doc
ppObjInDotRef Expression a
e Expression a -> Doc
forall a. Expression a -> Doc
ppMemberExpression Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> String -> Doc
text String
"." Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> String -> Doc
printIdentifierName String
x
LBracket a
_ Expression a
e1 Expression a
e2 -> Expression a -> Doc
forall a. Expression a -> Doc
ppMemberExpression Expression a
e1 Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<>
Doc -> Doc
brackets (Bool -> Expression a -> Doc
forall a. Bool -> Expression a -> Doc
ppExpression Bool
True Expression a
e2)
instance Pretty (VarDecl a) where
prettyPrint :: VarDecl a -> Doc
prettyPrint = Bool -> VarDecl a -> Doc
forall a. Bool -> VarDecl a -> Doc
ppVarDecl Bool
True
instance Pretty (CaseClause a) where
prettyPrint :: CaseClause a -> Doc
prettyPrint CaseClause a
c = case CaseClause a
c of
CaseClause a
_ Expression a
e [Statement a]
ss ->
String -> Doc
text String
"case" Doc -> Doc -> Doc
<+> Bool -> Expression a -> Doc
forall a. Bool -> Expression a -> Doc
ppExpression Bool
True Expression a
e Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> [Statement a] -> Doc
suffix [Statement a]
ss
CaseDefault a
_ [Statement a]
ss ->
String -> Doc
text String
"default" Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> [Statement a] -> Doc
suffix [Statement a]
ss
where
suffix :: [Statement a] -> Doc
suffix :: [Statement a] -> Doc
suffix [] = Doc
colon
suffix [Statement a]
ss = Doc
colon Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Int -> Doc -> Doc
nest Int
2 (Doc
linebreak Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> [Statement a] -> Doc
forall a. Pretty a => a -> Doc
prettyPrint [Statement a]
ss)
instance Pretty InfixOp where
prettyPrint :: InfixOp -> Doc
prettyPrint InfixOp
op = String -> Doc
text (String -> Doc) -> String -> Doc
forall a b. (a -> b) -> a -> b
$ case InfixOp
op of
InfixOp
OpMul -> String
"*"
InfixOp
OpDiv -> String
"/"
InfixOp
OpMod -> String
"%"
InfixOp
OpAdd -> String
"+"
InfixOp
OpSub -> String
"-"
InfixOp
OpLShift -> String
"<<"
InfixOp
OpSpRShift -> String
">>"
InfixOp
OpZfRShift -> String
">>>"
InfixOp
OpLT -> String
"<"
InfixOp
OpLEq -> String
"<="
InfixOp
OpGT -> String
">"
InfixOp
OpGEq -> String
">="
InfixOp
OpIn -> String
"in"
InfixOp
OpInstanceof -> String
"instanceof"
InfixOp
OpEq -> String
"=="
InfixOp
OpNEq -> String
"!="
InfixOp
OpStrictEq -> String
"==="
InfixOp
OpStrictNEq -> String
"!=="
InfixOp
OpBAnd -> String
"&"
InfixOp
OpBXor -> String
"^"
InfixOp
OpBOr -> String
"|"
InfixOp
OpLAnd -> String
"&&"
InfixOp
OpLOr -> String
"||"
instance Pretty AssignOp where
prettyPrint :: AssignOp -> Doc
prettyPrint AssignOp
op = String -> Doc
text (String -> Doc) -> String -> Doc
forall a b. (a -> b) -> a -> b
$ case AssignOp
op of
AssignOp
OpAssign -> String
"="
AssignOp
OpAssignAdd -> String
"+="
AssignOp
OpAssignSub -> String
"-="
AssignOp
OpAssignMul -> String
"*="
AssignOp
OpAssignDiv -> String
"/="
AssignOp
OpAssignMod -> String
"%="
AssignOp
OpAssignLShift -> String
"<<="
AssignOp
OpAssignSpRShift -> String
">>="
AssignOp
OpAssignZfRShift -> String
">>>="
AssignOp
OpAssignBAnd -> String
"&="
AssignOp
OpAssignBXor -> String
"^="
AssignOp
OpAssignBOr -> String
"|="
instance Pretty PrefixOp where
prettyPrint :: PrefixOp -> Doc
prettyPrint PrefixOp
op = String -> Doc
text (String -> Doc) -> String -> Doc
forall a b. (a -> b) -> a -> b
$ case PrefixOp
op of
PrefixOp
PrefixLNot -> String
"!"
PrefixOp
PrefixBNot -> String
"~"
PrefixOp
PrefixPlus -> String
"+"
PrefixOp
PrefixMinus -> String
"-"
PrefixOp
PrefixTypeof -> String
"typeof"
PrefixOp
PrefixVoid -> String
"void"
PrefixOp
PrefixDelete -> String
"delete"
instance Pretty (Prop a) where
prettyPrint :: Prop a -> Doc
prettyPrint Prop a
p = case Prop a
p of
PropId a
_ Id a
id -> Id a -> Doc
forall a. Pretty a => a -> Doc
prettyPrint Id a
id
PropString a
_ String
str -> Doc -> Doc
dquotes (Doc -> Doc) -> Doc -> Doc
forall a b. (a -> b) -> a -> b
$ String -> Doc
text (String -> Doc) -> String -> Doc
forall a b. (a -> b) -> a -> b
$ String -> String
jsEscape String
str
PropNum a
_ Integer
n -> String -> Doc
text (Integer -> String
forall a. Show a => a -> String
show Integer
n)
instance Pretty (Id a) where
prettyPrint :: Id a -> Doc
prettyPrint (Id a
_ String
str) = String -> Doc
printIdentifierName String
str
class PP a where
pp :: a -> Doc
instance Pretty a => PP a where
pp :: a -> Doc
pp = a -> Doc
forall a. Pretty a => a -> Doc
prettyPrint
javaScript :: JavaScript a -> Doc
javaScript :: forall a. JavaScript a -> Doc
javaScript = JavaScript a -> Doc
forall a. Pretty a => a -> Doc
prettyPrint
renderStatements :: [Statement a] -> String
renderStatements :: forall a. [Statement a] -> String
renderStatements = Doc -> String
forall a. Show a => a -> String
show (Doc -> String)
-> ([Statement a] -> Doc) -> [Statement a] -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Statement a] -> Doc
forall a. Pretty a => a -> Doc
prettyPrint
renderExpression :: Expression a -> String
renderExpression :: forall a. Expression a -> String
renderExpression = Doc -> String
forall a. Show a => a -> String
show (Doc -> String) -> (Expression a -> Doc) -> Expression a -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Expression a -> Doc
forall a. Pretty a => a -> Doc
prettyPrint
indented :: Int -> Statement a -> Doc
indented :: forall a. Int -> Statement a -> Doc
indented Int
_ stmt :: Statement a
stmt@BlockStmt {} = Statement a -> Doc
forall a. Pretty a => a -> Doc
prettyPrint Statement a
stmt
indented Int
width Statement a
stmt = Int -> Doc -> Doc
indent Int
width (Statement a -> Doc
forall a. Pretty a => a -> Doc
prettyPrint Statement a
stmt)
inBlock:: Statement a -> Doc
inBlock :: forall a. Statement a -> Doc
inBlock s :: Statement a
s@(BlockStmt a
_ [Statement a]
_) = Statement a -> Doc
forall a. Pretty a => a -> Doc
prettyPrint Statement a
s
inBlock Statement a
s = [Statement a] -> Doc
forall a. [Statement a] -> Doc
asBlock [Statement a
s]
asBlock :: [Statement a] -> Doc
asBlock :: forall a. [Statement a] -> Doc
asBlock [] = Doc
lbrace Doc -> Doc -> Doc
<$$> Doc
rbrace
asBlock [Statement a]
ss = Int -> Doc -> Doc
ppBlock Int
3 ([Statement a] -> Doc
forall a. Pretty a => a -> Doc
prettyPrint [Statement a]
ss)
ppBlock :: Int -> Doc -> Doc
ppBlock :: Int -> Doc -> Doc
ppBlock Int
width Doc
doc = Doc
lbrace Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Int -> Doc -> Doc
nest Int
width (Doc
line Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Doc
doc) Doc -> Doc -> Doc
<$$> Doc
rbrace
ppVarDecl :: Bool -> VarDecl a -> Doc
ppVarDecl :: forall a. Bool -> VarDecl a -> Doc
ppVarDecl Bool
hasIn VarDecl a
vd = case VarDecl a
vd of
VarDecl a
_ Id a
id Maybe (Expression a)
Nothing -> Id a -> Doc
forall a. Pretty a => a -> Doc
prettyPrint Id a
id
VarDecl a
_ Id a
id (Just Expression a
e) ->
Id a -> Doc
forall a. Pretty a => a -> Doc
prettyPrint Id a
id Doc -> Doc -> Doc
<+> Doc
equals
Doc -> Doc -> Doc
</> Doc -> Doc
maybeAlign (Bool -> Expression a -> Doc
forall a. Bool -> Expression a -> Doc
ppAssignmentExpression Bool
hasIn Expression a
e)
where
maybeAlign :: Doc -> Doc
maybeAlign =
case Expression a
e of
FuncExpr {} -> Doc -> Doc
forall a. a -> a
Prelude.id
Expression a
_ -> Doc -> Doc
align
printIdentifierName :: String -> Doc
printIdentifierName :: String -> Doc
printIdentifierName = String -> Doc
text
jsEscape:: String -> String
jsEscape :: String -> String
jsEscape String
"" = String
""
jsEscape (Char
ch:String
chs) = Char -> String
sel Char
ch String -> String -> String
forall a. [a] -> [a] -> [a]
++ String -> String
jsEscape String
chs where
sel :: Char -> String
sel Char
'\b' = String
"\\b"
sel Char
'\f' = String
"\\f"
sel Char
'\n' = String
"\\n"
sel Char
'\r' = String
"\\r"
sel Char
'\t' = String
"\\t"
sel Char
'\v' = String
"\\v"
sel Char
'\'' = String
"\\'"
sel Char
'\"' = String
"\\\""
sel Char
'\\' = String
"\\\\"
sel Char
x = [Char
x]
regexpEscape :: String -> String
regexpEscape :: String -> String
regexpEscape = Bool -> String -> String
regexpEscapeChar Bool
True
where regexpEscapeChar :: Bool
-> String -> String
regexpEscapeChar :: Bool -> String -> String
regexpEscapeChar Bool
first String
s =
case (String
s, Bool
first) of
(String
"", Bool
True) -> String
"(?:)"
(String
"", Bool
False)-> String
""
(String
"\\", Bool
_) -> String
"\\\\"
(Char
'\\':Char
c:String
rest, Bool
_) -> Char
'\\'Char -> String -> String
forall a. a -> [a] -> [a]
:Char
cChar -> String -> String
forall a. a -> [a] -> [a]
:(Bool -> String -> String
regexpEscapeChar Bool
False String
rest)
(Char
'/':String
rest, Bool
_) -> Char
'\\'Char -> String -> String
forall a. a -> [a] -> [a]
:Char
'/'Char -> String -> String
forall a. a -> [a] -> [a]
:Bool -> String -> String
regexpEscapeChar Bool
False String
rest
(Char
'*':String
rest, Bool
True) -> (Char
'\\'Char -> String -> String
forall a. a -> [a] -> [a]
:Char
'*'Char -> String -> String
forall a. a -> [a] -> [a]
:Bool -> String -> String
regexpEscapeChar Bool
False String
rest)
(Char
c:String
rest, Bool
_) -> Char
cChar -> String -> String
forall a. a -> [a] -> [a]
:Bool -> String -> String
regexpEscapeChar Bool
False String
rest
ppPrimaryExpression :: Expression a -> Doc
ppPrimaryExpression :: forall a. Expression a -> Doc
ppPrimaryExpression Expression a
e = case Expression a
e of
ThisRef a
_ -> String -> Doc
text String
"this"
VarRef a
_ Id a
id -> Id a -> Doc
forall a. Pretty a => a -> Doc
prettyPrint Id a
id
NullLit a
_ -> String -> Doc
text String
"null"
BoolLit a
_ Bool
True -> String -> Doc
text String
"true"
BoolLit a
_ Bool
False -> String -> Doc
text String
"false"
NumLit a
_ Double
n -> Double -> Doc
double Double
n
IntLit a
_ Int
n -> Int -> Doc
int Int
n
StringLit a
_ String
str -> Doc -> Doc
dquotes (Doc -> Doc) -> Doc -> Doc
forall a b. (a -> b) -> a -> b
$ String -> Doc
text (String -> Doc) -> String -> Doc
forall a b. (a -> b) -> a -> b
$ String -> String
jsEscape String
str
RegexpLit a
_ String
reg Bool
g Bool
ci -> String -> Doc
text String
"/" Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> (String -> Doc
text (String -> String
regexpEscape String
reg)) Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> String -> Doc
text String
"/" Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<>
(if Bool
g then String -> Doc
text String
"g" else Doc
empty) Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<>
(if Bool
ci then String -> Doc
text String
"i" else Doc
empty)
ArrayLit a
_ [Expression a]
es -> [Doc] -> Doc
list ([Doc] -> Doc) -> [Doc] -> Doc
forall a b. (a -> b) -> a -> b
$ (Expression a -> Doc) -> [Expression a] -> [Doc]
forall a b. (a -> b) -> [a] -> [b]
map (Bool -> Expression a -> Doc
forall a. Bool -> Expression a -> Doc
ppAssignmentExpression Bool
True) [Expression a]
es
ObjectLit a
_ [(Prop a, Expression a)]
xs -> Doc -> Doc -> Doc -> [Doc] -> Doc
encloseSep Doc
lbrace Doc
rbrace Doc
comma ([Doc] -> Doc) -> [Doc] -> Doc
forall a b. (a -> b) -> a -> b
$ ((Prop a, Expression a) -> Doc)
-> [(Prop a, Expression a)] -> [Doc]
forall a b. (a -> b) -> [a] -> [b]
map (Prop a, Expression a) -> Doc
forall {a} {a}. Pretty a => (a, Expression a) -> Doc
ppField [(Prop a, Expression a)]
xs
where ppField :: (a, Expression a) -> Doc
ppField (a
f,Expression a
v)= a -> Doc
forall a. Pretty a => a -> Doc
prettyPrint a
f Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Doc
colon Doc -> Doc -> Doc
<+> Bool -> Expression a -> Doc
forall a. Bool -> Expression a -> Doc
ppAssignmentExpression Bool
True Expression a
v
Expression a
_ -> Doc -> Doc
parens (Doc -> Doc) -> Doc -> Doc
forall a b. (a -> b) -> a -> b
$ Bool -> Expression a -> Doc
forall a. Bool -> Expression a -> Doc
ppExpression Bool
True Expression a
e
ppMemberExpression :: Expression a -> Doc
ppMemberExpression :: forall a. Expression a -> Doc
ppMemberExpression Expression a
e = case Expression a
e of
FuncExpr a
_ Maybe (Id a)
name [Id a]
params [Statement a]
body ->
String -> Doc
text String
"function" Doc -> Doc -> Doc
<+> Maybe (Id a) -> (Id a -> Doc) -> Doc
forall a. Maybe a -> (a -> Doc) -> Doc
maybe Maybe (Id a)
name (\Id a
n -> Id a -> Doc
forall a. Pretty a => a -> Doc
prettyPrint Id a
n Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Doc
space) Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<>
(Id a -> Doc) -> [Id a] -> Doc
forall a. (a -> Doc) -> [a] -> Doc
parenList Id a -> Doc
forall a. Pretty a => a -> Doc
prettyPrint [Id a]
params Doc -> Doc -> Doc
<+>
[Statement a] -> Doc
forall a. [Statement a] -> Doc
asBlock [Statement a]
body
DotRef a
_ Expression a
obj Id a
id -> Expression a -> (Expression a -> Doc) -> Doc
forall a. Expression a -> (Expression a -> Doc) -> Doc
ppObjInDotRef Expression a
obj Expression a -> Doc
forall a. Expression a -> Doc
ppMemberExpression Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> String -> Doc
text String
"." Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Id a -> Doc
forall a. Pretty a => a -> Doc
prettyPrint Id a
id
BracketRef a
_ Expression a
obj Expression a
key ->
Expression a -> Doc
forall a. Expression a -> Doc
ppMemberExpression Expression a
obj Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Doc -> Doc
brackets (Bool -> Expression a -> Doc
forall a. Bool -> Expression a -> Doc
ppExpression Bool
True Expression a
key)
NewExpr a
_ Expression a
ctor [Expression a]
args ->
String -> Doc
text String
"new" Doc -> Doc -> Doc
<+> Expression a -> Doc
forall a. Expression a -> Doc
ppMemberExpression Expression a
ctor Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> [Expression a] -> Doc
forall a. [Expression a] -> Doc
ppArguments [Expression a]
args
Expression a
_ -> Expression a -> Doc
forall a. Expression a -> Doc
ppPrimaryExpression Expression a
e
ppCallExpression :: Expression a -> Doc
ppCallExpression :: forall a. Expression a -> Doc
ppCallExpression Expression a
e = case Expression a
e of
CallExpr a
_ Expression a
f [Expression a]
args -> Expression a -> Doc
forall a. Expression a -> Doc
ppCallExpression Expression a
f Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> [Expression a] -> Doc
forall a. [Expression a] -> Doc
ppArguments [Expression a]
args
DotRef a
_ Expression a
obj Id a
id -> Expression a -> (Expression a -> Doc) -> Doc
forall a. Expression a -> (Expression a -> Doc) -> Doc
ppObjInDotRef Expression a
obj Expression a -> Doc
forall a. Expression a -> Doc
ppCallExpression Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> String -> Doc
text String
"." Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Id a -> Doc
forall a. Pretty a => a -> Doc
prettyPrint Id a
id
BracketRef a
_ Expression a
obj Expression a
key -> Expression a -> Doc
forall a. Expression a -> Doc
ppCallExpression Expression a
obj
Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Doc -> Doc
brackets (Bool -> Expression a -> Doc
forall a. Bool -> Expression a -> Doc
ppExpression Bool
True Expression a
key)
Expression a
_ -> Expression a -> Doc
forall a. Expression a -> Doc
ppMemberExpression Expression a
e
ppObjInDotRef :: Expression a -> (Expression a -> Doc) -> Doc
ppObjInDotRef :: forall a. Expression a -> (Expression a -> Doc) -> Doc
ppObjInDotRef i :: Expression a
i@(IntLit a
_ Int
_) Expression a -> Doc
_ = Doc -> Doc
parens (Expression a -> Doc
forall a. Expression a -> Doc
ppPrimaryExpression Expression a
i)
ppObjInDotRef Expression a
e Expression a -> Doc
p = Expression a -> Doc
p Expression a
e
ppArguments :: [Expression a] -> Doc
ppArguments :: forall a. [Expression a] -> Doc
ppArguments = (Expression a -> Doc) -> [Expression a] -> Doc
forall a. (a -> Doc) -> [a] -> Doc
parenList (Bool -> Expression a -> Doc
forall a. Bool -> Expression a -> Doc
ppAssignmentExpression Bool
True)
ppLHSExpression :: Expression a -> Doc
ppLHSExpression :: forall a. Expression a -> Doc
ppLHSExpression = Expression a -> Doc
forall a. Expression a -> Doc
ppCallExpression
ppPostfixExpression :: Expression a -> Doc
ppPostfixExpression :: forall a. Expression a -> Doc
ppPostfixExpression Expression a
e = case Expression a
e of
UnaryAssignExpr a
_ UnaryAssignOp
PostfixInc LValue a
e' -> LValue a -> Doc
forall a. Pretty a => a -> Doc
prettyPrint LValue a
e' Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> String -> Doc
text String
"++"
UnaryAssignExpr a
_ UnaryAssignOp
PostfixDec LValue a
e' -> LValue a -> Doc
forall a. Pretty a => a -> Doc
prettyPrint LValue a
e' Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> String -> Doc
text String
"--"
Expression a
_ -> Expression a -> Doc
forall a. Expression a -> Doc
ppLHSExpression Expression a
e
ppUnaryExpression :: Expression a -> Doc
ppUnaryExpression :: forall a. Expression a -> Doc
ppUnaryExpression Expression a
e = case Expression a
e of
PrefixExpr a
_ PrefixOp
op Expression a
e' -> PrefixOp -> Doc
forall a. Pretty a => a -> Doc
prettyPrint PrefixOp
op Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> PrefixOp -> Doc
prefixSpace PrefixOp
op Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Expression a -> Doc
forall a. Expression a -> Doc
ppUnaryExpression Expression a
e'
UnaryAssignExpr a
_ UnaryAssignOp
PrefixInc LValue a
e' -> String -> Doc
text String
"++" Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> LValue a -> Doc
forall a. Pretty a => a -> Doc
prettyPrint LValue a
e'
UnaryAssignExpr a
_ UnaryAssignOp
PrefixDec LValue a
e' -> String -> Doc
text String
"--" Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> LValue a -> Doc
forall a. Pretty a => a -> Doc
prettyPrint LValue a
e'
Expression a
_ -> Expression a -> Doc
forall a. Expression a -> Doc
ppPostfixExpression Expression a
e
prefixSpace :: PrefixOp -> Doc
prefixSpace :: PrefixOp -> Doc
prefixSpace PrefixOp
op = case PrefixOp
op of
PrefixOp
PrefixLNot -> Doc
empty
PrefixOp
PrefixBNot -> Doc
empty
PrefixOp
PrefixPlus -> Doc
empty
PrefixOp
PrefixMinus -> Doc
empty
PrefixOp
PrefixTypeof -> Doc
space
PrefixOp
PrefixVoid -> Doc
space
PrefixOp
PrefixDelete -> Doc
space
ppMultiplicativeExpression :: Expression a -> Doc
ppMultiplicativeExpression :: forall a. Expression a -> Doc
ppMultiplicativeExpression Expression a
e = case Expression a
e of
InfixExpr a
_ InfixOp
op Expression a
e1 Expression a
e2 | InfixOp
op InfixOp -> [InfixOp] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [InfixOp
OpMul, InfixOp
OpDiv, InfixOp
OpMod] ->
Expression a -> Doc
forall a. Expression a -> Doc
ppMultiplicativeExpression Expression a
e1 Doc -> Doc -> Doc
</> InfixOp -> Doc
forall a. Pretty a => a -> Doc
prettyPrint InfixOp
op Doc -> Doc -> Doc
</> Expression a -> Doc
forall a. Expression a -> Doc
ppUnaryExpression Expression a
e2
Expression a
_ -> Expression a -> Doc
forall a. Expression a -> Doc
ppUnaryExpression Expression a
e
ppAdditiveExpression :: Expression a -> Doc
ppAdditiveExpression :: forall a. Expression a -> Doc
ppAdditiveExpression Expression a
e = case Expression a
e of
InfixExpr a
_ InfixOp
op Expression a
e1 Expression a
e2 | InfixOp
op InfixOp -> [InfixOp] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [InfixOp
OpAdd, InfixOp
OpSub] ->
Expression a -> Doc
forall a. Expression a -> Doc
ppAdditiveExpression Expression a
e1 Doc -> Doc -> Doc
</> InfixOp -> Doc
forall a. Pretty a => a -> Doc
prettyPrint InfixOp
op
Doc -> Doc -> Doc
</> Expression a -> Doc
forall a. Expression a -> Doc
ppMultiplicativeExpression Expression a
e2
Expression a
_ -> Expression a -> Doc
forall a. Expression a -> Doc
ppMultiplicativeExpression Expression a
e
ppShiftExpression :: Expression a -> Doc
ppShiftExpression :: forall a. Expression a -> Doc
ppShiftExpression Expression a
e = case Expression a
e of
InfixExpr a
_ InfixOp
op Expression a
e1 Expression a
e2 | InfixOp
op InfixOp -> [InfixOp] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [InfixOp
OpLShift, InfixOp
OpSpRShift, InfixOp
OpZfRShift] ->
Expression a -> Doc
forall a. Expression a -> Doc
ppShiftExpression Expression a
e1 Doc -> Doc -> Doc
</> InfixOp -> Doc
forall a. Pretty a => a -> Doc
prettyPrint InfixOp
op Doc -> Doc -> Doc
</> Expression a -> Doc
forall a. Expression a -> Doc
ppAdditiveExpression Expression a
e2
Expression a
_ -> Expression a -> Doc
forall a. Expression a -> Doc
ppAdditiveExpression Expression a
e
ppRelationalExpression :: Bool -> Expression a -> Doc
ppRelationalExpression :: forall a. Bool -> Expression a -> Doc
ppRelationalExpression Bool
hasIn Expression a
e =
let opsNoIn :: [InfixOp]
opsNoIn = [InfixOp
OpLT, InfixOp
OpGT, InfixOp
OpLEq, InfixOp
OpGEq, InfixOp
OpInstanceof]
ops :: [InfixOp]
ops = if Bool
hasIn then InfixOp
OpInInfixOp -> [InfixOp] -> [InfixOp]
forall a. a -> [a] -> [a]
:[InfixOp]
opsNoIn else [InfixOp]
opsNoIn
in case Expression a
e of
InfixExpr a
_ InfixOp
op Expression a
e1 Expression a
e2 | InfixOp
op InfixOp -> [InfixOp] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [InfixOp]
ops ->
Bool -> Expression a -> Doc
forall a. Bool -> Expression a -> Doc
ppRelationalExpression Bool
hasIn Expression a
e1 Doc -> Doc -> Doc
</> InfixOp -> Doc
forall a. Pretty a => a -> Doc
prettyPrint InfixOp
op
Doc -> Doc -> Doc
</> Expression a -> Doc
forall a. Expression a -> Doc
ppShiftExpression Expression a
e2
Expression a
_ -> Expression a -> Doc
forall a. Expression a -> Doc
ppShiftExpression Expression a
e
ppEqualityExpression :: Bool -> Expression a -> Doc
ppEqualityExpression :: forall a. Bool -> Expression a -> Doc
ppEqualityExpression Bool
hasIn Expression a
e = case Expression a
e of
InfixExpr a
_ InfixOp
op Expression a
e1 Expression a
e2 | InfixOp
op InfixOp -> [InfixOp] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [InfixOp
OpEq, InfixOp
OpNEq, InfixOp
OpStrictEq, InfixOp
OpStrictNEq] ->
Bool -> Expression a -> Doc
forall a. Bool -> Expression a -> Doc
ppEqualityExpression Bool
hasIn Expression a
e1 Doc -> Doc -> Doc
</> InfixOp -> Doc
forall a. Pretty a => a -> Doc
prettyPrint InfixOp
op Doc -> Doc -> Doc
</>
Bool -> Expression a -> Doc
forall a. Bool -> Expression a -> Doc
ppRelationalExpression Bool
hasIn Expression a
e2
Expression a
_ -> Bool -> Expression a -> Doc
forall a. Bool -> Expression a -> Doc
ppRelationalExpression Bool
hasIn Expression a
e
ppBitwiseANDExpression :: Bool -> Expression a -> Doc
ppBitwiseANDExpression :: forall a. Bool -> Expression a -> Doc
ppBitwiseANDExpression Bool
hasIn Expression a
e = case Expression a
e of
InfixExpr a
_ op :: InfixOp
op@InfixOp
OpBAnd Expression a
e1 Expression a
e2 -> Bool -> Expression a -> Doc
forall a. Bool -> Expression a -> Doc
ppBitwiseANDExpression Bool
hasIn Expression a
e1 Doc -> Doc -> Doc
</>
InfixOp -> Doc
forall a. Pretty a => a -> Doc
prettyPrint InfixOp
op Doc -> Doc -> Doc
</>
Bool -> Expression a -> Doc
forall a. Bool -> Expression a -> Doc
ppEqualityExpression Bool
hasIn Expression a
e2
Expression a
_ -> Bool -> Expression a -> Doc
forall a. Bool -> Expression a -> Doc
ppEqualityExpression Bool
hasIn Expression a
e
ppBitwiseXORExpression :: Bool -> Expression a -> Doc
ppBitwiseXORExpression :: forall a. Bool -> Expression a -> Doc
ppBitwiseXORExpression Bool
hasIn Expression a
e = case Expression a
e of
InfixExpr a
_ op :: InfixOp
op@InfixOp
OpBXor Expression a
e1 Expression a
e2 -> Bool -> Expression a -> Doc
forall a. Bool -> Expression a -> Doc
ppBitwiseXORExpression Bool
hasIn Expression a
e1 Doc -> Doc -> Doc
</>
InfixOp -> Doc
forall a. Pretty a => a -> Doc
prettyPrint InfixOp
op Doc -> Doc -> Doc
</>
Bool -> Expression a -> Doc
forall a. Bool -> Expression a -> Doc
ppBitwiseANDExpression Bool
hasIn Expression a
e2
Expression a
_ -> Bool -> Expression a -> Doc
forall a. Bool -> Expression a -> Doc
ppBitwiseANDExpression Bool
hasIn Expression a
e
ppBitwiseORExpression :: Bool -> Expression a -> Doc
ppBitwiseORExpression :: forall a. Bool -> Expression a -> Doc
ppBitwiseORExpression Bool
hasIn Expression a
e = case Expression a
e of
InfixExpr a
_ op :: InfixOp
op@InfixOp
OpBOr Expression a
e1 Expression a
e2 -> Bool -> Expression a -> Doc
forall a. Bool -> Expression a -> Doc
ppBitwiseORExpression Bool
hasIn Expression a
e1 Doc -> Doc -> Doc
</>
InfixOp -> Doc
forall a. Pretty a => a -> Doc
prettyPrint InfixOp
op Doc -> Doc -> Doc
</>
Bool -> Expression a -> Doc
forall a. Bool -> Expression a -> Doc
ppBitwiseXORExpression Bool
hasIn Expression a
e2
Expression a
_ -> Bool -> Expression a -> Doc
forall a. Bool -> Expression a -> Doc
ppBitwiseXORExpression Bool
hasIn Expression a
e
ppLogicalANDExpression :: Bool -> Expression a -> Doc
ppLogicalANDExpression :: forall a. Bool -> Expression a -> Doc
ppLogicalANDExpression Bool
hasIn Expression a
e = case Expression a
e of
InfixExpr a
_ op :: InfixOp
op@InfixOp
OpLAnd Expression a
e1 Expression a
e2 -> Bool -> Expression a -> Doc
forall a. Bool -> Expression a -> Doc
ppLogicalANDExpression Bool
hasIn Expression a
e1 Doc -> Doc -> Doc
</>
InfixOp -> Doc
forall a. Pretty a => a -> Doc
prettyPrint InfixOp
op Doc -> Doc -> Doc
</>
Bool -> Expression a -> Doc
forall a. Bool -> Expression a -> Doc
ppBitwiseORExpression Bool
hasIn Expression a
e2
Expression a
_ -> Bool -> Expression a -> Doc
forall a. Bool -> Expression a -> Doc
ppBitwiseORExpression Bool
hasIn Expression a
e
ppLogicalORExpression :: Bool -> Expression a -> Doc
ppLogicalORExpression :: forall a. Bool -> Expression a -> Doc
ppLogicalORExpression Bool
hasIn Expression a
e = case Expression a
e of
InfixExpr a
_ op :: InfixOp
op@InfixOp
OpLOr Expression a
e1 Expression a
e2 -> Bool -> Expression a -> Doc
forall a. Bool -> Expression a -> Doc
ppLogicalORExpression Bool
hasIn Expression a
e1 Doc -> Doc -> Doc
</>
InfixOp -> Doc
forall a. Pretty a => a -> Doc
prettyPrint InfixOp
op Doc -> Doc -> Doc
</>
Bool -> Expression a -> Doc
forall a. Bool -> Expression a -> Doc
ppLogicalANDExpression Bool
hasIn Expression a
e2
Expression a
_ -> Bool -> Expression a -> Doc
forall a. Bool -> Expression a -> Doc
ppLogicalANDExpression Bool
hasIn Expression a
e
ppConditionalExpression :: Bool -> Expression a -> Doc
ppConditionalExpression :: forall a. Bool -> Expression a -> Doc
ppConditionalExpression Bool
hasIn Expression a
e = case Expression a
e of
CondExpr a
_ Expression a
c Expression a
et Expression a
ee -> Bool -> Expression a -> Doc
forall a. Bool -> Expression a -> Doc
ppLogicalORExpression Bool
hasIn Expression a
c Doc -> Doc -> Doc
</> String -> Doc
text String
"?" Doc -> Doc -> Doc
<+>
Bool -> Expression a -> Doc
forall a. Bool -> Expression a -> Doc
ppAssignmentExpression Bool
hasIn Expression a
et Doc -> Doc -> Doc
</> Doc
colon Doc -> Doc -> Doc
<+>
Bool -> Expression a -> Doc
forall a. Bool -> Expression a -> Doc
ppAssignmentExpression Bool
hasIn Expression a
ee
Expression a
_ -> Bool -> Expression a -> Doc
forall a. Bool -> Expression a -> Doc
ppLogicalORExpression Bool
hasIn Expression a
e
ppAssignmentExpression :: Bool -> Expression a -> Doc
ppAssignmentExpression :: forall a. Bool -> Expression a -> Doc
ppAssignmentExpression Bool
hasIn Expression a
e = case Expression a
e of
AssignExpr a
_ AssignOp
op LValue a
l Expression a
r -> LValue a -> Doc
forall a. Pretty a => a -> Doc
prettyPrint LValue a
l Doc -> Doc -> Doc
</> AssignOp -> Doc
forall a. Pretty a => a -> Doc
prettyPrint AssignOp
op Doc -> Doc -> Doc
</>
Bool -> Expression a -> Doc
forall a. Bool -> Expression a -> Doc
ppAssignmentExpression Bool
hasIn Expression a
r
Expression a
_ -> Bool -> Expression a -> Doc
forall a. Bool -> Expression a -> Doc
ppConditionalExpression Bool
hasIn Expression a
e
ppExpression :: Bool -> Expression a -> Doc
ppExpression :: forall a. Bool -> Expression a -> Doc
ppExpression Bool
hasIn Expression a
e = case Expression a
e of
ListExpr a
_ [Expression a]
es -> (Expression a -> Doc) -> [Expression a] -> Doc
forall a. (a -> Doc) -> [a] -> Doc
parenList (Bool -> Expression a -> Doc
forall a. Bool -> Expression a -> Doc
ppExpression Bool
hasIn) [Expression a]
es
Expression a
_ -> Bool -> Expression a -> Doc
forall a. Bool -> Expression a -> Doc
ppAssignmentExpression Bool
hasIn Expression a
e
maybe :: Maybe a -> (a -> Doc) -> Doc
maybe :: forall a. Maybe a -> (a -> Doc) -> Doc
maybe Maybe a
Nothing a -> Doc
_ = Doc
empty
maybe (Just a
a) a -> Doc
f = a -> Doc
f a
a