on 538992b help sign in
elk/compiler/src/Compile.hs
131 lines 3.1 kB history raw
1{-# OPTIONS_GHC -Wall -fno-warn-unused-do-bind #-}
2module Compile
3 ( DocsFlag(..)
4 , compile
5 , Artifacts(..)
6 )
7 where
10import qualified Data.ByteString as BS
11import qualified Data.Map as Map
13import qualified AST.Source as Src
14import qualified AST.Valid as Valid
15import qualified AST.Canonical as Can
16import qualified AST.Optimized as Opt
17import qualified AST.Module.Name as ModuleName
18import qualified Canonicalize.Module as Canonicalize
19import qualified Elm.Docs as Docs
20import qualified Elm.Interface as I
21import qualified Elm.Name as N
22import qualified Elm.Package as Pkg
23import qualified Nitpick.PatternMatches as PatternMatches
24import qualified Optimize.Module as Optimize
25import qualified Parse.Parse as Parse
26import qualified Reporting.Error as Error
27import qualified Reporting.Render.Type.Localizer as L
28import qualified Reporting.Result as Result
29import qualified Reporting.Warning as Warning
30import qualified Type.Constrain.Module as Type
31import qualified Type.Solve as Type
33import System.IO.Unsafe (unsafePerformIO)
37-- COMPILE
40type Result i a =
41 Result.Result i [Warning.Warning] Error.Error a
44type ImportDict =
45 Map.Map N.Name ModuleName.Canonical
48data Artifacts =
49 Artifacts
50 { _elmi :: I.Interface
51 , _elmo :: Opt.Graph
52 , _docs :: Maybe Docs.Module
53 }
56compile :: DocsFlag -> Pkg.Name -> ImportDict -> I.Interfaces -> BS.ByteString -> Result i Artifacts
57compile flag pkg importDict interfaces source =
58 do
59 valid <- Result.mapError Error.Syntax $
60 Parse.program pkg source
62 canonical <- Result.mapError Error.Canonicalize $
63 Canonicalize.canonicalize pkg importDict interfaces valid
65 annotations <-
66 runTypeInference (Valid._imports valid) canonical
68 () <-
69 exhaustivenessCheck canonical
71 graph <- Result.mapError Error.Main $
72 Optimize.optimize annotations canonical
74 documentation <-
75 genarateDocs flag canonical
77 Result.ok $
78 Artifacts
79 { _elmi = I.fromModule annotations canonical
80 , _elmo = graph
81 , _docs = documentation
82 }
86-- TYPE INFERENCE
89runTypeInference :: [Src.Import] -> Can.Module -> Result i (Map.Map N.Name Can.Annotation)
90runTypeInference imports canonical =
91 case unsafePerformIO (Type.run =<< Type.constrain canonical) of
92 Right annotations ->
93 Result.ok annotations
95 Left errors ->
96 let
97 localizer =
98 L.fromImports (ModuleName._module (Can._name canonical)) imports
99 in
100 Result.throw (Error.Type localizer errors)
104-- EXHAUSTIVENESS CHECK
107exhaustivenessCheck :: Can.Module -> Result i ()
108exhaustivenessCheck canonical =
109 case PatternMatches.check canonical of
110 Left errors ->
111 Result.throw (Error.Pattern errors)
113 Right () ->
114 Result.ok ()
118-- DOCUMENTATION
121data DocsFlag = YesDocs | NoDocs
124genarateDocs :: DocsFlag -> Can.Module -> Result.Result i w Error.Error (Maybe Docs.Module)
125genarateDocs flag modul =
126 case flag of
127 NoDocs ->
128 Result.ok Nothing
130 YesDocs ->
131 Just <$> Docs.fromModule modul