on 8a89c86 help sign in
elk/src/Compile.hs
80 lines 2.5 kB history raw
1{-# OPTIONS_GHC -Wall -fno-warn-unused-do-bind #-}
2module Compile (compile) where
4import Data.Map (Map)
5import Data.Text (Text)
7import qualified AST.Expression.Canonical as Can
8import qualified AST.Module as Module
9import qualified AST.Module.Name as ModuleName
10import qualified Canonicalize
11import qualified Elm.Package as Package
12import qualified Nitpick.PatternMatches as Nitpick
13import qualified Nitpick.TopLevelTypes as Nitpick
14import qualified Optimize
15import qualified Parse.Parse as Parse (program)
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
24-- COMPILE
27type Result =
28 Result.Result (Result.One RenderType.Localizer) Warning.Warning Error.Error
31compile
32 :: Package.Name
33 -> Map ModuleName.Raw ModuleName.Canonical
34 -> Module.Interfaces
35 -> Text
36 -> Result Module.Optimized
37compile packageName importDict interfaces source =
38 do
39 -- Parse the source code
40 validModule <-
41 Result.format Error.Syntax $
42 {-# SCC elm_compiler_parse #-}
43 Parse.program packageName source
45 -- Canonicalize all variables, pinning down where they came from.
46 canonicalModule <-
47 {-# SCC elm_compiler_canonicalize #-}
48 Canonicalize.module' importDict interfaces validModule
50 -- Run type inference on the program.
51 types <-
52 Result.from Error.Type $
53 {-# SCC elm_compiler_types #-}
54 TI.infer interfaces canonicalModule
56 -- One last round of checks
57 canonicalDefs <-
58 Result.format Error.Type $
59 {-# SCC elm_compiler_nitpick #-}
60 Nitpick.topLevelTypes types $
61 Can.toSortedDefs (Module.program (Module.info canonicalModule))
63 tagDict <-
64 Result.format Error.Pattern $
65 {-# SCC elm_compiler_exhaustiveness #-}
66 Nitpick.patternMatches interfaces canonicalModule
68 -- Do some basic optimizations
69 let optimisedDefs =
70 {-# SCC elm_compiler_optimization #-}
71 Optimize.optimize tagDict (Module.name canonicalModule) canonicalDefs
73 -- Add the real list of types
74 let info =
75 (Module.info canonicalModule)
76 { Module.types = types
77 , Module.program = optimisedDefs
78 }
80 return $ canonicalModule { Module.info = info }