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