@@ -12,18 +12,20 @@ import SourceSyntax.Module as Module
12import qualified SourceSyntax.Expression as Expr
12import qualified SourceSyntax.Expression as Expr
13import SourceSyntax.Location (Located, noneNoDocs)
13import SourceSyntax.Location (Located, noneNoDocs)
14import SourceSyntax.PrettyPrint
14import SourceSyntax.PrettyPrint
15+import SourceSyntax.Type (Type)
15import Text.PrettyPrint
16import Text.PrettyPrint
16import qualified Type.State as TS
17import qualified Type.State as TS
17import Type.ExtraChecks (extraChecks)
18import Type.ExtraChecks (extraChecks)
18import Control.Monad.State
19import Control.Monad.State
19import Control.Arrow (second)
20import Control.Arrow (second)
20import Transform.SortDefinitions as Sort
21import Transform.SortDefinitions as Sort
22+import qualified Data.Traversable as Traverse
22import System.IO.Unsafe -- Possible to switch over to the ST monad instead of
24import System.IO.Unsafe -- Possible to switch over to the ST monad instead of
23 -- the IO monad. I don't think that'd be worthwhile.
25 -- the IO monad. I don't think that'd be worthwhile.
26−infer :: Interfaces -> MetadataModule t v -> Either [Doc] (Map.Map String T.Variable)
28+infer :: Interfaces -> MetadataModule t v -> Either [Doc] (Map.Map String Type)
27infer interfaces modul = unsafePerformIO $ do
29infer interfaces modul = unsafePerformIO $ do
28 env <- Env.initialEnvironment
30 env <- Env.initialEnvironment
29 (datatypes modul ++ concatMap iAdts (Map.elems interfaces))
31 (datatypes modul ++ concatMap iAdts (Map.elems interfaces))
@@ -45,8 +47,9 @@ infer interfaces modul = unsafePerformIO $ do
45 constraint <- environ `fmap` TcExpr.constrain env (program modul) (T.VarN fvar)
47 constraint <- environ `fmap` TcExpr.constrain env (program modul) (T.VarN fvar)
47 state <- execStateT (Solve.solve constraint) TS.initialState
49 state <- execStateT (Solve.solve constraint) TS.initialState
48− let errors = TS.sErrors state
50+ case TS.sErrors state of
49− if null errors
51+ errors@(_:_) -> Left `fmap` sequence (reverse errors)
50− then extraChecks $ Map.difference (TS.sSavedEnv state) header
52+ [] -> let types = Map.difference (TS.sSavedEnv state) header in
51− else Left `fmap` sequence (reverse errors)
53+ do srcTypes <- Traverse.traverse T.toSrcType types
54+ return $ Right srcTypes