@@ -24,8 +24,8 @@ module Language.PureScript.Make
2424 (
2525 -- * Make API
2626 RebuildPolicy(..)
27+ , ProgressMessage(..), renderProgressMessage
2728 , MakeActions(..)
28− , SupplyVar()
2929 , Externs()
3030 , make
3131
@@ -43,7 +43,6 @@ import Control.Monad.Trans.Except
4343import Control.Monad.Reader
4444import Control.Monad.Writer
4545import Control.Monad.Supply
46−import Control.Monad.Supply.Class (fresh)
4746
4847import Data.Function (on)
4948import Data.List (sortBy, groupBy)
@@ -79,8 +78,22 @@ import qualified Language.PureScript.CodeGen.JS as J
7978import qualified Language.PureScript.CoreFn as CF
8079import qualified Paths_purescript as Paths
8180
82−-- |
83−-- Actions that require implementations when running in "make" mode.
81+-- | Progress messages from the make process
82+data ProgressMessage
83+ = CompilingModule ModuleName
84+ deriving (Show, Eq, Ord)
85+
86+-- | Render a progress message
87+renderProgressMessage :: ProgressMessage -> String
88+renderProgressMessage (CompilingModule mn) = "Compiling " ++ runModuleName mn
89+
90+-- | Actions that require implementations when running in "make" mode.
91+--
92+-- This type exists to make two things abstract:
93+--
94+-- * The particular backend being used (Javascript, C++11, etc.)
95+--
96+-- * The details of how files are read/written etc.
8497--
8598data MakeActions m = MakeActions {
8699 -- |
@@ -102,11 +115,11 @@ data MakeActions m = MakeActions {
102115 -- |
103116 -- Run the code generator for the module and write any required output files.
104117 --
105− , codegen :: CF.Module CF.Ann -> Environment -> SupplyVar -> Externs -> m ()
118+ , codegen :: CF.Module CF.Ann -> Environment -> Externs -> SupplyT m ()
106119 -- |
107120 -- Respond to a progress update.
108121 --
109− , progress :: String -> m ()
122+ , progress :: ProgressMessage -> m ()
110123 }
111124
112125-- |
@@ -114,11 +127,6 @@ data MakeActions m = MakeActions {
114127--
115128type Externs = String
116129
117−-- |
118−-- A value to be used in the Supply monad.
119−--
120−type SupplyVar = Integer
121−
122130-- |
123131-- Determines when to rebuild a module
124132--
@@ -160,7 +168,7 @@ make MakeActions{..} ms = do
160168 (_, env') <- lift . runCheck' env $ typeCheckModule Nothing m
161169 go env' ms'
162170 go env ((True, m@(Module coms moduleName' _ exps)) : ms') = do
163− lift $ progress $ "Compiling " ++ runModuleName moduleName'
171+ lift . progress $ CompilingModule moduleName'
164172 (checked@(Module _ _ elaborated _), env') <- lift . runCheck' env $ typeCheckModule Nothing m
165173 checkExhaustiveModule env' checked
166174 regrouped <- createBindingGroups moduleName' . collapseBindingGroups $ elaborated
@@ -168,8 +176,7 @@ make MakeActions{..} ms = do
168176 corefn = CF.moduleToCoreFn env' mod'
169177 [renamed] = renameInModules [corefn]
170178 exts = moduleToPs mod' env'
171− nextVar <- fresh
172− lift $ codegen renamed env' nextVar exts
179+ codegen renamed env' exts
173180 go env' ms'
174181
175182 rebuildIfNecessary :: M.Map ModuleName [ModuleName] -> S.Set ModuleName -> [Module] -> m [(Bool, Module)]
@@ -264,8 +271,8 @@ buildMakeActions outputDir filePathMap foreigns usePrefix =
264271 let path = outputDir </> runModuleName mn </> "externs.purs"
265272 (path, ) <$> readTextFile path
266273
267− codegen :: CF.Module CF.Ann -> Environment -> SupplyVar -> Externs -> Make ()
268− codegen m _ nextVar exts = do
274+ codegen :: CF.Module CF.Ann -> Environment -> Externs -> SupplyT Make ()
275+ codegen m _ exts = do
269276 let mn = CF.moduleName m
270277 foreignInclude <- case mn `M.lookup` foreigns of
271278 Just (path, _)
@@ -275,18 +282,17 @@ buildMakeActions outputDir filePathMap foreigns usePrefix =
275282 | otherwise -> return $ Just $ J.JSApp (J.JSVar "require") [J.JSStringLiteral "./foreign"]
276283 Nothing | requiresForeign m -> throwError . errorMessage $ MissingFFIModule mn
277284 | otherwise -> return Nothing
278− pjs <- evalSupplyT nextVar $ prettyPrintJS <$> J.moduleToJs m foreignInclude
285+ pjs <- prettyPrintJS <$> J.moduleToJs m foreignInclude
279286 let filePath = runModuleName mn
280287 jsFile = outputDir </> filePath </> "index.js"
281288 externsFile = outputDir </> filePath </> "externs.purs"
282289 foreignFile = outputDir </> filePath </> "foreign.js"
283290 prefix = ["Generated by psc version " ++ showVersion Paths.version | usePrefix]
284291 js = unlines $ map ("// " ++) prefix ++ [pjs]
285− verboseErrorsEnabled <- asks optionsVerboseErrors
286− when verboseErrorsEnabled $ progress $ "Writing " ++ jsFile
287− writeTextFile jsFile js
288− maybe (return ()) (writeTextFile foreignFile . snd) $ mn `M.lookup` foreigns
289− writeTextFile externsFile exts
292+ lift $ do
293+ writeTextFile jsFile js
294+ maybe (return ()) (writeTextFile foreignFile . snd) $ mn `M.lookup` foreigns
295+ writeTextFile externsFile exts
290296
291297 requiresForeign :: CF.Module a -> Bool
292298 requiresForeign = not . null . CF.moduleForeign
@@ -307,5 +313,5 @@ buildMakeActions outputDir filePathMap foreigns usePrefix =
307313 mkdirp :: FilePath -> IO ()
308314 mkdirp = createDirectoryIfMissing True . takeDirectory
309315
310− progress :: String -> Make ()
311− progress = liftIO . putStrLn
316+ progress :: ProgressMessage -> Make ()
317+ progress = liftIO . putStrLn . renderProgressMessage