on 9d0075c help sign in
elk/src/Build/Source.hs
34 lines 1.3 kB history raw
1module Build.Source (build) where
3import qualified Data.Map as Map
4import Text.PrettyPrint (Doc)
6import qualified AST.Module as Module
7import qualified Parse.Parse as Parse
8import qualified Metadata.Prelude as Prelude
9import qualified Transform.Check as Check
10import qualified Type.Inference as TI
11import qualified Transform.Canonicalize as Canonical
13build :: Bool -> Module.Interfaces -> String -> Either [Doc] Module.CanonicalModule
14build noPrelude interfaces source =
15 do let infixes = Map.fromList . map (\(assoc,lvl,op) -> (op,(lvl,assoc)))
16 . concatMap Module.iFixities $ Map.elems interfaces
18 -- Parse the source code and validate that it is well formed.
19 validModule <- do
20 modul <- Prelude.add noPrelude `fmap` Parse.program infixes source
21 case Check.mistakes (Module.body modul) of
22 [] -> return modul
23 ms -> Left ms
25 -- Canonicalize all variables, pinning down where they came from.
26 canonicalModule <- Canonical.module' interfaces validModule
28 -- Run type inference on the program.
29 types <- TI.infer interfaces canonicalModule
31 -- Add the real list of tyes
32 let body = (Module.body canonicalModule) { Module.types = types }
34 return $ canonicalModule { Module.body = body }