on 94ebc2d help sign in
elk/src/Compile.hs
74 lines 2.2 kB history raw
1module Compile (compile) where
3import qualified Data.Map as Map
5import qualified AST.Declaration as D
6import qualified AST.Module as Module
7import qualified AST.Module.Name as ModuleName
8import qualified Canonicalize
9import Elm.Utils ((|>))
10import qualified Elm.Package as Package
11import qualified Nitpick.PatternMatches as Nitpick
12import qualified Nitpick.TopLevelTypes as Nitpick
13import qualified Optimize
14import qualified Parse.Helpers as Parse
15import qualified Parse.Parse as Parse
16import qualified Reporting.Error as Error
17import qualified Reporting.Render.Type as RenderType
18import qualified Reporting.Result as Result
19import qualified Reporting.Warning as Warning
20import qualified Type.Inference as TI
24type Result =
25 Result.Result (Result.One RenderType.Localizer) Warning.Warning Error.Error
28compile
29 :: Package.Name
30 -> [ModuleName.Canonical]
31 -> Module.Interfaces
32 -> String
33 -> Result Module.Optimized
34compile packageName canonicalImports interfaces source =
35 do
36 -- Parse the source code
37 validModule <-
38 Result.format Error.Syntax $
39 Parse.program packageName (getOpTable interfaces) source
41 -- Canonicalize all variables, pinning down where they came from.
42 canonicalModule <-
43 Canonicalize.module' canonicalImports interfaces validModule
45 -- Run type inference on the program.
46 types <-
47 Result.from Error.Type $
48 TI.infer interfaces canonicalModule
50 -- One last round of checks
51 Result.format Error.Type $
52 Nitpick.topLevelTypes types (Module.validDecls (Module.info validModule))
54 tagDict <-
55 Result.format Error.Pattern $
56 Nitpick.patternMatches interfaces canonicalModule
58 -- Add the real list of types
59 let canonicalInfo =
60 (Module.info canonicalModule) { Module.types = types }
62 -- Do some basic optimizations
63 let optModule =
64 Optimize.optimize tagDict (canonicalModule { Module.info = canonicalInfo })
66 return optModule
69getOpTable :: Module.Interfaces -> Parse.OpTable
70getOpTable interfaces =
71 Map.elems interfaces
72 |> concatMap Module.iFixities
73 |> map (\(D.Infix op assoc lvl) -> ( op, (lvl,assoc) ))
74 |> Map.fromList