on bbb6583 help sign in
elk/src/Compile.hs
68 lines 2.1 kB history raw
1module Compile (compile) where
3import qualified Data.Map as Map
5import qualified AST.Module as Module
6import qualified AST.Module.Name as ModuleName
7import qualified Canonicalize
8import Elm.Utils ((|>))
9import qualified Elm.Package as Package
10import qualified Nitpick.PatternMatches as Nitpick
11import qualified Nitpick.TopLevelTypes as Nitpick
12import qualified Optimize
13import qualified Parse.Helpers as Parse
14import qualified Parse.Parse as Parse
15import qualified Reporting.Error as Error
16import qualified Reporting.Result as Result
17import qualified Reporting.Warning as Warning
18import qualified Type.Inference as TI
21compile
22 :: Package.Name
23 -> [ModuleName.Canonical]
24 -> Module.Interfaces
25 -> String
26 -> Result.Result Warning.Warning Error.Error Module.Optimized
28compile packageName canonicalImports interfaces source =
29 do
30 -- Parse the source code
31 validModule <-
32 Result.mapError Error.Syntax $
33 Parse.program packageName (getOpTable interfaces) source
35 -- Canonicalize all variables, pinning down where they came from.
36 canonicalModule <-
37 Canonicalize.module' canonicalImports interfaces validModule
39 -- Run type inference on the program.
40 types <-
41 Result.from Error.Type $
42 TI.infer interfaces canonicalModule
44 -- One last round of checks
45 Result.mapError Error.Type $
46 Nitpick.topLevelTypes types (Module.validDecls (Module.info validModule))
48 tagDict <-
49 Result.mapError Error.Pattern $
50 Nitpick.patternMatches interfaces canonicalModule
52 -- Add the real list of types
53 let canonicalInfo =
54 (Module.info canonicalModule) { Module.types = types }
56 -- Do some basic optimizations
57 let optModule =
58 Optimize.optimize tagDict (canonicalModule { Module.info = canonicalInfo })
60 return optModule
63getOpTable :: Module.Interfaces -> Parse.OpTable
64getOpTable interfaces =
65 Map.elems interfaces
66 |> concatMap Module.iFixities
67 |> map (\(assoc,lvl,op) -> (op,(lvl,assoc)))
68 |> Map.fromList