@@ -20,9 +20,6 @@
21module Language.PureScript
21module Language.PureScript
22 ( module P
22 ( module P
26 , RebuildPolicy(..)
23 , RebuildPolicy(..)
27 , MakeActions(..)
24 , MakeActions(..)
28 , SupplyVar()
25 , SupplyVar()
@@ -32,7 +29,7 @@ module Language.PureScript
34import Data.Function (on)
31import Data.Function (on)
35−import Data.List (sortBy, groupBy, intercalate)
32+import Data.List (sortBy, groupBy)
36import Data.Maybe (fromMaybe)
33import Data.Maybe (fromMaybe)
37import Data.Time.Clock
34import Data.Time.Clock
38import Data.Version (Version)
35import Data.Version (Version)
@@ -45,12 +42,11 @@ import Control.Monad
45import Control.Monad.Error.Class (MonadError(..))
42import Control.Monad.Error.Class (MonadError(..))
46import Control.Monad.Reader
43import Control.Monad.Reader
47import Control.Monad.Writer
44import Control.Monad.Writer
48−import Control.Monad.Supply.Class (MonadSupply, fresh)
45+import Control.Monad.Supply.Class (fresh)
50import Language.PureScript.AST as P
47import Language.PureScript.AST as P
51import Language.PureScript.Comments as P
48import Language.PureScript.Comments as P
52import Language.PureScript.CodeGen.Externs (moduleToPs)
49import Language.PureScript.CodeGen.Externs (moduleToPs)
53−import Language.PureScript.DeadCodeElimination as P
54import Language.PureScript.Environment as P
50import Language.PureScript.Environment as P
55import Language.PureScript.Errors as P
51import Language.PureScript.Errors as P
56import Language.PureScript.Kinds as P
52import Language.PureScript.Kinds as P
@@ -67,96 +63,9 @@ import Language.PureScript.TypeChecker as P
67import Language.PureScript.Types as P
63import Language.PureScript.Types as P
68import qualified Language.PureScript.CoreFn as CoreFn
64import qualified Language.PureScript.CoreFn as CoreFn
69import qualified Language.PureScript.Constants as C
65import qualified Language.PureScript.Constants as C
70−import qualified Language.PureScript.CodeGen.JS as J
72import qualified Paths_purescript as Paths
67import qualified Paths_purescript as Paths
75−-- Compile a collection of modules
77−-- The compilation pipeline proceeds as follows:
79−-- * Sort the modules based on module dependencies, checking for cyclic dependencies.
81−-- * Perform a set of desugaring passes.
83−-- * Type check, and elaborate values to include type annotations and type class dictionaries.
85−-- * Regroup values to take into account new value dependencies introduced by elaboration.
87−-- * Eliminate dead code.
89−-- * Generate Javascript, and perform optimization passes.
91−-- * Pretty-print the generated Javascript
93−compile :: (Functor m, Applicative m, MonadError MultipleErrors m, MonadWriter MultipleErrors m, MonadReader (Options Compile) m)
94− => [Module] -> m ([CoreFn.Module CoreFn.Ann], Environment, SupplyVar, Externs)
95−compile = compile' initEnvironment
97−compile' :: (Functor m, Applicative m, MonadError MultipleErrors m, MonadWriter MultipleErrors m, MonadReader (Options Compile) m)
98− => Environment -> [Module] -> m ([CoreFn.Module CoreFn.Ann], Environment, SupplyVar, Externs)
100− additional <- asks optionsAdditional
101− mainModuleIdent <- asks (fmap moduleNameFromString . optionsMain)
102− (sorted, _) <- sortModules $ map importPrim ms
104− (desugared, nextVar) <- runSupplyT 0 $ desugar sorted
105− (elaborated, env') <- runCheck' env $ forM desugared $ typeCheckModule mainModuleIdent
106− regrouped <- createBindingGroupsModule . collapseBindingGroupsModule $ elaborated
107− let corefn = map (CoreFn.moduleToCoreFn env') regrouped
108− entryPoints = moduleNameFromString `map` entryPointModules additional
109− elim = if null entryPoints then corefn else eliminateDeadCode entryPoints corefn
110− renamed = renameInModules elim
111− codeGenModuleNames = moduleNameFromString `map` codeGenModules additional
112− modulesToCodeGen = if null codeGenModuleNames then renamed else filter (\(CoreFn.Module _ mn _ _ _ _) -> mn `elem` codeGenModuleNames) renamed
113− exts = intercalate "\n" . map (`moduleToPs` env') $ regrouped
114− return (modulesToCodeGen, env', nextVar, exts)
117−-- Compile a collection of modules to JavaScript and externs files
119−compileJS :: forall m. (Functor m, Applicative m, MonadError P.MultipleErrors m, MonadWriter P.MultipleErrors m, MonadReader (P.Options P.Compile) m)
120− => [P.Module] -> M.Map P.ModuleName (FilePath, P.ForeignJS) -> [String] -> m (String, String, Environment)
121−compileJS ms foreigns prefix = do
122− (modulesToCodeGen, env, nextVar, exts) <- compile ms
123− js <- concat <$> evalSupplyT nextVar (P.parU modulesToCodeGen codegenModule)
124− js' <- generateMain env js
125− let pjs = unlines $ map ("// " ++) prefix ++ [P.prettyPrintJS js']
126− return (pjs, exts, env)
130− codegenModule :: (Functor n, Applicative n, MonadError P.MultipleErrors n, MonadWriter P.MultipleErrors n, MonadReader (P.Options P.Compile) n, MonadSupply n)
131− => CoreFn.Module CoreFn.Ann -> n [J.JS]
133− let requiresForeign = not $ null (CoreFn.moduleForeign m)
134− mn = CoreFn.moduleName m
135− in case mn `M.lookup` foreigns of
137− | not requiresForeign -> do
138− tell $ P.errorMessage $ P.UnnecessaryFFIModule mn path
139− J.moduleToJs m Nothing
140− | otherwise -> J.moduleToJs m $ Just $
141− J.JSApp (J.JSFunction Nothing [] $
142− J.JSBlock [ J.JSVariableIntroduction "exports" (Just $ J.JSObjectLiteral [])
144− , J.JSReturn (J.JSVar "exports")
146− Nothing | requiresForeign -> throwError . P.errorMessage $ P.MissingFFIModule mn
147− | otherwise -> J.moduleToJs m Nothing
149− generateMain :: P.Environment -> [J.JS] -> m [J.JS]
150− generateMain env js = do
151− mainName <- asks P.optionsMain
152− additional <- asks P.optionsAdditional
153− case P.moduleNameFromString <$> mainName of
155− when ((mmi, P.Ident C.main) `M.notMember` P.names env) $
156− throwError . P.errorMessage $ P.NameIsUndefined (P.Ident C.main)
157− return $ js ++ [J.mainCall mmi (P.browserNamespace additional)]
161-- Actions that require implementations when running in "make" mode.
70-- Actions that require implementations when running in "make" mode.
@@ -212,7 +121,7 @@ data RebuildPolicy
212-- If timestamps have not changed, the externs file can be used to provide the module's types without
121-- If timestamps have not changed, the externs file can be used to provide the module's types without
213-- having to typecheck the module again.
122-- having to typecheck the module again.
215−make :: forall m. (Functor m, Applicative m, Monad m, MonadReader (P.Options P.Make) m, MonadError MultipleErrors m, MonadWriter MultipleErrors m)
124+make :: forall m. (Functor m, Applicative m, Monad m, MonadReader P.Options m, MonadError MultipleErrors m, MonadWriter MultipleErrors m)
216 => MakeActions m
125 => MakeActions m
217 -> [(Either RebuildPolicy FilePath, Module)]
126 -> [(Either RebuildPolicy FilePath, Module)]
218 -> m Environment
127 -> m Environment