@@ -13,11 +13,13 @@ import qualified Data.Traversable as Traverse
13import qualified Data.UnionFind.IO as UF
13import qualified Data.UnionFind.IO as UF
14import Text.PrettyPrint as P
14import Text.PrettyPrint as P
16−import qualified SourceSyntax.Annotation as A
16+import qualified AST.Annotation as A
17−import qualified SourceSyntax.Expression as E
17+import qualified AST.Expression.General as E
18−import qualified SourceSyntax.Helpers as Help
18+import qualified AST.Expression.Canonical as Canonical
19+import qualified AST.Helpers as Help
19−import qualified SourceSyntax.PrettyPrint as SPP
20+import qualified AST.PrettyPrint as PP
20−import qualified SourceSyntax.Type as ST
21+import qualified AST.Type as ST
22+import qualified AST.Variable as V
21import qualified Transform.Expression as Expr
23import qualified Transform.Expression as Expr
22import qualified Type.Type as TT
24import qualified Type.Type as TT
23import qualified Type.State as TS
25import qualified Type.State as TS
@@ -25,10 +27,10 @@ import qualified Type.Alias as Alias
26throw err = Left [ P.vcat err ]
28throw err = Left [ P.vcat err ]
28−mainType :: Alias.Rules -> TS.Env -> IO (Either [P.Doc] (Map.Map String ST.Type))
30+mainType :: Alias.Rules -> TS.Env -> IO (Either [P.Doc] (Map.Map String ST.CanonicalType))
29mainType rules env = mainCheck rules <$> Traverse.traverse TT.toSrcType env
31mainType rules env = mainCheck rules <$> Traverse.traverse TT.toSrcType env
31− mainCheck :: Alias.Rules -> Map.Map String ST.Type -> Either [P.Doc] (Map.Map String ST.Type)
33+ mainCheck :: Alias.Rules -> Map.Map String ST.CanonicalType -> Either [P.Doc] (Map.Map String ST.CanonicalType)
32 mainCheck rules env =
34 mainCheck rules env =
33 case Map.lookup "main" env of
35 case Map.lookup "main" env of
34 Nothing -> Right env
36 Nothing -> Right env
@@ -39,31 +41,36 @@ mainType rules env = mainCheck rules <$> Traverse.traverse TT.toSrcType env
39 acceptable = [ "Graphics.Element.Element"
41 acceptable = [ "Graphics.Element.Element"
40 , "Signal.Signal Graphics.Element.Element" ]
42 , "Signal.Signal Graphics.Element.Element" ]
42− tipe = SPP.renderPretty $ Alias.canonicalRealias (fst rules) mainType
44+ tipe = PP.renderPretty $ Alias.canonicalRealias (fst rules) mainType
43 err = [ P.text "Type Error: 'main' must have type Element or (Signal Element)."
45 err = [ P.text "Type Error: 'main' must have type Element or (Signal Element)."
44 , P.text "Instead 'main' has type:\n"
46 , P.text "Instead 'main' has type:\n"
45− , P.nest 4 . SPP.pretty $ Alias.realias rules mainType
47+ , P.nest 4 . PP.pretty $ Alias.realias rules mainType
46 , P.text " " ]
48 , P.text " " ]
48data Direction = In | Out
50data Direction = In | Out
50−portTypes :: Alias.Rules -> E.Expr -> Either [P.Doc] ()
52+portTypes :: Alias.Rules -> Canonical.Expr -> Either [P.Doc] ()
51portTypes rules expr =
53portTypes rules expr =
52 const () <$> Expr.checkPorts (check In) (check Out) expr
54 const () <$> Expr.checkPorts (check In) (check Out) expr
54 check = isValid True False False
56 check = isValid True False False
55 isValid isTopLevel seenFunc seenSignal direction name tipe =
57 isValid isTopLevel seenFunc seenSignal direction name tipe =
56 case tipe of
58 case tipe of
57− ST.Data ctor ts
59+ ST.Data (V.Canonical (V.Module "Signal") "Signal") [t] ->
58− | validConstructor -> mapM_ valid ts
59− | ctor == "Signal.Signal" -> handleSignal ts
60+ handleSignal t
60− | otherwise -> err' True "an unsupported type"
61+
61− where
62+ ST.Data (V.Canonical (V.Module "Maybe") "Maybe") [t] ->
62− primitives =
63+ valid t
63− ["Int","Float","String","Bool","Maybe.Maybe","_List","Json.Value"]
65− validConstructor =
65+ ST.Data (V.Canonical (V.Module "Json") "Value") [] ->
68+ ST.Data (V.Canonical V.BuiltIn ctor) ts
66− ctor `elem` primitives || Help.isTuple ctor
69+ | ctor `elem` primitives || Help.isTuple ctor -> mapM_ valid ts
71+ primitives = ["Int","Float","String","Bool","_List"]
73+ ST.Data _ _ -> err' True "an unsupported type"
68 ST.Var _ -> err "free type variables"
75 ST.Var _ -> err "free type variables"
@@ -85,10 +92,10 @@ portTypes rules expr =
85 isValid' = isValid False
92 isValid' = isValid False
86 valid = isValid' seenFunc seenSignal direction name
93 valid = isValid' seenFunc seenSignal direction name
88− handleSignal ts
95+ handleSignal t
89 | seenFunc = err "functions that involve signals"
96 | seenFunc = err "functions that involve signals"
90 | seenSignal = err "signals-of-signals"
97 | seenSignal = err "signals-of-signals"
91− | isTopLevel = mapM_ (isValid' seenFunc True direction name) ts
98+ | isTopLevel = isValid' seenFunc True direction name t
92 | otherwise = err "a signal within a data stucture"
99 | otherwise = err "a signal within a data stucture"
94 dir inMsg outMsg = case direction of { In -> inMsg ; Out -> outMsg }
101 dir inMsg outMsg = case direction of { In -> inMsg ; Out -> outMsg }
@@ -100,7 +107,7 @@ portTypes rules expr =
100 [ txt [ "Type Error: the value ", dir "coming in" "sent out"
107 [ txt [ "Type Error: the value ", dir "coming in" "sent out"
101 , " through port '", name, "' is invalid." ]
108 , " through port '", name, "' is invalid." ]
102 , txt [ "It contains ", kind, ":\n" ]
109 , txt [ "It contains ", kind, ":\n" ]
103− , (P.nest 4 . SPP.pretty $ Alias.realias rules tipe) <> P.text "\n"
110+ , (P.nest 4 . PP.pretty $ Alias.realias rules tipe) <> P.text "\n"
104 , txt [ "Acceptable values for ", dir "incoming" "outgoing", " ports include:" ]
111 , txt [ "Acceptable values for ", dir "incoming" "outgoing", " ports include:" ]
105 , txt [ " Ints, Floats, Bools, Strings, Maybes, Lists, Tuples," ]
112 , txt [ " Ints, Floats, Bools, Strings, Maybes, Lists, Tuples," ]
106 , txt [ " Json.Values, ", dir "" "first-order functions, ", "and concrete records." ]
113 , txt [ " Json.Values, ", dir "" "first-order functions, ", "and concrete records." ]