-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathPrettyGoTypes.hs
123 lines (105 loc) · 3.31 KB
/
PrettyGoTypes.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
{-# LANGUAGE MultiParamTypeClasses
, TemplateHaskell
, ScopedTypeVariables
, FlexibleInstances
, FlexibleContexts
, UndecidableInstances
#-}
module PrettyGoTypes where
import Unbound.LocallyNameless
import Control.Applicative
import Control.Arrow ((+++))
import Control.Monad
import Control.Monad.Trans.Maybe
import Data.List as L
import Data.Set as S
import Data.Maybe
import qualified Text.PrettyPrint as PP
import Text.PrettyPrint (render,(<+>),hsep,punctuate,brackets,(<>),text,Doc)
import GoTypes
-- Pretty Printing --
class Pretty p where
ppr :: (Applicative m, LFresh m) => p -> m Doc
instance Pretty (Name a) where
ppr = return . text . show
dot = text "."
bang = text "!"
qmark = text "?"
oplus = text "+"
amper = text "&"
tau = text "tau"
instance Pretty GoType where
ppr (Send c t) = do
t' <- ppr t
c' <- ppr c
return $ c' <> bang <> PP.semi <> t'
ppr (Recv c t) = do
t' <- ppr t
c' <- ppr c
return $ c' <> qmark <> PP.semi <> t'
ppr (Tau t) = do
t' <- ppr t
return $ tau <> PP.semi <> t'
ppr (IChoice t1 t2) = do
t1' <- ppr t1
t2' <- ppr t2
return $ oplus <> PP.braces (t1' <+> PP.comma <+> t2')
ppr (OChoice l) = do
l' <- mapM ppr l
let prettyl = punctuate PP.comma l'
return $ amper <> PP.braces (hsep prettyl)
ppr (Par l) = do
l' <- mapM ppr l
let prettyl = punctuate (PP.space <> PP.text "|") l'
return $ (hsep prettyl)
ppr (New i bnd) = lunbind bnd $ \(c,t) -> do
c' <- ppr c
t' <- ppr t
return $ PP.text "new" <+> (PP.int i) <+> c' <> dot <> (PP.parens t')
ppr (Null) = return $ text "0"
ppr (Close c t) = do
t' <- ppr t
c' <- ppr c
return $ PP.text "close " <> c' <> PP.semi <> t'
ppr (TVar x) = ppr x
ppr (ChanInst t plist) = do
t' <- ppr t
l' <- mapM ppr plist
let plist' = punctuate PP.comma l'
return $ t' <+> PP.char '<' <> (hsep plist') <> PP.char '>'
ppr (ChanAbst bnd) = lunbind bnd $ \(lc,t) -> do
t' <- ppr t
l' <- mapM ppr lc
let plist' = punctuate PP.comma l'
return $ brackets (hsep plist') <+> t'
ppr (Seq l) = do
l' <- mapM ppr l
let plist = punctuate PP.semi l'
return $ hsep plist
ppr (Buffer c (open,i,j)) = do
c' <- ppr c
if open
then return $ PP.text "[" <> c' <> PP.text ":"
<> PP.text "B:" <> (PP.int i)
<> PP.text "K:" <> (PP.int j) <> PP.text "]"
else return $ PP.text "(" <> c' <> PP.text ":"
<> PP.text "B:" <> (PP.int i)
<> PP.text "K:" <> (PP.int j) <> PP.text ")"
instance Pretty Eqn where
ppr (EqnSys bnd) = lunbind bnd $ \(r,t) -> do
t' <- ppr t
let defs = unrec r
pdefs <- mapM (\(n,Embed(t0)) -> do
n' <- ppr n
t0' <- ppr t0
return $ n' <+> PP.text "=" <+> t0') defs
let pdefs' = punctuate PP.comma pdefs
return $ PP.braces (hsep pdefs') <+> PP.space <+> PP.text "in" <+> PP.space <+> t'
-- Pretty printing conveniences --
pprintEqn :: Eqn -> String
pprintEqn e = render . runLFreshM . ppr $ e
pprintType :: GoType -> String
pprintType t = render . runLFreshM . ppr $ t
pprintTypeList :: [GoType] -> String
pprintTypeList xs = L.foldr (\x -> \y -> x++"\n"++y) [] $ L.map pprintType xs
-------