@@ -4,32 +4,57 @@ import qualified Data.Map as Map
4import Text.PrettyPrint (Doc)
4import Text.PrettyPrint (Doc)
6import qualified AST.Module as Module
6import qualified AST.Module as Module
7+import qualified Parse.Helpers as Parse
7import qualified Parse.Parse as Parse
8import qualified Parse.Parse as Parse
8import qualified Transform.AddDefaultImports as DefaultImports
9import qualified Transform.AddDefaultImports as DefaultImports
9import qualified Transform.Check as Check
10import qualified Transform.Check as Check
10import qualified Type.Inference as TI
11import qualified Type.Inference as TI
11import qualified Transform.Canonicalize as Canonical
12import qualified Transform.Canonicalize as Canonical
13+import Elm.Utils ((|>))
14−compile :: Bool -> Module.Interfaces -> String -> Either [Doc] Module.CanonicalModule
21+ -> Either [Doc] Module.CanonicalModule
15−compile noPrelude interfaces source =
16− do let infixes = Map.fromList . map (\(assoc,lvl,op) -> (op,(lvl,assoc)))
17− . concatMap Module.iFixities $ Map.elems interfaces
23+compile user projectName interfaces source =
19− -- Parse the source code and validate that it is well formed.
25+ -- Parse the source code
20− validModule <- do
26+ parsedModule <-
21− modul <- DefaultImports.add noPrelude `fmap` Parse.program infixes source
27+ Parse.program (getOpTable interfaces) source
22− case Check.mistakes (Module.body modul) of
26− -- Canonicalize all variables, pinning down where they came from.
29+ -- determine if default imports should be added
27− canonicalModule <- Canonical.module' interfaces validModule
30+ -- only elm-lang/core is exempt
32+ not (user == "elm-lang" && projectName == "core")
29− -- Run type inference on the program.
34+ -- add default imports if necessary
30− types <- TI.infer interfaces canonicalModule
35+ let rawModule =
36+ DefaultImports.add needsDefaults parsedModule
32− -- Add the real list of tyes
38+ -- validate module (e.g. all variables exist)
33− let body = (Module.body canonicalModule) { Module.types = types }
39+ case Check.mistakes (Module.body rawModule) of
43+ -- Canonicalize all variables, pinning down where they came from.
44+ canonicalModule <- Canonical.module' interfaces rawModule
46+ -- Run type inference on the program.
47+ types <- TI.infer interfaces canonicalModule
49+ -- Add the real list of tyes
50+ let body = (Module.body canonicalModule) { Module.types = types }
35− return $ canonicalModule { Module.body = body }
52+ return $ canonicalModule { Module.body = body }
55+getOpTable :: Module.Interfaces -> Parse.OpTable
56+getOpTable interfaces =
58+ |> concatMap Module.iFixities
59+ |> map (\(assoc,lvl,op) -> (op,(lvl,assoc)))