on 253bb13 help sign in
elk/compiler/src/Compile.hs
83 lines 2.2 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
12import qualified AST.Source as Src
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 Reporting.Error as E
22import qualified Reporting.Result as R
23import qualified Type.Constrain.Module as Type
24import qualified Type.Solve as Type
26import System.IO.Unsafe (unsafePerformIO)
30-- COMPILE
33data Artifacts =
34 Artifacts
35 { _modul :: Can.Module
36 , _types :: Map.Map Name.Name Can.Annotation
37 , _graph :: Opt.LocalGraph
38 }
41compile :: Pkg.Name -> Map.Map ModuleName.Raw I.Interface -> Src.Module -> Either E.Error Artifacts
42compile pkg ifaces modul =
43 do canonical <- canonicalize pkg ifaces modul
44 annotations <- typeCheck canonical
45 () <- nitpick canonical
46 objects <- optimize annotations canonical
47 return (Artifacts canonical annotations objects)
51-- PHASES
54canonicalize :: Pkg.Name -> Map.Map ModuleName.Raw I.Interface -> Src.Module -> Either E.Error Can.Module
55canonicalize pkg ifaces modul =
56 snd $ R.run E.BadNames $
57 Canonicalize.canonicalize pkg ifaces modul
60typeCheck :: Can.Module -> Either E.Error (Map.Map Name.Name Can.Annotation)
61typeCheck canonical =
62 case unsafePerformIO (Type.run =<< Type.constrain canonical) of
63 Right annotations ->
64 Right annotations
66 Left errors ->
67 Left (E.BadTypes errors)
70nitpick :: Can.Module -> Either E.Error ()
71nitpick canonical =
72 case PatternMatches.check canonical of
73 Right () ->
74 Right ()
76 Left errors ->
77 Left (E.BadPatterns errors)
80optimize :: Map.Map Name.Name Can.Annotation -> Can.Module -> Either E.Error Opt.LocalGraph
81optimize annotations canonical =
82 snd $ R.run E.BadMains $
83 Optimize.optimize annotations canonical