@@ -4,7 +4,7 @@ module Build.Source (build) where
4import qualified Data.Map as Map
4import qualified Data.Map as Map
5import Text.PrettyPrint (Doc)
5import Text.PrettyPrint (Doc)
7−import AST.Module
7+import AST.Module as Module
8import qualified Parse.Parse as Parse
8import qualified Parse.Parse as Parse
9import qualified Metadata.Prelude as Prelude
9import qualified Metadata.Prelude as Prelude
10import qualified Transform.Check as Check
10import qualified Transform.Check as Check
@@ -16,14 +16,21 @@ build noPrelude interfaces source =
16 do let infixes = Map.fromList . map (\(assoc,lvl,op) -> (op,(lvl,assoc)))
16 do let infixes = Map.fromList . map (\(assoc,lvl,op) -> (op,(lvl,assoc)))
17 . concatMap iFixities $ Map.elems interfaces
17 . concatMap iFixities $ Map.elems interfaces
19+ -- Parse the source code and validate that it is well formed.
19 validModule <- do
20 validModule <- do
20 modul <- Prelude.add noPrelude `fmap` Parse.program infixes source
21 modul <- Prelude.add noPrelude `fmap` Parse.program infixes source
21 case Check.mistakes (body modul) of
22 case Check.mistakes (body modul) of
22 [] -> return modul
23 [] -> return modul
23 ms -> Left ms
24 ms -> Left ms
26+ -- Canonicalize all variables, pinning down where they came from.
25 canonicalModule <- Canonical.module' interfaces validModule
27 canonicalModule <- Canonical.module' interfaces validModule
29+ -- Run type inference on the program.
27 types <- TI.infer interfaces canonicalModule
30 types <- TI.infer interfaces canonicalModule
32+ -- Trim down the set of exported values to the stuff that is actually exported.
33+ let types' = Canonical.filterExports types (Module.exports canonicalModule)
34+ body' = (body canonicalModule) { types = types' }
29− return $ canonicalModule { body = (body canonicalModule) { types = types } }
36+ return $ canonicalModule { body = body' }