@@ -6,26 +6,38 @@ module Type.ExtraChecks (extraChecks) where
6import Control.Applicative ((<$>),(<*>))
6import Control.Applicative ((<$>),(<*>))
7import qualified Data.Map as Map
7import qualified Data.Map as Map
8import qualified Data.UnionFind.IO as UF
8import qualified Data.UnionFind.IO as UF
9−import Type.Type ( Variable, structure, Term1(..) )
9+import Type.Type ( Variable, structure, Term1(..), toSrcType )
10import Type.State (Env)
10import Type.State (Env)
11−import Type.PrettyPrint ( pretty, ParensWhen(Never) )
11+import qualified Type.Alias as Alias
12import Text.PrettyPrint as P
12import Text.PrettyPrint as P
13+import SourceSyntax.PrettyPrint (pretty)
14+import SourceSyntax.Type (Type)
15+import qualified Data.Traversable as Traverse
14−extraChecks :: Env -> IO (Either [P.Doc] Env)
17+extraChecks :: Alias.Rules -> Env -> IO (Either [P.Doc] (Map.Map String Type))
15−extraChecks env =
18+extraChecks rules env = do
16− case mainCheck env of
19+ eitherEnv <- occursCheck env
17− Left errs -> return $ Left errs
21+ Left errs -> return $ Left errs
18− Right env -> occursCheck env
22+ Right env' ->
23+ mainCheck rules <$> Traverse.traverse toSrcType env'
20−mainCheck :: Env -> Either [P.Doc] Env
26+mainCheck :: Alias.Rules -> (Map.Map String Type) -> Either [P.Doc] (Map.Map String Type)
21−mainCheck env =
27+mainCheck rules env =
28+ let acceptable = ["Graphics.Element.Element","Signal.Signal Graphics.Element.Element"] in
22 case Map.lookup "main" env of
29 case Map.lookup "main" env of
23 Nothing -> Right env
30 Nothing -> Right env
24− Just var
31+ Just tipe
25− | P.render (pretty Never var) `elem` ["Element","Signal Element"] -> Right env
32+ | P.render (pretty (Alias.canonicalRealias (fst rules) tipe)) `elem` acceptable ->
26 | otherwise ->
34 | otherwise ->
27 Left [ P.vcat [ P.text "Type Error:"
35 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
30occursCheck :: Env -> IO (Either [P.Doc] Env)
42occursCheck :: Env -> IO (Either [P.Doc] Env)
31occursCheck env = do
43occursCheck env = do