on ff98144 help sign in
elk/src/Elm/Compiler.hs
179 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 AST.Module.Name as ModuleName
16import qualified Compile
17import qualified Docs.Check as Docs
18import qualified Elm.Compiler.Version
19import qualified Elm.Compiler.Module as PublicModule
20import qualified Elm.Docs as Docs
21import qualified Elm.Package as Package
22import qualified Generate.JavaScript as JS
23import qualified Optimize
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.PrettyPrint as P
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 (dealiaser, 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 optModule = Optimize.optimize modul
81 let javascript = JS.generate optModule
83 return (Result docs interface javascript)
84 in
85 ( maybe dummyDealiaser Dealiaser dealiaser
86 , map Warning warnings
87 , Result.destruct (Left . map Error) Right rawResult
88 )
91data Context = Context
92 { _packageName :: Package.Name
93 , _isRoot :: Bool
94 , _isExposed :: Bool
95 , _dependencies :: [PublicModule.CanonicalName]
96 }
99data Result = Result
100 { _docs :: Maybe Docs.Documentation
101 , _interface :: PublicModule.Interface
102 , _js :: String
103 }
106docsGen
107 :: Bool
108 -> Module.CanonicalModule
109 -> Result.Result w Error.Error (Maybe Docs.Documentation)
110docsGen isExposed modul =
111 if not isExposed then
112 Result.ok Nothing
113 else
114 let
115 getChecked =
116 Docs.check (Module.exports modul) (Module.docs modul)
118 name =
119 PublicModule.Name (ModuleName._module (Module.name modul))
121 toDocs checked =
122 Docs.fromCheckedDocs name checked
123 in
124 (Just . toDocs) `fmap` Result.mapError Error.Docs getChecked
127-- DEALIASER
129newtype Dealiaser =
130 Dealiaser P.Dealiaser
133dummyDealiaser :: Dealiaser
134dummyDealiaser =
135 Dealiaser Map.empty
138-- ERRORS
140newtype Error =
141 Error (A.Located Error.Error)
144errorToString :: Dealiaser -> String -> String -> Error -> String
145errorToString (Dealiaser dealiaser) location source (Error err) =
146 Error.toString dealiaser location source err
149printError :: Dealiaser -> String -> String -> Error -> IO ()
150printError (Dealiaser dealiaser) location source (Error err) =
151 Error.print dealiaser location source err
154errorToJson :: Dealiaser -> String -> Error -> Json.Value
155errorToJson (Dealiaser dealiaser) location (Error err) =
156 Error.toJson dealiaser location err
159-- WARNINGS
161newtype Warning =
162 Warning (A.Located Warning.Warning)
165warningToString :: Dealiaser -> String -> String -> Warning -> String
166warningToString (Dealiaser dealiaser) location source (Warning err) =
167 Warning.toString dealiaser location source err
170printWarning :: Dealiaser -> String -> String -> Warning -> IO ()
171printWarning (Dealiaser dealiaser) location source (Warning err) =
172 Warning.print dealiaser location source err
175warningToJson :: Dealiaser -> String -> Warning -> Json.Value
176warningToJson (Dealiaser dealiaser) location (Warning err) =
177 Warning.toJson dealiaser location err