@@ -2,41 +2,42 @@ module Initialize (buildFromSource, getSortedModuleNames) where
22
33import Control.Applicative ((<$>))
44import Control.Monad.Error
5−import Data.List (lookup,nub)
5+import Data.List (nub)
66import qualified Data.Map as Map
77import Data.Data
8−import SourceSyntax.Everything
98import Data.List (intercalate,partition)
9+import System.Exit
10+import System.FilePath
11+import Text.PrettyPrint (Doc)
12+
1013import Parse.Parser (parseProgram, parseDependencies)
14+import SourceSyntax.Everything
1115import qualified Metadata.Libraries as Libs
1216import qualified Transform.Optimize as Optimize
1317import qualified Transform.Check as Check
14−import System.Exit
15−import System.FilePath
18+import qualified Type.Inference as TI
19+import qualified Type.Type as T
1620
1721
18−unify = undefined
19−hints = undefined
2022
21−
22−checkMistakes :: (Data t, Data v) => Module t v -> Either String (Module t v)
23+checkMistakes :: (Data t, Data v) => Module t v -> Either [Doc] (Module t v)
2324checkMistakes modul@(Module name ex im decls) =
2425 case Check.mistakes decls of
2526 [] -> return modul
26− ms -> Left (unlines ms)
27+ ms -> Left ms
28+
29+-- subs `seq` return (Optimize.optimize (renameModule modul))
2730
28−checkTypes :: (Data t, Data v) => Module t v -> Either String (Module t v)
29−checkTypes modul =
30− do subs <- unify hints modul
31− subs `seq` return (Optimize.optimize (renameModule modul))
31+buildFromSource :: (Data t, Data v) => Bool -> String -> Either [Doc] (Module t v, Map.Map String T.Variable)
32+buildFromSource noPrelude src = do
33+ modul <- parseProgram src
3234
33−check :: (Data t, Data v) => Module t v -> Either String (Module t v)
34−check = checkMistakes >=> checkTypes
35+ -- check for structural errors and give all variables unique names
36+ modul' <- renameModule <$> checkMistakes modul
37+ -- reorder AST into strongly connected components
3538
36−buildFromSource :: (Data t, Data v) => Bool -> String -> Either String (Module t v)
37−buildFromSource noPrelude src =
38− let add = if noPrelude then id else Libs.addPrelude in
39− (check . add) =<< parseProgram src
39+ types <- TI.infer modul'
40+ return (modul', types)
4041
4142getSortedModuleNames :: FilePath -> IO [String]
4243getSortedModuleNames root =