on ea343fc help sign in
elk/src/Elm/Compiler.hs
138 lines 3.6 kB history raw
1{-# OPTIONS_GHC -Wall #-}
2module Elm.Compiler
3 ( version, rawVersion
4 , parseDependencies, compile
5 , Dealiaser, dummyDealiaser
6 , Error, errorToString, errorToJson, printError
7 , Warning, warningToString, warningToJson, printWarning
8 ) where
10import qualified Data.Aeson as Json
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.Module as Parse
19import qualified Parse.Parse as Parse
20import qualified Reporting.Annotation as A
21import qualified Reporting.Error as Error
22import qualified Reporting.PrettyPrint as P
23import qualified Reporting.Result as Result
24import qualified Reporting.Warning as Warning
27-- VERSION
29version :: String
30version =
31 Version.version
34rawVersion :: [Int]
35rawVersion =
36 Version.rawVersion
39-- DEPENDENCIES
41parseDependencies
42 :: String
43 -> Either [Error] (PublicModule.Name, [PublicModule.Name])
44parseDependencies sourceCode =
45 let
46 (Result.Result _warnings rawResult) =
47 Parse.parse sourceCode Parse.header
48 in
49 case rawResult of
50 Result.Err msgs ->
51 Left $ map (Error . A.map Error.Syntax) msgs
53 Result.Ok (Module.Header names _exports imports) ->
54 Right
55 ( PublicModule.Name names
56 , map (PublicModule.Name . fst . A.drop) imports
57 )
60-- COMPILATION
62{-| Compiles Elm source code to JavaScript. -}
63compile
64 :: String
65 -> String
66 -> Bool
67 -> String
68 -> Map.Map PublicModule.Name PublicModule.Interface
69 -> (Dealiaser, [Warning], Either [Error] (PublicModule.Interface, String))
70compile user packageName isRoot source interfaces =
71 let unwrappedInterfaces =
72 Map.mapKeysMonotonic (\(PublicModule.Name name) -> name) interfaces
74 (Result.Result (dealiaser, warnings) rawResult) =
75 Compile.compile user packageName isRoot unwrappedInterfaces source
76 in
77 (,,) (maybe dummyDealiaser Dealiaser dealiaser) (map Warning warnings) $
78 case rawResult of
79 Result.Ok modul ->
80 Right (Module.toInterface modul, JS.generate modul)
82 Result.Err errors ->
83 Left (map Error errors)
86-- DEALIASER
88newtype Dealiaser =
89 Dealiaser P.Dealiaser
92dummyDealiaser :: Dealiaser
93dummyDealiaser =
94 Dealiaser Map.empty
97-- ERRORS
99newtype Error =
100 Error (A.Located Error.Error)
103errorToString :: Dealiaser -> String -> String -> Error -> String
104errorToString (Dealiaser dealiaser) location source (Error err) =
105 Error.toString dealiaser location source err
108printError :: Dealiaser -> String -> String -> Error -> IO ()
109printError (Dealiaser dealiaser) location source (Error err) =
110 Error.print dealiaser location source err
113errorToJson :: Dealiaser -> String -> Error -> Json.Value
114errorToJson (Dealiaser dealiaser) location (Error err) =
115 Error.toJson dealiaser location err
118-- WARNINGS
120newtype Warning =
121 Warning (A.Located Warning.Warning)
124warningToString :: Dealiaser -> String -> String -> Warning -> String
125warningToString (Dealiaser dealiaser) location source (Warning err) =
126 Warning.toString dealiaser location source err
129printWarning :: Dealiaser -> String -> String -> Warning -> IO ()
130printWarning (Dealiaser dealiaser) location source (Warning err) =
131 Warning.print dealiaser location source err
134warningToJson :: Dealiaser -> String -> Warning -> Json.Value
135warningToJson (Dealiaser dealiaser) location (Warning err) =
136 Warning.toJson dealiaser location err