on ce01547 help sign in
elk/src/Elm/Compiler.hs
176 lines 4.5 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 Generate.JavaScript as JS
21import qualified Parse.Module as Parse
22import qualified Parse.Parse as Parse
23import qualified Reporting.Annotation as A
24import qualified Reporting.Error as Error
25import qualified Reporting.PrettyPrint as P
26import qualified Reporting.Result as Result
27import qualified Reporting.Warning as Warning
30-- VERSION
32version :: String
33version =
34 Version.version
37rawVersion :: [Int]
38rawVersion =
39 Version.rawVersion
42-- DEPENDENCIES
44parseDependencies
45 :: String
46 -> Either [Error] (PublicModule.Name, [PublicModule.Name])
47parseDependencies sourceCode =
48 let
49 (Result.Result _warnings rawResult) =
50 Parse.parse sourceCode Parse.header
51 in
52 case rawResult of
53 Result.Err msgs ->
54 Left $ map (Error . A.map Error.Syntax) msgs
56 Result.Ok (Module.Header names _docs _exports imports) ->
57 Right
58 ( PublicModule.Name names
59 , map (PublicModule.Name . fst . A.drop) imports
60 )
63-- COMPILATION
65{-| Compiles Elm source code to JavaScript. -}
66compile
67 :: Context
68 -> String
69 -> Map.Map PublicModule.Name PublicModule.Interface
70 -> (Dealiaser, [Warning], Either [Error] Result)
72compile context source interfaces =
73 let
74 (Context user packageName isRoot isExposed) =
75 context
77 unwrappedInterfaces =
78 Map.mapKeysMonotonic (\(PublicModule.Name name) -> name) interfaces
80 (Result.Result (dealiaser, warnings) rawResult) =
81 do modul <- Compile.compile user packageName isRoot unwrappedInterfaces source
82 docs <- docsGen isExposed modul
83 return (Result docs (Module.toInterface modul) (JS.generate modul))
84 in
85 ( maybe dummyDealiaser Dealiaser dealiaser
86 , map Warning warnings
87 , Result.destruct (Left . map Error) Right rawResult
88 )
91data Context = Context
92 { _user :: String
93 , _packageName :: String
94 , _isRoot :: Bool
95 , _isExposed :: Bool
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 toDocs checked =
119 Docs.fromCheckedDocs (PublicModule.Name (Module.names modul)) checked
120 in
121 (Just . toDocs) `fmap` Result.mapError Error.Docs getChecked
124-- DEALIASER
126newtype Dealiaser =
127 Dealiaser P.Dealiaser
130dummyDealiaser :: Dealiaser
131dummyDealiaser =
132 Dealiaser Map.empty
135-- ERRORS
137newtype Error =
138 Error (A.Located Error.Error)
141errorToString :: Dealiaser -> String -> String -> Error -> String
142errorToString (Dealiaser dealiaser) location source (Error err) =
143 Error.toString dealiaser location source err
146printError :: Dealiaser -> String -> String -> Error -> IO ()
147printError (Dealiaser dealiaser) location source (Error err) =
148 Error.print dealiaser location source err
151errorToJson :: Dealiaser -> String -> Error -> Json.Value
152errorToJson (Dealiaser dealiaser) location (Error err) =
153 Error.toJson dealiaser location err
156-- WARNINGS
158newtype Warning =
159 Warning (A.Located Warning.Warning)
162warningToString :: Dealiaser -> String -> String -> Warning -> String
163warningToString (Dealiaser dealiaser) location source (Warning err) =
164 Warning.toString dealiaser location source err
167printWarning :: Dealiaser -> String -> String -> Warning -> IO ()
168printWarning (Dealiaser dealiaser) location source (Warning err) =
169 Warning.print dealiaser location source err
172warningToJson :: Dealiaser -> String -> Warning -> Json.Value
173warningToJson (Dealiaser dealiaser) location (Warning err) =
174 Warning.toJson dealiaser location err