on efb86bc help sign in
elk/src/Elm/Compiler.hs
180 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
35-- VERSION
37version :: Package.Version
38version =
39 Elm.Compiler.Version.version
42-- DEPENDENCIES
44parseDependencies
45 :: String
46 -> Either [Error] (PublicModule.Name, [PublicModule.Name])
47parseDependencies sourceCode =
48 let
49 (Result.Result _warnings rawResult) =
50 Parse.parse sourceCode Parse.header
51 in
52 case rawResult of
53 Result.Err msgs ->
54 Left $ map (Error . A.map Error.Syntax) msgs
56 Result.Ok (Module.Header name _docs _exports imports) ->
57 Right
58 ( PublicModule.Name name
59 , map (PublicModule.Name . fst . A.drop) imports
60 )
63-- COMPILATION
65{-| Compiles Elm source code to JavaScript. -}
66compile
67 :: Context
68 -> String
69 -> PublicModule.Interfaces
70 -> (Localizer, [Warning], Either [Error] Result)
72compile context source interfaces =
73 let
74 (Context packageName isRoot isExposed dependencies) =
75 context
77 (Result.Result (localizer, warnings) rawResult) =
78 do modul <- Compile.compile packageName isRoot dependencies interfaces source
79 docs <- docsGen isExposed modul
81 let interface = Module.toInterface packageName modul
82 let javascript = JS.generate modul
84 return (Result docs interface javascript)
85 in
86 ( maybe dummyLocalizer Localizer localizer
87 , map Warning warnings
88 , Result.destruct (Left . map Error) Right rawResult
89 )
92data Context = Context
93 { _packageName :: Package.Name
94 , _isRoot :: Bool
95 , _isExposed :: Bool
96 , _dependencies :: [PublicModule.CanonicalName]
97 }
100data Result = Result
101 { _docs :: Maybe Docs.Documentation
102 , _interface :: PublicModule.Interface
103 , _js :: String
104 }
107docsGen
108 :: Bool
109 -> Module.Optimized
110 -> Result.Result w Error.Error (Maybe Docs.Documentation)
111docsGen isExposed modul =
112 if not isExposed then
113 Result.ok Nothing
114 else
115 let
116 getChecked =
117 Docs.check (Module.exports modul) (Module.docs modul)
119 name =
120 PublicModule.Name (ModuleName._module (Module.name modul))
122 toDocs checked =
123 Docs.fromCheckedDocs name checked
124 in
125 (Just . toDocs) `fmap` Result.mapError Error.Docs getChecked
128-- DEALIASER
130newtype Localizer =
131 Localizer RenderType.Localizer
134dummyLocalizer :: Localizer
135dummyLocalizer =
136 Localizer Map.empty
139-- ERRORS
141newtype Error =
142 Error (A.Located Error.Error)
145errorToString :: Localizer -> String -> String -> Error -> String
146errorToString (Localizer localizer) location source (Error (A.A region err)) =
147 Report.toString location region (Error.toReport localizer err) source
150printError :: Handle -> Localizer -> String -> String -> Error -> IO ()
151printError handle (Localizer localizer) location source (Error (A.A region err)) =
152 Report.toHandle handle location region (Error.toReport localizer err) source
155errorToJson :: Localizer -> String -> Error -> Json.Value
156errorToJson (Localizer localizer) location (Error err) =
157 Error.toJson localizer location err
160-- WARNINGS
162newtype Warning =
163 Warning (A.Located Warning.Warning)
166warningToString :: Localizer -> String -> String -> Warning -> String
167warningToString (Localizer localizer) location source (Warning (A.A region wrn)) =
168 Report.toString location region (Warning.toReport localizer wrn) source
171printWarning :: Handle -> Localizer -> String -> String -> Warning -> IO ()
172printWarning handle (Localizer localizer) location source (Warning (A.A region wrn)) =
173 Report.toHandle handle location region (Warning.toReport localizer wrn) source
176warningToJson :: Localizer -> String -> Warning -> Json.Value
177warningToJson (Localizer localizer) location (Warning wrn) =
178 Warning.toJson localizer location wrn