on 08ebf20 help sign in
elk/compiler/src/Compile.hs
103 lines 2.5 kB history raw
1{-# OPTIONS_GHC -Wall -fno-warn-unused-do-bind #-}
2module Compile
3 ( compile
4 , Artifacts(..)
5 )
6 where
9import qualified Data.ByteString as BS
10import qualified Data.Map as Map
11import qualified Data.Name as Name
13import qualified AST.Canonical as Can
14import qualified AST.Optimized as Opt
15import qualified Canonicalize.Module as Canonicalize
16import qualified Elm.Interface as I
17import qualified Elm.ModuleName as ModuleName
18import qualified Elm.Package as Pkg
19import qualified Nitpick.PatternMatches as PatternMatches
20import qualified Optimize.Module as Optimize
21import qualified Parse.Module as Parse
22import qualified Reporting.Error as Error
23import qualified Reporting.Render.Type.Localizer as L
24import qualified Reporting.Result as Result
25import qualified Reporting.Warning as Warning
26import qualified Type.Constrain.Module as Type
27import qualified Type.Solve as Type
29import System.IO.Unsafe (unsafePerformIO)
33-- COMPILE
36type Result i a =
37 Result.Result i [Warning.Warning] Error.Error a
40type ImportDict =
41 Map.Map Name.Name ModuleName.Canonical
44data Artifacts =
45 Artifacts
46 { _elmi :: I.Interface
47 , _elmo :: Opt.Graph
48 }
51compile :: Pkg.Name -> ImportDict -> I.Interfaces -> BS.ByteString -> Result i Artifacts
52compile pkg importDict interfaces source =
53 do
54 valid <- Result.mapError Error.Syntax $
55 Parse.fromByteString pkg source
57 canonical <- Result.mapError Error.Canonicalize $
58 Canonicalize.canonicalize pkg importDict interfaces valid
60 let localizer = L.fromModule valid -- TODO should this be strict for GC?
62 annotations <-
63 runTypeInference localizer canonical
65 () <-
66 exhaustivenessCheck canonical
68 graph <- Result.mapError (Error.Main localizer) $
69 Optimize.optimize annotations canonical
71 Result.ok $
72 Artifacts
73 { _elmi = I.fromModule annotations canonical
74 , _elmo = graph
75 }
79-- TYPE INFERENCE
82runTypeInference :: L.Localizer -> Can.Module -> Result i (Map.Map Name.Name Can.Annotation)
83runTypeInference localizer canonical =
84 case unsafePerformIO (Type.run =<< Type.constrain canonical) of
85 Right annotations ->
86 Result.ok annotations
88 Left errors ->
89 Result.throw (Error.Type localizer errors)
93-- EXHAUSTIVENESS CHECK
96exhaustivenessCheck :: Can.Module -> Result i ()
97exhaustivenessCheck canonical =
98 case PatternMatches.check canonical of
99 Left errors ->
100 Result.throw (Error.Pattern errors)
102 Right () ->
103 Result.ok ()