@@ -2,57 +2,28 @@
2module Build.Source (build) where
2module Build.Source (build) where
4import qualified Data.Map as Map
4import qualified Data.Map as Map
5−import System.FilePath as FP
6import Text.PrettyPrint (Doc)
5import Text.PrettyPrint (Doc)
9import AST.Module
7import AST.Module
10−import qualified AST.Expression.General as Expr
11−import qualified AST.Pattern as Pattern
12−import qualified AST.Type as Type
13import qualified Parse.Parse as Parse
8import qualified Parse.Parse as Parse
14import qualified Metadata.Prelude as Prelude
9import qualified Metadata.Prelude as Prelude
15import qualified Transform.Check as Check
10import qualified Transform.Check as Check
16−import qualified Transform.SortDefinitions as SD
17import qualified Type.Inference as TI
11import qualified Type.Inference as TI
18−import qualified Transform.Declaration as TcDecl
19import qualified Transform.Canonicalize as Canonical
12import qualified Transform.Canonicalize as Canonical
21−build :: Bool -> Interfaces -> String -> Either [Doc] MetadataModule
14+build :: Bool -> Interfaces -> String -> Either [Doc] CanonicalModule
22build noPrelude interfaces source =
15build noPrelude interfaces source =
23− do let add = Prelude.add noPrelude
24− infixes = Map.fromList . map (\(assoc,lvl,op) -> (op,(lvl,assoc)))
16+ do let infixes = Map.fromList . map (\(assoc,lvl,op) -> (op,(lvl,assoc)))
25 . concatMap iFixities $ Map.elems interfaces
17 . concatMap iFixities $ Map.elems interfaces
27− Module names exs ims decls <- do
19+ validModule <- do
28− modul@(Module _ _ _ decls) <- add `fmap` Parse.program infixes source
20+ modul <- Prelude.add noPrelude `fmap` Parse.program infixes source
29− case Check.mistakes decls of
21+ case Check.mistakes (body modul) of
30− [] -> return modul
22+ [] -> return modul
31− ms -> Left ms
23+ ms -> Left ms
33− let exports'
25+ canonicalModule <- Canonical.module' interfaces validModule
35− let get = Pattern.boundVarList in
36− concat [ get pattern | Definition (Expr.Definition pattern _ _) <- decls ] ++
37− concat [ map fst ctors | Datatype _ _ ctors <- decls ] ++
38− [ name | TypeAlias name _ (Type.Record _ _) <- decls ]
41− metaModule <- Canonical.metadataModule interfaces $
27+ types <- TI.infer interfaces canonicalModule
44− , path = FP.joinPath names
47− -- reorder AST into strongly connected components
48− , program = SD.sortDefs . Expr.dummyLet $ TcDecl.toExpr decls
50− , datatypes = [ (name,vars,ctors) | Datatype name vars ctors <- decls ]
51− , fixities = [ (assoc,level,op) | Fixity assoc level op <- decls ]
52− , aliases = [ (name,tvs,tipe) | TypeAlias name tvs tipe <- decls ]
53− , ports = [ portName port | Port port <- decls ]
56− types <- TI.infer interfaces metaModule
58− return $ metaModule { types = types }
29+ return $ canonicalModule { body = (body canonicalModule) { types = types } }