on 99243c2 help sign in
elk/src/Elm/Compiler.hs
178 lines 4.6 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 ) where
11import qualified Data.Aeson as Json
12import qualified Data.Map as Map
14import qualified AST.Module as Module
15import qualified Compile
16import qualified Docs.Check as Docs
17import qualified Elm.Compiler.Version
18import qualified Elm.Compiler.Module as PublicModule
19import qualified Elm.Docs as Docs
20import qualified Elm.Package as Package
21import qualified Generate.JavaScript as JS
22import qualified Optimize
23import qualified Parse.Module as Parse
24import qualified Parse.Parse as Parse
25import qualified Reporting.Annotation as A
26import qualified Reporting.Error as Error
27import qualified Reporting.PrettyPrint as P
28import qualified Reporting.Result as Result
29import qualified Reporting.Warning as Warning
32-- VERSION
34version :: Package.Version
35version =
36 Elm.Compiler.Version.version
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 name _docs _exports imports) ->
54 Right
55 ( PublicModule.Name name
56 , map (PublicModule.Name . fst . A.drop) imports
57 )
60-- COMPILATION
62{-| Compiles Elm source code to JavaScript. -}
63compile
64 :: Context
65 -> String
66 -> PublicModule.Interfaces
67 -> (Dealiaser, [Warning], Either [Error] Result)
69compile context source interfaces =
70 let
71 (Context packageName isRoot isExposed dependencies) =
72 context
74 (Result.Result (dealiaser, warnings) rawResult) =
75 do modul <- Compile.compile packageName isRoot dependencies interfaces source
76 docs <- docsGen isExposed modul
78 let interface = Module.toInterface packageName modul
79 let optModule = Optimize.optimize modul
80 let javascript = JS.generate optModule
82 return (Result docs interface javascript)
83 in
84 ( maybe dummyDealiaser Dealiaser dealiaser
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.Canonical]
95 }
98data Result = Result
99 { _docs :: Maybe Docs.Documentation
100 , _interface :: PublicModule.Interface
101 , _js :: String
102 }
105docsGen
106 :: Bool
107 -> Module.CanonicalModule
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 (PublicModule._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 P.Dealiaser
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 dealiaser) location source (Error err) =
145 Error.toString dealiaser location source err
148printError :: Dealiaser -> String -> String -> Error -> IO ()
149printError (Dealiaser dealiaser) location source (Error err) =
150 Error.print dealiaser location source err
153errorToJson :: Dealiaser -> String -> Error -> Json.Value
154errorToJson (Dealiaser dealiaser) location (Error err) =
155 Error.toJson dealiaser location err
158-- WARNINGS
160newtype Warning =
161 Warning (A.Located Warning.Warning)
164warningToString :: Dealiaser -> String -> String -> Warning -> String
165warningToString (Dealiaser dealiaser) location source (Warning err) =
166 Warning.toString dealiaser location source err
169printWarning :: Dealiaser -> String -> String -> Warning -> IO ()
170printWarning (Dealiaser dealiaser) location source (Warning err) =
171 Warning.print dealiaser location source err
174warningToJson :: Dealiaser -> String -> Warning -> Json.Value
175warningToJson (Dealiaser dealiaser) location (Warning err) =
176 Warning.toJson dealiaser location err