on 1c6abbf help sign in
elk/src/Elm/Compiler.hs
182 lines 4.6 kB history raw
1{-# OPTIONS_GHC -Wall #-}
2module Elm.Compiler
3 ( version, rawVersion
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.Module as PublicModule
18import qualified Elm.Compiler.Version as Version
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 :: String
35version =
36 Version.version
39rawVersion :: [Int]
40rawVersion =
41 Version.rawVersion
44-- DEPENDENCIES
46parseDependencies
47 :: String
48 -> Either [Error] (PublicModule.Name, [PublicModule.Name])
49parseDependencies sourceCode =
50 let
51 (Result.Result _warnings rawResult) =
52 Parse.parse sourceCode Parse.header
53 in
54 case rawResult of
55 Result.Err msgs ->
56 Left $ map (Error . A.map Error.Syntax) msgs
58 Result.Ok (Module.Header names _docs _exports imports) ->
59 Right
60 ( PublicModule.Name names
61 , map (PublicModule.Name . fst . A.drop) imports
62 )
65-- COMPILATION
67{-| Compiles Elm source code to JavaScript. -}
68compile
69 :: Context
70 -> String
71 -> Map.Map PublicModule.Name PublicModule.Interface
72 -> (Dealiaser, [Warning], Either [Error] Result)
74compile context source interfaces =
75 let
76 (Context packageName isRoot isExposed) =
77 context
79 unwrappedInterfaces =
80 Map.mapKeysMonotonic (\(PublicModule.Name name) -> name) interfaces
82 (Result.Result (dealiaser, warnings) rawResult) =
83 do modul <- Compile.compile packageName isRoot unwrappedInterfaces source
84 docs <- docsGen isExposed modul
86 let interface = Module.toInterface modul
87 let optModule = Optimize.optimize modul
88 let javascript = JS.generate optModule
90 return (Result docs interface javascript)
91 in
92 ( maybe dummyDealiaser Dealiaser dealiaser
93 , map Warning warnings
94 , Result.destruct (Left . map Error) Right rawResult
95 )
98data Context = Context
99 { _packageName :: Package.Name
100 , _isRoot :: Bool
101 , _isExposed :: Bool
102 }
105data Result = Result
106 { _docs :: Maybe Docs.Documentation
107 , _interface :: PublicModule.Interface
108 , _js :: String
109 }
112docsGen
113 :: Bool
114 -> Module.CanonicalModule
115 -> Result.Result w Error.Error (Maybe Docs.Documentation)
116docsGen isExposed modul =
117 if not isExposed then
118 Result.ok Nothing
119 else
120 let
121 getChecked =
122 Docs.check (Module.exports modul) (Module.docs modul)
124 toDocs checked =
125 Docs.fromCheckedDocs (PublicModule.Name (Module.names modul)) checked
126 in
127 (Just . toDocs) `fmap` Result.mapError Error.Docs getChecked
130-- DEALIASER
132newtype Dealiaser =
133 Dealiaser P.Dealiaser
136dummyDealiaser :: Dealiaser
137dummyDealiaser =
138 Dealiaser Map.empty
141-- ERRORS
143newtype Error =
144 Error (A.Located Error.Error)
147errorToString :: Dealiaser -> String -> String -> Error -> String
148errorToString (Dealiaser dealiaser) location source (Error err) =
149 Error.toString dealiaser location source err
152printError :: Dealiaser -> String -> String -> Error -> IO ()
153printError (Dealiaser dealiaser) location source (Error err) =
154 Error.print dealiaser location source err
157errorToJson :: Dealiaser -> String -> Error -> Json.Value
158errorToJson (Dealiaser dealiaser) location (Error err) =
159 Error.toJson dealiaser location err
162-- WARNINGS
164newtype Warning =
165 Warning (A.Located Warning.Warning)
168warningToString :: Dealiaser -> String -> String -> Warning -> String
169warningToString (Dealiaser dealiaser) location source (Warning err) =
170 Warning.toString dealiaser location source err
173printWarning :: Dealiaser -> String -> String -> Warning -> IO ()
174printWarning (Dealiaser dealiaser) location source (Warning err) =
175 Warning.print dealiaser location source err
178warningToJson :: Dealiaser -> String -> Warning -> Json.Value
179warningToJson (Dealiaser dealiaser) location (Warning err) =
180 Warning.toJson dealiaser location err