on 37e4dfe help sign in
elk/src/Elm/Compiler.hs
113 lines 2.8 kB history raw
1{-# OPTIONS_GHC -Wall #-}
2module Elm.Compiler
3 ( version, rawVersion
4 , parseDependencies, compile
5 , Error, errorToString, errorToJson
6 , Warning, warningToString, warningToJson
7 ) where
9import qualified Data.Aeson as Json
10import qualified Data.Map as Map
12import qualified AST.Module as Module
13import qualified Compile
14import qualified Elm.Compiler.Module as PublicModule
15import qualified Elm.Compiler.Version as Version
16import qualified Generate.JavaScript as JS
17import qualified Parse.Module as Parse
18import qualified Parse.Parse as Parse
19import qualified Reporting.Annotation as A
20import qualified Reporting.Error as Error
21import qualified Reporting.Result as Result
22import qualified Reporting.Warning as Warning
25-- VERSION
27version :: String
28version =
29 Version.version
32rawVersion :: [Int]
33rawVersion =
34 Version.rawVersion
37-- DEPENDENCIES
39parseDependencies
40 :: String
41 -> Either [Error] (PublicModule.Name, [PublicModule.Name])
42parseDependencies sourceCode =
43 let
44 (Result.Result _warnings rawResult) =
45 Parse.parse sourceCode Parse.header
46 in
47 case rawResult of
48 Result.Err msgs ->
49 Left $ map (Error . A.map Error.Syntax) msgs
51 Result.Ok (Module.Header names _exports imports) ->
52 Right
53 ( PublicModule.Name names
54 , map (PublicModule.Name . fst . A.drop) imports
55 )
58-- COMPILATION
60{-| Compiles Elm source code to JavaScript. -}
61compile
62 :: String
63 -> String
64 -> Bool
65 -> String
66 -> Map.Map PublicModule.Name PublicModule.Interface
67 -> ([Warning], Either [Error] (PublicModule.Interface, String))
68compile user packageName isRoot source interfaces =
69 let unwrappedInterfaces =
70 Map.mapKeysMonotonic (\(PublicModule.Name name) -> name) interfaces
72 (Result.Result warnings rawResult) =
73 Compile.compile user packageName isRoot unwrappedInterfaces source
74 in
75 (,) (map Warning warnings) $
76 case rawResult of
77 Result.Ok modul ->
78 Right (Module.toInterface modul, JS.generate modul)
80 Result.Err errors ->
81 Left (map Error errors)
84-- ERRORS
86newtype Error = Error (A.Located Error.Error)
89errorToString :: String -> String -> Error -> String
90errorToString location source (Error err) =
91 Error.toString location source err
94errorToJson :: String -> Error -> Json.Value
95errorToJson location (Error err) =
96 Error.toJson location err
99-- WARNINGS
101newtype Warning = Warning (A.Located Warning.Warning)
104warningToString :: String -> String -> Warning -> String
105warningToString location source (Warning err) =
106 Warning.toString location source err
109warningToJson :: String -> Warning -> Json.Value
110warningToJson location (Warning err) =
111 Warning.toJson location err