@@ -1,106 +0,0 @@
1−{-# OPTIONS_GHC -Wall #-}
2−module SourceSyntax.Declaration where
5−import qualified AST.Expression.Source as Source
6−import qualified AST.Expression.Valid as Valid
7−import qualified AST.Expression.Canonical as Canonical
8−import qualified AST.Type as T
9−import qualified AST.Variable as Var
10−import SourceSyntax.PrettyPrint
11−import Text.PrettyPrint as P
13−data Declaration' port def var
15− | Datatype String [String] [(String, [T.Type var])]
16− | TypeAlias String [String] (T.Type var)
18− | Fixity Assoc Int String
21−data Assoc = L | N | R
25− = PPAnnotation String (T.Type Var.Raw)
26− | PPDef String Source.Expr
30− = Out String expr (T.Type var)
31− | In String (T.Type var)
34−type SourceDecl = Declaration' RawPort Source.Def Var.Raw
35−type ValidDecl = Declaration' (Port Valid.Expr Var.Raw) Valid.Def Var.Raw
36−type CanonicalDecl = Declaration' (Port Canonical.Expr Var.Canonical)
40−portName :: Port expr var -> String
46−instance Show Assoc where
53−instance Binary Assoc where
54− get = do n <- getWord8
59− _ -> error "Error reading valid associativity from serialized string"
61− put assoc = putWord8 $ case assoc of { L -> 0 ; N -> 1 ; R -> 2 }
63−instance (Pretty port, Pretty def, Pretty var, Var.ToString var) =>
64− Pretty (Declaration' port def var) where
67− Definition def -> pretty def
69− Datatype tipe tvars ctors ->
70− P.hang (P.text "data" <+> P.text tipe <+> P.hsep (map P.text tvars)) 4
71− (P.sep $ zipWith join ("=" : repeat "|") ctors)
73− join c ctor = P.text c <+> prettyCtor ctor
74− prettyCtor (name, tipes) =
75− P.hang (P.text name) 2 (P.sep (map T.prettyParens tipes))
77− TypeAlias name tvars tipe ->
78− P.hang (P.text "type" <+> name' <+> P.equals) 4 (pretty tipe)
80− name' = P.text name <+> P.hsep (map P.text tvars)
82− Port port -> pretty port
84− Fixity assoc prec op -> P.text "infix" <> assoc' <+> P.int prec <+> P.text op
86− assoc' = case assoc of
91−instance Pretty RawPort where
94− PPAnnotation name tipe -> prettyPort name ":" tipe
95− PPDef name expr -> prettyPort name "=" expr
97−instance (Pretty expr, Pretty var, Var.ToString var) => Pretty (Port expr var) where
100− In name tipe -> prettyPort name ":" tipe
101− Out name expr tipe -> P.vcat [ prettyPort name ":" tipe
102− , prettyPort name "=" expr ]
105−prettyPort :: (Pretty a) => String -> String -> a -> Doc
106−prettyPort name op e = P.text "port" <+> P.text name <+> P.text op <+> pretty e