on 1f28b4c help sign in
elk/src/Elm/Compiler.hs
177 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 names _docs _exports imports) ->
54 Right
55 ( PublicModule.Name names
56 , map (PublicModule.Name . fst . A.drop) imports
57 )
60-- COMPILATION
62{-| Compiles Elm source code to JavaScript. -}
63compile
64 :: Context
65 -> String
66 -> Map.Map PublicModule.Name PublicModule.Interface
67 -> (Dealiaser, [Warning], Either [Error] Result)
69compile context source interfaces =
70 let
71 (Context packageName isRoot isExposed) =
72 context
74 unwrappedInterfaces =
75 Map.mapKeysMonotonic (\(PublicModule.Name name) -> name) interfaces
77 (Result.Result (dealiaser, warnings) rawResult) =
78 do modul <- Compile.compile packageName isRoot unwrappedInterfaces source
79 docs <- docsGen isExposed modul
81 let interface = Module.toInterface modul
82 let optModule = Optimize.optimize modul
83 let javascript = JS.generate optModule
85 return (Result docs interface javascript)
86 in
87 ( maybe dummyDealiaser Dealiaser dealiaser
88 , map Warning warnings
89 , Result.destruct (Left . map Error) Right rawResult
90 )
93data Context = Context
94 { _packageName :: Package.Name
95 , _isRoot :: Bool
96 , _isExposed :: Bool
97 }
100data Result = Result
101 { _docs :: Maybe Docs.Documentation
102 , _interface :: PublicModule.Interface
103 , _js :: String
104 }
107docsGen
108 :: Bool
109 -> Module.CanonicalModule
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 toDocs checked =
120 Docs.fromCheckedDocs (PublicModule.Name (Module.names modul)) 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