on dca97ae help sign in
elk/src/Elm/Compiler.hs
94 lines 2.3 kB history raw
1{-# OPTIONS_GHC -Wall #-}
2module Elm.Compiler
3 ( version, rawVersion
4 , parseDependencies, compile
5 , Error, errorToString
6 , Warning
7 ) where
9import qualified Data.Map as Map
11import qualified AST.Module as Module
12import qualified Compile
13import qualified Elm.Compiler.Module as PublicModule
14import qualified Elm.Compiler.Version as Version
15import qualified Generate.JavaScript as JS
16import qualified Parse.Module as Parse
17import qualified Parse.Parse as Parse
18import qualified Reporting.Annotation as A
19import qualified Reporting.Error as Error
20import qualified Reporting.Result as Result
21import qualified Reporting.Warning as Warning
24-- VERSION
26version :: String
27version =
28 Version.version
31rawVersion :: [Int]
32rawVersion =
33 Version.rawVersion
36-- DEPENDENCIES
38parseDependencies
39 :: String
40 -> Either [Error] (PublicModule.Name, [PublicModule.Name])
41parseDependencies sourceCode =
42 let
43 (Result.Result _warnings rawResult) =
44 Parse.parse sourceCode Parse.header
45 in
46 case rawResult of
47 Result.Err msgs ->
48 Left $ map (Error . A.map Error.Syntax) msgs
50 Result.Ok (Module.Header names _exports imports) ->
51 Right
52 ( PublicModule.Name names
53 , map (PublicModule.Name . fst . A.drop) imports
54 )
57-- COMPILATION
59{-| Compiles Elm source code to JavaScript. -}
60compile
61 :: String
62 -> String
63 -> String
64 -> Map.Map PublicModule.Name PublicModule.Interface
65 -> ([Warning], Either [Error] (PublicModule.Interface, String))
66compile user packageName source interfaces =
67 let unwrappedInterfaces =
68 Map.mapKeysMonotonic (\(PublicModule.Name name) -> name) interfaces
70 (Result.Result warnings rawResult) =
71 Compile.compile user packageName unwrappedInterfaces source
72 in
73 (,) (map Warning warnings) $
74 case rawResult of
75 Result.Ok modul ->
76 Right (Module.toInterface modul, JS.generate modul)
78 Result.Err errors ->
79 Left (map Error errors)
82-- ERRORS
84newtype Error = Error (A.Located Error.Error)
87errorToString :: String -> String -> Error -> String
88errorToString location source (Error err) =
89 Error.toString location source err
92-- WARNINGS
94newtype Warning = Warning (A.Located Warning.Warning)