on 5d8dfd9 help sign in
elk/src/Elm/Compiler.hs
177 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 ) 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 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 javascript = JS.generate modul
81 return (Result docs interface javascript)
82 in
83 ( maybe dummyDealiaser Dealiaser dealiaser
84 , map Warning warnings
85 , Result.destruct (Left . map Error) Right rawResult
86 )
89data Context = Context
90 { _packageName :: Package.Name
91 , _isRoot :: Bool
92 , _isExposed :: Bool
93 , _dependencies :: [PublicModule.CanonicalName]
94 }
97data Result = Result
98 { _docs :: Maybe Docs.Documentation
99 , _interface :: PublicModule.Interface
100 , _js :: String
101 }
104docsGen
105 :: Bool
106 -> Module.Optimized
107 -> Result.Result w Error.Error (Maybe Docs.Documentation)
108docsGen isExposed modul =
109 if not isExposed then
110 Result.ok Nothing
111 else
112 let
113 getChecked =
114 Docs.check (Module.exports modul) (Module.docs modul)
116 name =
117 PublicModule.Name (ModuleName._module (Module.name modul))
119 toDocs checked =
120 Docs.fromCheckedDocs name checked
121 in
122 (Just . toDocs) `fmap` Result.mapError Error.Docs getChecked
125-- DEALIASER
127newtype Dealiaser =
128 Dealiaser P.Dealiaser
131dummyDealiaser :: Dealiaser
132dummyDealiaser =
133 Dealiaser Map.empty
136-- ERRORS
138newtype Error =
139 Error (A.Located Error.Error)
142errorToString :: Dealiaser -> String -> String -> Error -> String
143errorToString (Dealiaser dealiaser) location source (Error err) =
144 Error.toString dealiaser location source err
147printError :: Dealiaser -> String -> String -> Error -> IO ()
148printError (Dealiaser dealiaser) location source (Error err) =
149 Error.print dealiaser location source err
152errorToJson :: Dealiaser -> String -> Error -> Json.Value
153errorToJson (Dealiaser dealiaser) location (Error err) =
154 Error.toJson dealiaser location err
157-- WARNINGS
159newtype Warning =
160 Warning (A.Located Warning.Warning)
163warningToString :: Dealiaser -> String -> String -> Warning -> String
164warningToString (Dealiaser dealiaser) location source (Warning err) =
165 Warning.toString dealiaser location source err
168printWarning :: Dealiaser -> String -> String -> Warning -> IO ()
169printWarning (Dealiaser dealiaser) location source (Warning err) =
170 Warning.print dealiaser location source err
173warningToJson :: Dealiaser -> String -> Warning -> Json.Value
174warningToJson (Dealiaser dealiaser) location (Warning err) =
175 Warning.toJson dealiaser location err