on d5da02e help sign in
elk/src/Elm/Compiler.hs
93 lines 2.3 kB history raw
1{-# OPTIONS_GHC -Wall #-}
2{-# LANGUAGE FlexibleContexts #-}
3module Elm.Compiler
4 ( version, rawVersion
5 , parseDependencies, compile
6 , Error, errorToString
7 , Warning
8 ) where
10import Control.Monad.Error.Class (MonadError, throwError)
11import qualified Data.Map as Map
13import qualified AST.Module as Module
14import qualified Compile
15import qualified Elm.Compiler.Module as PublicModule
16import qualified Elm.Compiler.Version as Version
17import qualified Generate.JavaScript as JS
18import qualified Parse.Helpers as Help
19import qualified Parse.Module as Parse
20import qualified Reporting.Annotation as A
21import qualified Reporting.Error as Error
22import qualified Reporting.Result as Result
23import qualified Reporting.Warning as Warning
26-- VERSION
28version :: String
29version =
30 Version.version
33rawVersion :: [Int]
34rawVersion =
35 Version.rawVersion
38-- DEPENDENCIES
40parseDependencies
41 :: (MonadError String m)
42 => String
43 -> m (PublicModule.Name, [PublicModule.Name])
44parseDependencies src =
45 case Help.iParse Parse.header src of
46 Left msg ->
47 throwError (show msg)
49 Right (Module.Header names _exports imports) ->
50 return
51 ( PublicModule.Name names
52 , map (PublicModule.Name . fst . A.drop) imports
53 )
56-- COMPILATION
58{-| Compiles Elm source code to JavaScript. -}
59compile
60 :: String
61 -> String
62 -> String
63 -> Map.Map PublicModule.Name PublicModule.Interface
64 -> ([Warning], Either [Error] (PublicModule.Interface, String))
65compile user packageName source interfaces =
66 let unwrappedInterfaces =
67 Map.mapKeysMonotonic (\(PublicModule.Name name) -> name) interfaces
69 (Result.Result warnings rawResult) =
70 Compile.compile user packageName unwrappedInterfaces source
71 in
72 (,) (map Warning warnings) $
73 case rawResult of
74 Result.Ok modul ->
75 Right (Module.toInterface modul, JS.generate modul)
77 Result.Err errors ->
78 Left (map Error errors)
81-- ERRORS
83newtype Error = Error (A.Located Error.Error)
86errorToString :: String -> String -> Error -> String
87errorToString location source (Error err) =
88 Error.toString location source err
91-- WARNINGS
93newtype Warning = Warning (A.Located Warning.Warning)