@@ -2,41 +2,42 @@ module Initialize (buildFromSource, getSortedModuleNames) where
3import Control.Applicative ((<$>))
3import Control.Applicative ((<$>))
4import Control.Monad.Error
4import Control.Monad.Error
5−import Data.List (lookup,nub)
5+import Data.List (nub)
6import qualified Data.Map as Map
6import qualified Data.Map as Map
7import Data.Data
7import Data.Data
8−import SourceSyntax.Everything
9import Data.List (intercalate,partition)
8import Data.List (intercalate,partition)
10+import System.FilePath
11+import Text.PrettyPrint (Doc)
10import Parse.Parser (parseProgram, parseDependencies)
13import Parse.Parser (parseProgram, parseDependencies)
14+import SourceSyntax.Everything
11import qualified Metadata.Libraries as Libs
15import qualified Metadata.Libraries as Libs
12import qualified Transform.Optimize as Optimize
16import qualified Transform.Optimize as Optimize
13import qualified Transform.Check as Check
17import qualified Transform.Check as Check
14−import System.Exit
18+import qualified Type.Inference as TI
15−import System.FilePath
19+import qualified Type.Type as T
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)
23checkMistakes modul@(Module name ex im decls) =
24checkMistakes modul@(Module name ex im decls) =
24 case Check.mistakes decls of
25 case Check.mistakes decls of
25 [] -> return modul
26 [] -> return modul
26− ms -> Left (unlines ms)
27+ ms -> Left ms
29+-- subs `seq` return (Optimize.optimize (renameModule modul))
28−checkTypes :: (Data t, Data v) => Module t v -> Either String (Module t v)
31+buildFromSource :: (Data t, Data v) => Bool -> String -> Either [Doc] (Module t v, Map.Map String T.Variable)
29−checkTypes modul =
32+buildFromSource noPrelude src = do
30− do subs <- unify hints modul
33+ modul <- parseProgram src
31− subs `seq` return (Optimize.optimize (renameModule modul))
33−check :: (Data t, Data v) => Module t v -> Either String (Module t v)
35+ -- check for structural errors and give all variables unique names
34−check = checkMistakes >=> checkTypes
36+ modul' <- renameModule <$> checkMistakes modul
37+ -- reorder AST into strongly connected components
36−buildFromSource :: (Data t, Data v) => Bool -> String -> Either String (Module t v)
39+ types <- TI.infer modul'
37−buildFromSource noPrelude src =
40+ return (modul', types)
38− let add = if noPrelude then id else Libs.addPrelude in
39− (check . add) =<< parseProgram src
41getSortedModuleNames :: FilePath -> IO [String]
42getSortedModuleNames :: FilePath -> IO [String]
42getSortedModuleNames root =
43getSortedModuleNames root =