@@ -6,26 +6,38 @@ module Type.ExtraChecks (extraChecks) where
66import Control.Applicative ((<$>),(<*>))
77import qualified Data.Map as Map
88import qualified Data.UnionFind.IO as UF
9−import Type.Type ( Variable, structure, Term1(..) )
9+import Type.Type ( Variable, structure, Term1(..), toSrcType )
1010import Type.State (Env)
11−import Type.PrettyPrint ( pretty, ParensWhen(Never) )
11+import qualified Type.Alias as Alias
1212import Text.PrettyPrint as P
13+import SourceSyntax.PrettyPrint (pretty)
14+import SourceSyntax.Type (Type)
15+import qualified Data.Traversable as Traverse
1316
14−extraChecks :: Env -> IO (Either [P.Doc] Env)
15−extraChecks env =
16− case mainCheck env of
17− Left errs -> return $ Left errs
18− Right env -> occursCheck env
17+extraChecks :: Alias.Rules -> Env -> IO (Either [P.Doc] (Map.Map String Type))
18+extraChecks rules env = do
19+ eitherEnv <- occursCheck env
20+ case eitherEnv of
21+ Left errs -> return $ Left errs
22+ Right env' ->
23+ mainCheck rules <$> Traverse.traverse toSrcType env'
24+
1925
20−mainCheck :: Env -> Either [P.Doc] Env
21−mainCheck env =
26+mainCheck :: Alias.Rules -> (Map.Map String Type) -> Either [P.Doc] (Map.Map String Type)
27+mainCheck rules env =
28+ let acceptable = ["Graphics.Element.Element","Signal.Signal Graphics.Element.Element"] in
2229 case Map.lookup "main" env of
2330 Nothing -> Right env
24− Just var
25− | P.render (pretty Never var) `elem` ["Element","Signal Element"] -> Right env
31+ Just tipe
32+ | P.render (pretty (Alias.canonicalRealias (fst rules) tipe)) `elem` acceptable ->
33+ Right env
2634 | otherwise ->
2735 Left [ P.vcat [ P.text "Type Error:"
28− , P.text "'main' must be an Element or a (Signal Element)\n" ] ]
36+ , P.text "Bad type for 'main'. It must have type Element or a (Signal Element)"
37+ , P.text "Instead 'main' has type:\n"
38+ , P.nest 4 . pretty $ Alias.realias rules tipe
39+ , P.text " " ]
40+ ]
2941
3042occursCheck :: Env -> IO (Either [P.Doc] Env)
3143occursCheck env = do