on 74db13f help sign in
elk/src/Elm/Compiler.hs
178 lines 4.5 kB history raw
1{-# OPTIONS_GHC -Wall #-}
2module Elm.Compiler
3 ( version
4 , parseDependencies
5 , compile, Context(..), Result(..)
6 , Dealiaser, dummyDealiaser
7 , Error, errorToString, errorToJson, printError
8 , Warning, warningToString, warningToJson, printWarning
9 )
10 where
12import qualified Data.Aeson as Json
13import qualified Data.Map as Map
15import qualified AST.Module as Module
16import qualified AST.Module.Name as ModuleName
17import qualified Compile
18import qualified Docs.Check as Docs
19import qualified Elm.Compiler.Version
20import qualified Elm.Compiler.Module as PublicModule
21import qualified Elm.Docs as Docs
22import qualified Elm.Package as Package
23import qualified Generate.JavaScript as JS
24import qualified Parse.Module as Parse
25import qualified Parse.Parse as Parse
26import qualified Reporting.Annotation as A
27import qualified Reporting.Error as Error
28import qualified Reporting.Render.Type as RenderType
29import qualified Reporting.Result as Result
30import qualified Reporting.Warning as Warning
33-- VERSION
35version :: Package.Version
36version =
37 Elm.Compiler.Version.version
40-- DEPENDENCIES
42parseDependencies
43 :: String
44 -> Either [Error] (PublicModule.Name, [PublicModule.Name])
45parseDependencies sourceCode =
46 let
47 (Result.Result _warnings rawResult) =
48 Parse.parse sourceCode Parse.header
49 in
50 case rawResult of
51 Result.Err msgs ->
52 Left $ map (Error . A.map Error.Syntax) msgs
54 Result.Ok (Module.Header name _docs _exports imports) ->
55 Right
56 ( PublicModule.Name name
57 , map (PublicModule.Name . fst . A.drop) imports
58 )
61-- COMPILATION
63{-| Compiles Elm source code to JavaScript. -}
64compile
65 :: Context
66 -> String
67 -> PublicModule.Interfaces
68 -> (Dealiaser, [Warning], Either [Error] Result)
70compile context source interfaces =
71 let
72 (Context packageName isRoot isExposed dependencies) =
73 context
75 (Result.Result (localizer, warnings) rawResult) =
76 do modul <- Compile.compile packageName isRoot dependencies interfaces source
77 docs <- docsGen isExposed modul
79 let interface = Module.toInterface packageName modul
80 let javascript = JS.generate modul
82 return (Result docs interface javascript)
83 in
84 ( maybe dummyDealiaser Dealiaser localizer
85 , map Warning warnings
86 , Result.destruct (Left . map Error) Right rawResult
87 )
90data Context = Context
91 { _packageName :: Package.Name
92 , _isRoot :: Bool
93 , _isExposed :: Bool
94 , _dependencies :: [PublicModule.CanonicalName]
95 }
98data Result = Result
99 { _docs :: Maybe Docs.Documentation
100 , _interface :: PublicModule.Interface
101 , _js :: String
102 }
105docsGen
106 :: Bool
107 -> Module.Optimized
108 -> Result.Result w Error.Error (Maybe Docs.Documentation)
109docsGen isExposed modul =
110 if not isExposed then
111 Result.ok Nothing
112 else
113 let
114 getChecked =
115 Docs.check (Module.exports modul) (Module.docs modul)
117 name =
118 PublicModule.Name (ModuleName._module (Module.name modul))
120 toDocs checked =
121 Docs.fromCheckedDocs name checked
122 in
123 (Just . toDocs) `fmap` Result.mapError Error.Docs getChecked
126-- DEALIASER
128newtype Dealiaser =
129 Dealiaser RenderType.Localizer
132dummyDealiaser :: Dealiaser
133dummyDealiaser =
134 Dealiaser Map.empty
137-- ERRORS
139newtype Error =
140 Error (A.Located Error.Error)
143errorToString :: Dealiaser -> String -> String -> Error -> String
144errorToString (Dealiaser localizer) location source (Error err) =
145 Error.toString localizer location source err
148printError :: Dealiaser -> String -> String -> Error -> IO ()
149printError (Dealiaser localizer) location source (Error err) =
150 Error.print localizer location source err
153errorToJson :: Dealiaser -> String -> Error -> Json.Value
154errorToJson (Dealiaser localizer) location (Error err) =
155 Error.toJson localizer location err
158-- WARNINGS
160newtype Warning =
161 Warning (A.Located Warning.Warning)
164warningToString :: Dealiaser -> String -> String -> Warning -> String
165warningToString (Dealiaser localizer) location source (Warning err) =
166 Warning.toString localizer location source err
169printWarning :: Dealiaser -> String -> String -> Warning -> IO ()
170printWarning (Dealiaser localizer) location source (Warning err) =
171 Warning.print localizer location source err
174warningToJson :: Dealiaser -> String -> Warning -> Json.Value
175warningToJson (Dealiaser localizer) location (Warning err) =
176 Warning.toJson localizer location err