module Futhark.CodeGen.Backends.GenericPython.AST
( PyExp (..),
PyIdx (..),
PyArg (..),
PyStmt (..),
module Language.Futhark.Core,
PyProg (..),
PyExcept (..),
PyFunDef (..),
PyClassDef (..),
)
where
import Data.Text qualified as T
import Futhark.Util.Pretty
import Language.Futhark.Core
data UnOp
=
Not
|
Complement
|
Negate
|
Abs
deriving (UnOp -> UnOp -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: UnOp -> UnOp -> Bool
$c/= :: UnOp -> UnOp -> Bool
== :: UnOp -> UnOp -> Bool
$c== :: UnOp -> UnOp -> Bool
Eq, Int -> UnOp -> ShowS
[UnOp] -> ShowS
UnOp -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [UnOp] -> ShowS
$cshowList :: [UnOp] -> ShowS
show :: UnOp -> String
$cshow :: UnOp -> String
showsPrec :: Int -> UnOp -> ShowS
$cshowsPrec :: Int -> UnOp -> ShowS
Show)
data PyExp
= Integer Integer
| Bool Bool
| Float Double
| String String
| RawStringLiteral T.Text
| Var String
| BinOp String PyExp PyExp
| UnOp String PyExp
| Cond PyExp PyExp PyExp
| Index PyExp PyIdx
| Call PyExp [PyArg]
| Cast PyExp String
| Tuple [PyExp]
| List [PyExp]
| Field PyExp String
| Dict [(PyExp, PyExp)]
| Lambda String PyExp
| None
deriving (PyExp -> PyExp -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: PyExp -> PyExp -> Bool
$c/= :: PyExp -> PyExp -> Bool
== :: PyExp -> PyExp -> Bool
$c== :: PyExp -> PyExp -> Bool
Eq, Int -> PyExp -> ShowS
[PyExp] -> ShowS
PyExp -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [PyExp] -> ShowS
$cshowList :: [PyExp] -> ShowS
show :: PyExp -> String
$cshow :: PyExp -> String
showsPrec :: Int -> PyExp -> ShowS
$cshowsPrec :: Int -> PyExp -> ShowS
Show)
data PyIdx
= IdxRange PyExp PyExp
| IdxExp PyExp
deriving (PyIdx -> PyIdx -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: PyIdx -> PyIdx -> Bool
$c/= :: PyIdx -> PyIdx -> Bool
== :: PyIdx -> PyIdx -> Bool
$c== :: PyIdx -> PyIdx -> Bool
Eq, Int -> PyIdx -> ShowS
[PyIdx] -> ShowS
PyIdx -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [PyIdx] -> ShowS
$cshowList :: [PyIdx] -> ShowS
show :: PyIdx -> String
$cshow :: PyIdx -> String
showsPrec :: Int -> PyIdx -> ShowS
$cshowsPrec :: Int -> PyIdx -> ShowS
Show)
data PyArg
= ArgKeyword String PyExp
| Arg PyExp
deriving (PyArg -> PyArg -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: PyArg -> PyArg -> Bool
$c/= :: PyArg -> PyArg -> Bool
== :: PyArg -> PyArg -> Bool
$c== :: PyArg -> PyArg -> Bool
Eq, Int -> PyArg -> ShowS
[PyArg] -> ShowS
PyArg -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [PyArg] -> ShowS
$cshowList :: [PyArg] -> ShowS
show :: PyArg -> String
$cshow :: PyArg -> String
showsPrec :: Int -> PyArg -> ShowS
$cshowsPrec :: Int -> PyArg -> ShowS
Show)
data PyStmt
= If PyExp [PyStmt] [PyStmt]
| Try [PyStmt] [PyExcept]
| While PyExp [PyStmt]
| For String PyExp [PyStmt]
| With PyExp [PyStmt]
| Assign PyExp PyExp
| AssignOp String PyExp PyExp
| String [PyStmt]
| Assert PyExp PyExp
| Raise PyExp
| Exp PyExp
| Return PyExp
| Pass
|
Import String (Maybe String)
| FunDef PyFunDef
| ClassDef PyClassDef
|
Escape T.Text
deriving (PyStmt -> PyStmt -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: PyStmt -> PyStmt -> Bool
$c/= :: PyStmt -> PyStmt -> Bool
== :: PyStmt -> PyStmt -> Bool
$c== :: PyStmt -> PyStmt -> Bool
Eq, Int -> PyStmt -> ShowS
[PyStmt] -> ShowS
PyStmt -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [PyStmt] -> ShowS
$cshowList :: [PyStmt] -> ShowS
show :: PyStmt -> String
$cshow :: PyStmt -> String
showsPrec :: Int -> PyStmt -> ShowS
$cshowsPrec :: Int -> PyStmt -> ShowS
Show)
data PyExcept = Catch PyExp [PyStmt]
deriving (PyExcept -> PyExcept -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: PyExcept -> PyExcept -> Bool
$c/= :: PyExcept -> PyExcept -> Bool
== :: PyExcept -> PyExcept -> Bool
$c== :: PyExcept -> PyExcept -> Bool
Eq, Int -> PyExcept -> ShowS
[PyExcept] -> ShowS
PyExcept -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [PyExcept] -> ShowS
$cshowList :: [PyExcept] -> ShowS
show :: PyExcept -> String
$cshow :: PyExcept -> String
showsPrec :: Int -> PyExcept -> ShowS
$cshowsPrec :: Int -> PyExcept -> ShowS
Show)
data PyFunDef = Def String [String] [PyStmt]
deriving (PyFunDef -> PyFunDef -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: PyFunDef -> PyFunDef -> Bool
$c/= :: PyFunDef -> PyFunDef -> Bool
== :: PyFunDef -> PyFunDef -> Bool
$c== :: PyFunDef -> PyFunDef -> Bool
Eq, Int -> PyFunDef -> ShowS
[PyFunDef] -> ShowS
PyFunDef -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [PyFunDef] -> ShowS
$cshowList :: [PyFunDef] -> ShowS
show :: PyFunDef -> String
$cshow :: PyFunDef -> String
showsPrec :: Int -> PyFunDef -> ShowS
$cshowsPrec :: Int -> PyFunDef -> ShowS
Show)
data PyClassDef = Class String [PyStmt]
deriving (PyClassDef -> PyClassDef -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: PyClassDef -> PyClassDef -> Bool
$c/= :: PyClassDef -> PyClassDef -> Bool
== :: PyClassDef -> PyClassDef -> Bool
$c== :: PyClassDef -> PyClassDef -> Bool
Eq, Int -> PyClassDef -> ShowS
[PyClassDef] -> ShowS
PyClassDef -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [PyClassDef] -> ShowS
$cshowList :: [PyClassDef] -> ShowS
show :: PyClassDef -> String
$cshow :: PyClassDef -> String
showsPrec :: Int -> PyClassDef -> ShowS
$cshowsPrec :: Int -> PyClassDef -> ShowS
Show)
newtype PyProg = PyProg [PyStmt]
deriving (PyProg -> PyProg -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: PyProg -> PyProg -> Bool
$c/= :: PyProg -> PyProg -> Bool
== :: PyProg -> PyProg -> Bool
$c== :: PyProg -> PyProg -> Bool
Eq, Int -> PyProg -> ShowS
[PyProg] -> ShowS
PyProg -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [PyProg] -> ShowS
$cshowList :: [PyProg] -> ShowS
show :: PyProg -> String
$cshow :: PyProg -> String
showsPrec :: Int -> PyProg -> ShowS
$cshowsPrec :: Int -> PyProg -> ShowS
Show)
instance Pretty PyIdx where
pretty :: forall ann. PyIdx -> Doc ann
pretty (IdxExp PyExp
e) = forall a ann. Pretty a => a -> Doc ann
pretty PyExp
e
pretty (IdxRange PyExp
from PyExp
to) = forall a ann. Pretty a => a -> Doc ann
pretty PyExp
from forall a. Semigroup a => a -> a -> a
<> Doc ann
":" forall a. Semigroup a => a -> a -> a
<> forall a ann. Pretty a => a -> Doc ann
pretty PyExp
to
instance Pretty PyArg where
pretty :: forall ann. PyArg -> Doc ann
pretty (ArgKeyword String
k PyExp
e) = forall a ann. Pretty a => a -> Doc ann
pretty String
k forall a. Semigroup a => a -> a -> a
<> forall ann. Doc ann
equals forall a. Semigroup a => a -> a -> a
<> forall a ann. Pretty a => a -> Doc ann
pretty PyExp
e
pretty (Arg PyExp
e) = forall a ann. Pretty a => a -> Doc ann
pretty PyExp
e
instance Pretty PyExp where
pretty :: forall ann. PyExp -> Doc ann
pretty (Integer Integer
x) = forall a ann. Pretty a => a -> Doc ann
pretty Integer
x
pretty (Bool Bool
x) = forall a ann. Pretty a => a -> Doc ann
pretty Bool
x
pretty (Float Double
x)
| forall a. RealFloat a => a -> Bool
isInfinite Double
x = if Double
x forall a. Ord a => a -> a -> Bool
> Double
0 then Doc ann
"float('inf')" else Doc ann
"float('-inf')"
| Bool
otherwise = forall a ann. Pretty a => a -> Doc ann
pretty Double
x
pretty (String String
x) = forall a ann. Pretty a => a -> Doc ann
pretty forall a b. (a -> b) -> a -> b
$ forall a. Show a => a -> String
show String
x
pretty (RawStringLiteral Text
s) = Doc ann
"\"\"\"" forall a. Semigroup a => a -> a -> a
<> forall a ann. Pretty a => a -> Doc ann
pretty Text
s forall a. Semigroup a => a -> a -> a
<> Doc ann
"\"\"\""
pretty (Var String
n) = forall a ann. Pretty a => a -> Doc ann
pretty forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map (\Char
x -> if Char
x forall a. Eq a => a -> a -> Bool
== Char
'\'' then Char
'm' else Char
x) String
n
pretty (Field PyExp
e String
s) = forall a ann. Pretty a => a -> Doc ann
pretty PyExp
e forall a. Semigroup a => a -> a -> a
<> Doc ann
"." forall a. Semigroup a => a -> a -> a
<> forall a ann. Pretty a => a -> Doc ann
pretty String
s
pretty (BinOp String
s PyExp
e1 PyExp
e2) = forall ann. Doc ann -> Doc ann
parens (forall a ann. Pretty a => a -> Doc ann
pretty PyExp
e1 forall ann. Doc ann -> Doc ann -> Doc ann
<+> forall a ann. Pretty a => a -> Doc ann
pretty String
s forall ann. Doc ann -> Doc ann -> Doc ann
<+> forall a ann. Pretty a => a -> Doc ann
pretty PyExp
e2)
pretty (UnOp String
s PyExp
e) = forall a ann. Pretty a => a -> Doc ann
pretty String
s forall a. Semigroup a => a -> a -> a
<> forall ann. Doc ann -> Doc ann
parens (forall a ann. Pretty a => a -> Doc ann
pretty PyExp
e)
pretty (Cond PyExp
e1 PyExp
e2 PyExp
e3) = forall a ann. Pretty a => a -> Doc ann
pretty PyExp
e2 forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"if" forall ann. Doc ann -> Doc ann -> Doc ann
<+> forall a ann. Pretty a => a -> Doc ann
pretty PyExp
e1 forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"else" forall ann. Doc ann -> Doc ann -> Doc ann
<+> forall a ann. Pretty a => a -> Doc ann
pretty PyExp
e3
pretty (Cast PyExp
src String
bt) =
Doc ann
"ct.cast"
forall a. Semigroup a => a -> a -> a
<> forall ann. Doc ann -> Doc ann
parens
( forall a ann. Pretty a => a -> Doc ann
pretty PyExp
src forall a. Semigroup a => a -> a -> a
<> Doc ann
","
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"ct.POINTER" forall a. Semigroup a => a -> a -> a
<> forall ann. Doc ann -> Doc ann
parens (forall a ann. Pretty a => a -> Doc ann
pretty String
bt)
)
pretty (Index PyExp
src PyIdx
idx) = forall a ann. Pretty a => a -> Doc ann
pretty PyExp
src forall a. Semigroup a => a -> a -> a
<> forall ann. Doc ann -> Doc ann
brackets (forall a ann. Pretty a => a -> Doc ann
pretty PyIdx
idx)
pretty (Call PyExp
fun [PyArg]
exps) = forall a ann. Pretty a => a -> Doc ann
pretty PyExp
fun forall a. Semigroup a => a -> a -> a
<> forall ann. Doc ann -> Doc ann
parens (forall a. [Doc a] -> Doc a
commasep forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map forall a ann. Pretty a => a -> Doc ann
pretty [PyArg]
exps)
pretty (Tuple [PyExp
dim]) = forall ann. Doc ann -> Doc ann
parens (forall a ann. Pretty a => a -> Doc ann
pretty PyExp
dim forall a. Semigroup a => a -> a -> a
<> Doc ann
",")
pretty (Tuple [PyExp]
dims) = forall ann. Doc ann -> Doc ann
parens (forall a. [Doc a] -> Doc a
commasep forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map forall a ann. Pretty a => a -> Doc ann
pretty [PyExp]
dims)
pretty (List [PyExp]
es) = forall ann. Doc ann -> Doc ann
brackets forall a b. (a -> b) -> a -> b
$ forall a. [Doc a] -> Doc a
commasep forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map forall a ann. Pretty a => a -> Doc ann
pretty [PyExp]
es
pretty (Dict [(PyExp, PyExp)]
kvs) = forall ann. Doc ann -> Doc ann
braces forall a b. (a -> b) -> a -> b
$ forall a. [Doc a] -> Doc a
commasep forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map forall {a} {a} {ann}. (Pretty a, Pretty a) => (a, a) -> Doc ann
ppElem [(PyExp, PyExp)]
kvs
where
ppElem :: (a, a) -> Doc ann
ppElem (a
k, a
v) = forall a ann. Pretty a => a -> Doc ann
pretty a
k forall a. Semigroup a => a -> a -> a
<> forall ann. Doc ann
colon forall ann. Doc ann -> Doc ann -> Doc ann
<+> forall a ann. Pretty a => a -> Doc ann
pretty a
v
pretty (Lambda String
p PyExp
e) = Doc ann
"lambda" forall ann. Doc ann -> Doc ann -> Doc ann
<+> forall a ann. Pretty a => a -> Doc ann
pretty String
p forall a. Semigroup a => a -> a -> a
<> Doc ann
":" forall ann. Doc ann -> Doc ann -> Doc ann
<+> forall a ann. Pretty a => a -> Doc ann
pretty PyExp
e
pretty PyExp
None = Doc ann
"None"
instance Pretty PyStmt where
pretty :: forall ann. PyStmt -> Doc ann
pretty (If PyExp
cond [] []) =
Doc ann
"if"
forall ann. Doc ann -> Doc ann -> Doc ann
<+> forall a ann. Pretty a => a -> Doc ann
pretty PyExp
cond forall a. Semigroup a => a -> a -> a
<> Doc ann
":"
forall ann. Doc ann -> Doc ann -> Doc ann
</> forall ann. Int -> Doc ann -> Doc ann
indent Int
2 Doc ann
"pass"
pretty (If PyExp
cond [] [PyStmt]
fbranch) =
Doc ann
"if"
forall ann. Doc ann -> Doc ann -> Doc ann
<+> forall a ann. Pretty a => a -> Doc ann
pretty PyExp
cond forall a. Semigroup a => a -> a -> a
<> Doc ann
":"
forall ann. Doc ann -> Doc ann -> Doc ann
</> forall ann. Int -> Doc ann -> Doc ann
indent Int
2 Doc ann
"pass"
forall ann. Doc ann -> Doc ann -> Doc ann
</> Doc ann
"else:"
forall ann. Doc ann -> Doc ann -> Doc ann
</> forall ann. Int -> Doc ann -> Doc ann
indent Int
2 (forall a. [Doc a] -> Doc a
stack forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map forall a ann. Pretty a => a -> Doc ann
pretty [PyStmt]
fbranch)
pretty (If PyExp
cond [PyStmt]
tbranch []) =
Doc ann
"if"
forall ann. Doc ann -> Doc ann -> Doc ann
<+> forall a ann. Pretty a => a -> Doc ann
pretty PyExp
cond forall a. Semigroup a => a -> a -> a
<> Doc ann
":"
forall ann. Doc ann -> Doc ann -> Doc ann
</> forall ann. Int -> Doc ann -> Doc ann
indent Int
2 (forall a. [Doc a] -> Doc a
stack forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map forall a ann. Pretty a => a -> Doc ann
pretty [PyStmt]
tbranch)
pretty (If PyExp
cond [PyStmt]
tbranch [PyStmt]
fbranch) =
Doc ann
"if"
forall ann. Doc ann -> Doc ann -> Doc ann
<+> forall a ann. Pretty a => a -> Doc ann
pretty PyExp
cond forall a. Semigroup a => a -> a -> a
<> Doc ann
":"
forall ann. Doc ann -> Doc ann -> Doc ann
</> forall ann. Int -> Doc ann -> Doc ann
indent Int
2 (forall a. [Doc a] -> Doc a
stack forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map forall a ann. Pretty a => a -> Doc ann
pretty [PyStmt]
tbranch)
forall ann. Doc ann -> Doc ann -> Doc ann
</> Doc ann
"else:"
forall ann. Doc ann -> Doc ann -> Doc ann
</> forall ann. Int -> Doc ann -> Doc ann
indent Int
2 (forall a. [Doc a] -> Doc a
stack forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map forall a ann. Pretty a => a -> Doc ann
pretty [PyStmt]
fbranch)
pretty (Try [PyStmt]
pystms [PyExcept]
pyexcepts) =
Doc ann
"try:"
forall ann. Doc ann -> Doc ann -> Doc ann
</> forall ann. Int -> Doc ann -> Doc ann
indent Int
2 (forall a. [Doc a] -> Doc a
stack forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map forall a ann. Pretty a => a -> Doc ann
pretty [PyStmt]
pystms)
forall ann. Doc ann -> Doc ann -> Doc ann
</> forall a. [Doc a] -> Doc a
stack (forall a b. (a -> b) -> [a] -> [b]
map forall a ann. Pretty a => a -> Doc ann
pretty [PyExcept]
pyexcepts)
pretty (While PyExp
cond [PyStmt]
body) =
Doc ann
"while"
forall ann. Doc ann -> Doc ann -> Doc ann
<+> forall a ann. Pretty a => a -> Doc ann
pretty PyExp
cond forall a. Semigroup a => a -> a -> a
<> Doc ann
":"
forall ann. Doc ann -> Doc ann -> Doc ann
</> forall ann. Int -> Doc ann -> Doc ann
indent Int
2 (forall a. [Doc a] -> Doc a
stack forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map forall a ann. Pretty a => a -> Doc ann
pretty [PyStmt]
body)
pretty (For String
i PyExp
what [PyStmt]
body) =
Doc ann
"for"
forall ann. Doc ann -> Doc ann -> Doc ann
<+> forall a ann. Pretty a => a -> Doc ann
pretty String
i
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"in"
forall ann. Doc ann -> Doc ann -> Doc ann
<+> forall a ann. Pretty a => a -> Doc ann
pretty PyExp
what forall a. Semigroup a => a -> a -> a
<> Doc ann
":"
forall ann. Doc ann -> Doc ann -> Doc ann
</> forall ann. Int -> Doc ann -> Doc ann
indent Int
2 (forall a. [Doc a] -> Doc a
stack forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map forall a ann. Pretty a => a -> Doc ann
pretty [PyStmt]
body)
pretty (With PyExp
what [PyStmt]
body) =
Doc ann
"with"
forall ann. Doc ann -> Doc ann -> Doc ann
<+> forall a ann. Pretty a => a -> Doc ann
pretty PyExp
what forall a. Semigroup a => a -> a -> a
<> Doc ann
":"
forall ann. Doc ann -> Doc ann -> Doc ann
</> forall ann. Int -> Doc ann -> Doc ann
indent Int
2 (forall a. [Doc a] -> Doc a
stack forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map forall a ann. Pretty a => a -> Doc ann
pretty [PyStmt]
body)
pretty (Assign PyExp
e1 PyExp
e2) = forall a ann. Pretty a => a -> Doc ann
pretty PyExp
e1 forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"=" forall ann. Doc ann -> Doc ann -> Doc ann
<+> forall a ann. Pretty a => a -> Doc ann
pretty PyExp
e2
pretty (AssignOp String
op PyExp
e1 PyExp
e2) = forall a ann. Pretty a => a -> Doc ann
pretty PyExp
e1 forall ann. Doc ann -> Doc ann -> Doc ann
<+> forall a ann. Pretty a => a -> Doc ann
pretty (String
op forall a. [a] -> [a] -> [a]
++ String
"=") forall ann. Doc ann -> Doc ann -> Doc ann
<+> forall a ann. Pretty a => a -> Doc ann
pretty PyExp
e2
pretty (Comment String
s [PyStmt]
body) = Doc ann
"#" forall a. Semigroup a => a -> a -> a
<> forall a ann. Pretty a => a -> Doc ann
pretty String
s forall ann. Doc ann -> Doc ann -> Doc ann
</> forall a. [Doc a] -> Doc a
stack (forall a b. (a -> b) -> [a] -> [b]
map forall a ann. Pretty a => a -> Doc ann
pretty [PyStmt]
body)
pretty (Assert PyExp
e1 PyExp
e2) = Doc ann
"assert" forall ann. Doc ann -> Doc ann -> Doc ann
<+> forall a ann. Pretty a => a -> Doc ann
pretty PyExp
e1 forall a. Semigroup a => a -> a -> a
<> Doc ann
"," forall ann. Doc ann -> Doc ann -> Doc ann
<+> forall a ann. Pretty a => a -> Doc ann
pretty PyExp
e2
pretty (Raise PyExp
e) = Doc ann
"raise" forall ann. Doc ann -> Doc ann -> Doc ann
<+> forall a ann. Pretty a => a -> Doc ann
pretty PyExp
e
pretty (Exp PyExp
c) = forall a ann. Pretty a => a -> Doc ann
pretty PyExp
c
pretty (Return PyExp
e) = Doc ann
"return" forall ann. Doc ann -> Doc ann -> Doc ann
<+> forall a ann. Pretty a => a -> Doc ann
pretty PyExp
e
pretty PyStmt
Pass = Doc ann
"pass"
pretty (Import String
from (Just String
as)) =
Doc ann
"import" forall ann. Doc ann -> Doc ann -> Doc ann
<+> forall a ann. Pretty a => a -> Doc ann
pretty String
from forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"as" forall ann. Doc ann -> Doc ann -> Doc ann
<+> forall a ann. Pretty a => a -> Doc ann
pretty String
as
pretty (Import String
from Maybe String
Nothing) =
Doc ann
"import" forall ann. Doc ann -> Doc ann -> Doc ann
<+> forall a ann. Pretty a => a -> Doc ann
pretty String
from
pretty (FunDef PyFunDef
d) = forall a ann. Pretty a => a -> Doc ann
pretty PyFunDef
d
pretty (ClassDef PyClassDef
d) = forall a ann. Pretty a => a -> Doc ann
pretty PyClassDef
d
pretty (Escape Text
s) = forall a. [Doc a] -> Doc a
stack forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map forall a ann. Pretty a => a -> Doc ann
pretty forall a b. (a -> b) -> a -> b
$ Text -> [Text]
T.lines Text
s
instance Pretty PyFunDef where
pretty :: forall ann. PyFunDef -> Doc ann
pretty (Def String
fname [String]
params [PyStmt]
body) =
Doc ann
"def"
forall ann. Doc ann -> Doc ann -> Doc ann
<+> forall a ann. Pretty a => a -> Doc ann
pretty String
fname forall a. Semigroup a => a -> a -> a
<> forall ann. Doc ann -> Doc ann
parens (forall a. [Doc a] -> Doc a
commasep forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map forall a ann. Pretty a => a -> Doc ann
pretty [String]
params) forall a. Semigroup a => a -> a -> a
<> Doc ann
":"
forall ann. Doc ann -> Doc ann -> Doc ann
</> forall ann. Int -> Doc ann -> Doc ann
indent Int
2 (forall a. [Doc a] -> Doc a
stack (forall a b. (a -> b) -> [a] -> [b]
map forall a ann. Pretty a => a -> Doc ann
pretty [PyStmt]
body))
instance Pretty PyClassDef where
pretty :: forall ann. PyClassDef -> Doc ann
pretty (Class String
cname [PyStmt]
body) =
Doc ann
"class"
forall ann. Doc ann -> Doc ann -> Doc ann
<+> forall a ann. Pretty a => a -> Doc ann
pretty String
cname forall a. Semigroup a => a -> a -> a
<> Doc ann
":"
forall ann. Doc ann -> Doc ann -> Doc ann
</> forall ann. Int -> Doc ann -> Doc ann
indent Int
2 (forall a. [Doc a] -> Doc a
stack (forall a b. (a -> b) -> [a] -> [b]
map forall a ann. Pretty a => a -> Doc ann
pretty [PyStmt]
body))
instance Pretty PyExcept where
pretty :: forall ann. PyExcept -> Doc ann
pretty (Catch PyExp
pyexp [PyStmt]
stms) =
Doc ann
"except"
forall ann. Doc ann -> Doc ann -> Doc ann
<+> forall a ann. Pretty a => a -> Doc ann
pretty PyExp
pyexp
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"as e:"
forall ann. Doc ann -> Doc ann -> Doc ann
</> forall ann. Int -> Doc ann -> Doc ann
indent Int
2 (forall a. [Doc a] -> Doc a
vsep forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map forall a ann. Pretty a => a -> Doc ann
pretty [PyStmt]
stms)
instance Pretty PyProg where
pretty :: forall ann. PyProg -> Doc ann
pretty (PyProg [PyStmt]
stms) = forall a. [Doc a] -> Doc a
vsep (forall a b. (a -> b) -> [a] -> [b]
map forall a ann. Pretty a => a -> Doc ann
pretty [PyStmt]
stms)