on 62bed13 help sign in
elk/src/Elm/Compiler.hs
110 lines 2.6 kB history raw
1{-# OPTIONS_GHC -Wall #-}
2{-# LANGUAGE FlexibleContexts #-}
3module Elm.Compiler
4 ( version, rawVersion
5 , parseDependencies, compile
6 , Error, errorToString, errorToJson
7 , Warning, warningToString, warningToJson
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 :: Error -> String
87errorToString (Error err) =
88 Error.toString err
91errorToJson :: Error -> String
92errorToJson (Error err) =
93 Error.toJson err
96-- WARNINGS
98newtype Warning = Warning (A.Located Warning.Warning)
101warningToString :: Warning -> String
102warningToString (Warning warning) =
103 Warning.toString warning
106warningToJson :: Warning -> String
107warningToJson (Warning warning) =
108 Warning.toJson warning