@@ -1,7 +1,8 @@
11{-# OPTIONS_GHC -Wall #-}
22module Elm.Compiler
33 ( version, rawVersion
4− , parseDependencies, compile
4+ , parseDependencies
5+ , compile, Context(..), Result(..)
56 , Dealiaser, dummyDealiaser
67 , Error, errorToString, errorToJson, printError
78 , Warning, warningToString, warningToJson, printWarning
@@ -12,8 +13,10 @@ import qualified Data.Map as Map
1213
1314import qualified AST.Module as Module
1415import qualified Compile
16+import qualified Docs.Check as Docs
1517import qualified Elm.Compiler.Module as PublicModule
1618import qualified Elm.Compiler.Version as Version
19+import qualified Elm.Docs as Docs
1720import qualified Generate.JavaScript as JS
1821import qualified Parse.Module as Parse
1922import qualified Parse.Parse as Parse
@@ -50,7 +53,7 @@ parseDependencies sourceCode =
5053 Result.Err msgs ->
5154 Left $ map (Error . A.map Error.Syntax) msgs
5255
53− Result.Ok (Module.Header names _exports imports) ->
56+ Result.Ok (Module.Header names _docs _exports imports) ->
5457 Right
5558 ( PublicModule.Name names
5659 , map (PublicModule.Name . fst . A.drop) imports
@@ -61,26 +64,61 @@ parseDependencies sourceCode =
6164
6265{-| Compiles Elm source code to JavaScript. -}
6366compile
64− :: String
65− -> String
66− -> Bool
67+ :: Context
6768 -> String
6869 -> Map.Map PublicModule.Name PublicModule.Interface
69− -> (Dealiaser, [Warning], Either [Error] (PublicModule.Interface, String))
70−compile user packageName isRoot source interfaces =
71− let unwrappedInterfaces =
72− Map.mapKeysMonotonic (\(PublicModule.Name name) -> name) interfaces
70+ -> (Dealiaser, [Warning], Either [Error] Result)
7371
74− (Result.Result (dealiaser, warnings) rawResult) =
75− Compile.compile user packageName isRoot unwrappedInterfaces source
76− in
77− (,,) (maybe dummyDealiaser Dealiaser dealiaser) (map Warning warnings) $
78− case rawResult of
79− Result.Ok modul ->
80− Right (Module.toInterface modul, JS.generate modul)
72+compile context source interfaces =
73+ let
74+ (Context user packageName isRoot isExposed) =
75+ context
76+
77+ unwrappedInterfaces =
78+ Map.mapKeysMonotonic (\(PublicModule.Name name) -> name) interfaces
8179
82− Result.Err errors ->
83− Left (map Error errors)
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+ )
89+
90+
91+data Context = Context
92+ { _user :: String
93+ , _packageName :: String
94+ , _isRoot :: Bool
95+ , _isExposed :: Bool
96+ }
97+
98+
99+data Result = Result
100+ { _docs :: Maybe Docs.Documentation
101+ , _interface :: PublicModule.Interface
102+ , _js :: String
103+ }
104+
105+
106+docsGen
107+ :: Bool
108+ -> Module.CanonicalModule
109+ -> Result.Result w Error.Error (Maybe Docs.Documentation)
110+docsGen 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)
117+
118+ toDocs checked =
119+ Docs.fromCheckedDocs (PublicModule.Name (Module.names modul)) checked
120+ in
121+ (Just . toDocs) `fmap` Result.mapError Error.Docs getChecked
84122
85123
86124-- DEALIASER