@@ -10,6 +10,8 @@ import qualified AST.Variable as Var
10import AST.PrettyPrint
10import AST.PrettyPrint
11import Text.PrettyPrint as P
11import Text.PrettyPrint as P
13data Declaration' port def var
15data Declaration' port def var
14 = Definition def
16 = Definition def
15 | Datatype String [String] [(String, [T.Type var])]
17 | Datatype String [String] [(String, [T.Type var])]
@@ -38,12 +40,14 @@ type CanonicalDecl = Declaration' (Port Canonical.Expr Var.Canonical)
38 Canonical.Def
40 Canonical.Def
39 Var.Canonical
41 Var.Canonical
41portName :: Port expr var -> String
44portName :: Port expr var -> String
42portName port =
45portName port =
43 case port of
46 case port of
44 Out name _ _ -> name
47 Out name _ _ -> name
45 In name _ -> name
48 In name _ -> name
47assocToString :: Assoc -> String
51assocToString :: Assoc -> String
48assocToString assoc =
52assocToString assoc =
49 case assoc of
53 case assoc of
@@ -51,15 +55,27 @@ assocToString assoc =
51 N -> "non"
55 N -> "non"
52 R -> "right"
56 R -> "right"
54instance Binary Assoc where
61instance Binary Assoc where
55− get = do n <- getWord8
63+ do n <- getWord8
56− return $ case n of
64+ return $ case n of
60− _ -> error "Error reading valid associativity from serialized string"
68+ _ -> error "Error reading valid associativity from serialized string"
62− put assoc = putWord8 $ case assoc of { L -> 0 ; N -> 1 ; R -> 2 }
72+ case assoc of
64instance (Pretty port, Pretty def, Pretty var, Var.ToString var) =>
80instance (Pretty port, Pretty def, Pretty var, Var.ToString var) =>
65 Pretty (Declaration' port def var) where
81 Pretty (Declaration' port def var) where
@@ -68,40 +84,61 @@ instance (Pretty port, Pretty def, Pretty var, Var.ToString var) =>
68 Definition def -> pretty def
84 Definition def -> pretty def
70 Datatype tipe tvars ctors ->
86 Datatype tipe tvars ctors ->
71− P.hang (P.text "data" <+> P.text tipe <+> P.hsep (map P.text tvars)) 4
88+ (P.text "type" <+> P.text tipe <+> P.hsep (map P.text tvars))
72− (P.sep $ zipWith join ("=" : repeat "|") ctors)
89+ 4
73− where
90+ (P.sep $ zipWith (<+>) seperators (map prettyCtor ctors))
74− join c ctor = P.text c <+> prettyCtor ctor
91+ where
93+ map P.text ("=" : repeat "|")
75− prettyCtor (name, tipes) =
95+ prettyCtor (name, tipes) =
76− P.hang (P.text name) 2 (P.sep (map T.prettyParens tipes))
96+ P.hang (P.text name) 2 (P.sep (map T.prettyParens tipes))
78 TypeAlias name tvars tipe ->
98 TypeAlias name tvars tipe ->
79− P.hang (P.text "type" <+> name' <+> P.equals) 4 (pretty tipe)
100+ (P.text "type" <+> P.text "alias" <+> name' <+> P.equals)
81− name' = P.text name <+> P.hsep (map P.text tvars)
105+ P.text name <+> P.hsep (map P.text tvars)
83 Port port -> pretty port
107 Port port -> pretty port
109+ Fixity assoc prec op ->
85− Fixity assoc prec op -> P.text "infix" <> assoc' <+> P.int prec <+> P.text op
110+ P.text "infix" <> assoc' <+> P.int prec <+> P.text op
87− assoc' = case assoc of
113+ case assoc of
88− L -> P.text "l"
114+ L -> P.text "l"
89− N -> P.empty
115+ N -> P.empty
90− R -> P.text "r"
116+ R -> P.text "r"
92instance Pretty RawPort where
119instance Pretty RawPort where
93 pretty port =
120 pretty port =
94 case port of
121 case port of
95− PPAnnotation name tipe -> prettyPort name ":" tipe
122+ PPAnnotation name tipe ->
123+ prettyPort name ":" tipe
96− PPDef name expr -> prettyPort name "=" expr
126+ prettyPort name "=" expr
98instance (Pretty expr, Pretty var, Var.ToString var) => Pretty (Port expr var) where
129instance (Pretty expr, Pretty var, Var.ToString var) => Pretty (Port expr var) where
99 pretty port =
130 pretty port =
100 case port of
131 case port of
101− In name tipe -> prettyPort name ":" tipe
133+ prettyPort name ":" tipe
135+ Out name expr tipe ->
102− Out name expr tipe -> P.vcat [ prettyPort name ":" tipe
137+ [ prettyPort name ":" tipe
103− , prettyPort name "=" expr ]
138+ , prettyPort name "=" expr
106prettyPort :: (Pretty a) => String -> String -> a -> Doc
142prettyPort :: (Pretty a) => String -> String -> a -> Doc
143+prettyPort name op e =
107−prettyPort name op e = P.text "port" <+> P.text name <+> P.text op <+> pretty e
144+ P.text "port" <+> P.text name <+> P.text op <+> pretty e