on fdcaaed help sign in
elk/src/Elm/Compiler.hs
77 lines 2.1 kB history raw
1{-# OPTIONS_GHC -Wall #-}
2{-# LANGUAGE FlexibleContexts #-}
3module Elm.Compiler (version, parseDependencies, compile, runtimePath) where
5import Control.Monad.Error (MonadError, throwError)
6import qualified Data.List as List
7import qualified Data.Map as Map
8import qualified Text.PrettyPrint as P
10import qualified AST.Module as Module (HeaderAndImports(HeaderAndImports), toInterface)
11import qualified Compile
12import qualified Elm.Compiler.Module as PublicModule
13import qualified Elm.Compiler.Version as Version
14import Elm.Utils ((|>))
15import qualified Elm.Utils as Utils
16import qualified Generate.JavaScript as JS
17import qualified Parse.Helpers as Help
18import qualified Parse.Module as Parse
19import qualified Paths_elm_compiler as Paths
22-- VERSION
24version :: String
25version =
26 Version.version
29-- DEPENDENCIES
31parseDependencies
32 :: (MonadError String m)
33 => String
34 -> m (PublicModule.Name, [PublicModule.Name])
35parseDependencies src =
36 case Help.iParse Parse.headerAndImports src of
37 Left msg ->
38 throwError (show msg)
40 Right (Module.HeaderAndImports names _exports imports) ->
41 return
42 ( PublicModule.Name names
43 , map (PublicModule.Name . fst) imports
44 )
47-- COMPILATION
49{-| Compiles Elm source code to JavaScript. -}
50compile
51 :: String
52 -> String
53 -> String
54 -> Map.Map PublicModule.Name PublicModule.Interface
55 -> Either String (PublicModule.Interface, String)
56compile user packageName source interfaces =
57 let unwrappedInterfaces =
58 Map.mapKeysMonotonic (\(PublicModule.Name name) -> name) interfaces
59 in
60 case Compile.compile user packageName unwrappedInterfaces source of
61 Right modul ->
62 Right (Module.toInterface modul, JS.generate modul)
64 Left docs ->
65 map P.render docs
66 |> List.intersperse ""
67 |> unlines
68 |> Left
71-- DATA FILES
73{-| Path to the runtime.
74-}
75runtimePath :: IO FilePath
76runtimePath =
77 Utils.getAsset "compiler" Paths.getDataFileName "runtime/core.js"