@@ -45,6 +45,7 @@ import Control.Applicative
45import Control.Arrow ((&&&))
45import Control.Arrow ((&&&))
46import Control.Monad.Except
46import Control.Monad.Except
47import Control.Monad.Reader
47import Control.Monad.Reader
48+import Control.Monad.Writer
49import System.FilePath ((</>))
50import System.FilePath ((</>))
@@ -55,6 +56,7 @@ import Language.PureScript.DeadCodeElimination as P
55import Language.PureScript.Environment as P
56import Language.PureScript.Environment as P
56import Language.PureScript.Errors as P
57import Language.PureScript.Errors as P
57import Language.PureScript.Kinds as P
58import Language.PureScript.Kinds as P
59+import Language.PureScript.Linter as P
58import Language.PureScript.ModuleDependencies as P
60import Language.PureScript.ModuleDependencies as P
59import Language.PureScript.Names as P
61import Language.PureScript.Names as P
60import Language.PureScript.Options as P
62import Language.PureScript.Options as P
@@ -89,26 +91,27 @@ import qualified Paths_purescript as Paths
90-- * Pretty-print the generated Javascript
92-- * Pretty-print the generated Javascript
92−compile :: (Functor m, Applicative m, MonadError MultipleErrors m, MonadReader (Options Compile) m)
94+compile :: (Functor m, Applicative m, MonadError MultipleErrors m, MonadWriter MultipleErrors m, MonadReader (Options Compile) m)
93 => [Module] -> [String] -> m (String, String, Environment)
95 => [Module] -> [String] -> m (String, String, Environment)
94compile = compile' initEnvironment
96compile = compile' initEnvironment
96−compile' :: (Functor m, Applicative m, MonadError MultipleErrors m, MonadReader (Options Compile) m)
98+compile' :: (Functor m, Applicative m, MonadError MultipleErrors m, MonadWriter MultipleErrors m, MonadReader (Options Compile) m)
97 => Environment -> [Module] -> [String] -> m (String, String, Environment)
99 => Environment -> [Module] -> [String] -> m (String, String, Environment)
98compile' env ms prefix = do
100compile' env ms prefix = do
99 noPrelude <- asks optionsNoPrelude
101 noPrelude <- asks optionsNoPrelude
100 additional <- asks optionsAdditional
102 additional <- asks optionsAdditional
101 mainModuleIdent <- asks (fmap moduleNameFromString . optionsMain)
103 mainModuleIdent <- asks (fmap moduleNameFromString . optionsMain)
102 (sorted, _) <- sortModules $ map importPrim $ if noPrelude then ms else map importPrelude ms
104 (sorted, _) <- sortModules $ map importPrim $ if noPrelude then ms else map importPrelude ms
103 (desugared, nextVar) <- runSupplyT 0 $ desugar sorted
106 (desugared, nextVar) <- runSupplyT 0 $ desugar sorted
104 (elaborated, env') <- runCheck' env $ forM desugared $ typeCheckModule mainModuleIdent
107 (elaborated, env') <- runCheck' env $ forM desugared $ typeCheckModule mainModuleIdent
105 regrouped <- createBindingGroupsModule . collapseBindingGroupsModule $ elaborated
108 regrouped <- createBindingGroupsModule . collapseBindingGroupsModule $ elaborated
106 let corefn = map (CoreFn.moduleToCoreFn env') regrouped
109 let corefn = map (CoreFn.moduleToCoreFn env') regrouped
107− let entryPoints = moduleNameFromString `map` entryPointModules additional
110+ entryPoints = moduleNameFromString `map` entryPointModules additional
108− let elim = if null entryPoints then corefn else eliminateDeadCode entryPoints corefn
111+ elim = if null entryPoints then corefn else eliminateDeadCode entryPoints corefn
109− let renamed = renameInModules elim
112+ renamed = renameInModules elim
110− let codeGenModuleNames = moduleNameFromString `map` codeGenModules additional
113+ codeGenModuleNames = moduleNameFromString `map` codeGenModules additional
111− let modulesToCodeGen = if null codeGenModuleNames then renamed else filter (\(CoreFn.Module _ mn _ _ _ _) -> mn `elem` codeGenModuleNames) renamed
114+ modulesToCodeGen = if null codeGenModuleNames then renamed else filter (\(CoreFn.Module _ mn _ _ _ _) -> mn `elem` codeGenModuleNames) renamed
112 js <- concat <$> (evalSupplyT nextVar $ T.traverse moduleToJs modulesToCodeGen)
115 js <- concat <$> (evalSupplyT nextVar $ T.traverse moduleToJs modulesToCodeGen)
113 let exts = intercalate "\n" . map (`moduleToPs` env') $ regrouped
116 let exts = intercalate "\n" . map (`moduleToPs` env') $ regrouped
114 js' <- generateMain env' js
117 js' <- generateMain env' js
@@ -129,7 +132,7 @@ generateMain env js = do
130-- A type class which collects the IO actions we need to be able to run in "make" mode
133-- A type class which collects the IO actions we need to be able to run in "make" mode
132−class (MonadReader (P.Options P.Make) m, MonadError MultipleErrors m) => MonadMake m where
135+class (MonadReader (P.Options P.Make) m, MonadError MultipleErrors m, MonadWriter MultipleErrors m) => MonadMake m where
134 -- Get a file timestamp
137 -- Get a file timestamp
@@ -178,6 +181,8 @@ make outputDir ms prefix = do
179 (sorted, graph) <- sortModules $ map importPrim $ if noPrelude then map snd ms else map (importPrelude . snd) ms
182 (sorted, graph) <- sortModules $ map importPrim $ if noPrelude then map snd ms else map (importPrelude . snd) ms
181 toRebuild <- foldM (\s (Module _ moduleName' _ _) -> do
186 toRebuild <- foldM (\s (Module _ moduleName' _ _) -> do
182 let filePath = runModuleName moduleName'
187 let filePath = runModuleName moduleName'
@@ -219,8 +224,8 @@ make outputDir ms prefix = do
219 regrouped <- createBindingGroups moduleName' . collapseBindingGroups $ elaborated
224 regrouped <- createBindingGroups moduleName' . collapseBindingGroups $ elaborated
221 let mod' = Module coms moduleName' regrouped exps
226 let mod' = Module coms moduleName' regrouped exps
222− let corefn = CoreFn.moduleToCoreFn env' mod'
227+ corefn = CoreFn.moduleToCoreFn env' mod'
223− let [renamed] = renameInModules [corefn]
228+ [renamed] = renameInModules [corefn]
225 pjs <- prettyPrintJS <$> moduleToJs renamed
230 pjs <- prettyPrintJS <$> moduleToJs renamed
226 let js = unlines $ map ("// " ++) prefix ++ [pjs]
231 let js = unlines $ map ("// " ++) prefix ++ [pjs]