on 31e5896 help sign in
elk/src/Elm/Compiler.hs
190 lines 4.8 kB history raw
1{-# OPTIONS_GHC -Wall #-}
2module Elm.Compiler
3 ( version
4 , parseDependencies
5 , compile, Context(..), Result(..)
6 , Localizer, dummyLocalizer
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
14import System.IO (Handle)
16import qualified AST.Module as Module
17import qualified AST.Module.Name as ModuleName
18import qualified Compile
19import qualified Docs.Check as Docs
20import qualified Elm.Compiler.Version
21import qualified Elm.Compiler.Module as PublicModule
22import qualified Elm.Docs as Docs
23import qualified Elm.Package as Package
24import qualified Generate.JavaScript as JS
25import qualified Parse.Module as Parse
26import qualified Parse.Parse as Parse
27import qualified Reporting.Annotation as A
28import qualified Reporting.Error as Error
29import qualified Reporting.Render.Type as RenderType
30import qualified Reporting.Report as Report
31import qualified Reporting.Result as Result
32import qualified Reporting.Warning as Warning
36-- VERSION
39version :: Package.Version
40version =
41 Elm.Compiler.Version.version
45-- DEPENDENCIES
48parseDependencies :: String -> Either [Error] (PublicModule.Name, [PublicModule.Name])
49parseDependencies sourceCode =
50 let
51 (Result.Result _warnings rawResult) =
52 Parse.parse sourceCode Parse.header
53 in
54 case rawResult of
55 Result.Err msgs ->
56 Left $ map (Error . A.map Error.Syntax) msgs
58 Result.Ok (Module.Header _ name _ _ _ imports) ->
59 Right
60 ( PublicModule.Name name
61 , map (PublicModule.Name . fst . A.drop) imports
62 )
66-- COMPILATION
69{-| Compiles Elm source code to JavaScript. -}
70compile
71 :: Context
72 -> String
73 -> PublicModule.Interfaces
74 -> (Localizer, [Warning], Either [Error] Result)
76compile context source interfaces =
77 let
78 (Context packageName isExposed dependencies) =
79 context
81 (Result.Result (localizer, warnings) rawResult) =
82 do modul <- Compile.compile packageName dependencies interfaces source
83 docs <- docsGen isExposed modul
85 let interface = Module.toInterface packageName modul
86 let javascript = JS.generate modul
88 return (Result docs interface javascript)
89 in
90 ( maybe dummyLocalizer Localizer localizer
91 , map Warning warnings
92 , Result.destruct (Left . map Error) Right rawResult
93 )
96data Context = Context
97 { _packageName :: Package.Name
98 , _isExposed :: Bool
99 , _dependencies :: [PublicModule.CanonicalName]
100 }
103data Result = Result
104 { _docs :: Maybe Docs.Documentation
105 , _interface :: PublicModule.Interface
106 , _js :: String
107 }
110docsGen
111 :: Bool
112 -> Module.Optimized
113 -> Result.Result w Error.Error (Maybe Docs.Documentation)
114docsGen isExposed (Module.Module name _ info) =
115 if not isExposed then
116 Result.ok Nothing
118 else
119 let
120 getChecked =
121 Docs.check (Module.exports info) (Module.docs info)
123 publicName =
124 PublicModule.Name (ModuleName._module name)
126 toDocs checked =
127 Docs.fromCheckedDocs publicName checked
128 in
129 (Just . toDocs) `fmap` Result.mapError Error.Docs getChecked
133-- DEALIASER
136newtype Localizer =
137 Localizer RenderType.Localizer
140dummyLocalizer :: Localizer
141dummyLocalizer =
142 Localizer Map.empty
146-- ERRORS
149newtype Error =
150 Error (A.Located Error.Error)
153errorToString :: Localizer -> String -> String -> Error -> String
154errorToString (Localizer localizer) location source (Error (A.A region err)) =
155 Report.toString location region (Error.toReport localizer err) source
158printError :: Handle -> Localizer -> String -> String -> Error -> IO ()
159printError handle (Localizer localizer) location source (Error (A.A region err)) =
160 Report.toHandle handle location region (Error.toReport localizer err) source
163errorToJson :: Localizer -> String -> Error -> Json.Value
164errorToJson (Localizer localizer) location (Error err) =
165 Error.toJson localizer location err
169-- WARNINGS
172newtype Warning =
173 Warning (A.Located Warning.Warning)
176warningToString :: Localizer -> String -> String -> Warning -> String
177warningToString (Localizer localizer) location source (Warning (A.A region wrn)) =
178 Report.toString location region (Warning.toReport localizer wrn) source
181printWarning :: Handle -> Localizer -> String -> String -> Warning -> IO ()
182printWarning handle (Localizer localizer) location source (Warning (A.A region wrn)) =
183 Report.toHandle handle location region (Warning.toReport localizer wrn) source
186warningToJson :: Localizer -> String -> Warning -> Json.Value
187warningToJson (Localizer localizer) location (Warning wrn) =
188 Warning.toJson localizer location wrn