on 1238607 help sign in
elk/compiler/src/Compile.hs
84 lines 2.3 kB history raw
1{-# OPTIONS_GHC -Wall -fno-warn-unused-do-bind #-}
2module Compile
3 ( Artifacts(..)
4 , compile
5 )
6 where
9import qualified Data.Map as Map
10import qualified Data.Name as Name
11import qualified Data.OneOrMore as OneOrMore
13import qualified AST.Source as Src
14import qualified AST.Canonical as Can
15import qualified AST.Optimized as Opt
16import qualified Canonicalize.Module as Canonicalize
17import qualified Elm.Interface as I
18import qualified Elm.ModuleName as ModuleName
19import qualified Elm.Package as Pkg
20import qualified Nitpick.PatternMatches as PatternMatches
21import qualified Optimize.Module as Optimize
22import qualified Reporting.Error as E
23import qualified Reporting.Result as R
24import qualified Reporting.Warning as W
25import qualified Type.Constrain.Module as Type
26import qualified Type.Solve as Type
28import System.IO.Unsafe (unsafePerformIO)
32-- COMPILE
35data Artifacts =
36 Artifacts
37 { _modul :: Can.Module
38 , _types :: Map.Map Name.Name Can.Annotation
39 , _graph :: Opt.LocalGraph
40 }
43compile :: Pkg.Name -> Map.Map ModuleName.Raw I.Interface -> Src.Module -> Either (OneOrMore.OneOrMore E.Error) Artifacts
44compile pkg ifaces modul =
45 snd $ R.run $
46 do canonical <- canonicalize pkg ifaces modul
47 annotations <- typeCheck canonical
48 () <- nitpick canonical
49 objects <- optimize annotations canonical
50 return (Artifacts canonical annotations objects)
54-- PHASES
57canonicalize :: Pkg.Name -> Map.Map ModuleName.Raw I.Interface -> Src.Module -> R.Result i [W.Warning] E.Error Can.Module
58canonicalize pkg ifaces modul =
59 R.mapError E.Canonicalize $ Canonicalize.canonicalize pkg ifaces modul
62typeCheck :: Can.Module -> R.Result i w E.Error (Map.Map Name.Name Can.Annotation)
63typeCheck canonical =
64 case unsafePerformIO (Type.run =<< Type.constrain canonical) of
65 Right annotations ->
66 R.ok annotations
68 Left errors ->
69 R.throw (E.Type errors)
72nitpick :: Can.Module -> R.Result i w E.Error ()
73nitpick canonical =
74 case PatternMatches.check canonical of
75 Right () ->
76 R.ok ()
78 Left errors ->
79 R.throw (E.Pattern errors)
82optimize :: Map.Map Name.Name Can.Annotation -> Can.Module -> R.Result i [W.Warning] E.Error Opt.LocalGraph
83optimize annotations canonical =
84 R.mapError E.Main $ Optimize.optimize annotations canonical