on e35986b help sign in
elk/src/Compile.hs
61 lines 1.8 kB history raw
1module Compile (compile) where
3import qualified Data.Map as Map
5import qualified AST.Module as Module
6import qualified Canonicalize
7import Elm.Utils ((|>))
8import qualified Nitpick.TopLevelTypes as Nitpick
9import qualified Parse.Helpers as Parse
10import qualified Parse.Parse as Parse
11import qualified Reporting.Error as Error
12import qualified Reporting.Result as Result
13import qualified Reporting.Warning as Warning
14import qualified Type.Inference as TI
17compile
18 :: String
19 -> String
20 -> Bool
21 -> Module.Interfaces
22 -> String
23 -> Result.Result Warning.Warning Error.Error Module.CanonicalModule
25compile user projectName isRoot interfaces source =
26 do
27 -- determine if default imports should be added
28 -- only elm-lang/core is exempt
29 let needsDefaults =
30 not (user == "elm-lang" && projectName == "core")
32 -- Parse the source code
33 validModule <-
34 Result.mapError Error.Syntax $
35 Parse.program needsDefaults isRoot (getOpTable interfaces) source
37 -- Canonicalize all variables, pinning down where they came from.
38 canonicalModule <-
39 Canonicalize.module' interfaces validModule
41 -- Run type inference on the program.
42 types <-
43 Result.from Error.Type $
44 TI.infer interfaces canonicalModule
46 -- One last round of checks
47 Result.mapError Error.Type $
48 Nitpick.topLevelTypes types (Module.body validModule)
50 -- Add the real list of types
51 let body = (Module.body canonicalModule) { Module.types = types }
53 return $ canonicalModule { Module.body = body }
56getOpTable :: Module.Interfaces -> Parse.OpTable
57getOpTable interfaces =
58 Map.elems interfaces
59 |> concatMap Module.iFixities
60 |> map (\(assoc,lvl,op) -> (op,(lvl,assoc)))
61 |> Map.fromList