git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
Include foreign JS in psc output
commitf56ed2bfb553125076b423009431347499c81821 authorGary Burgess <gary.burgess@gmail.com> dateSun 3 May 2015, 22:11 (11 years ago) parentfba4b71
3 files changed+17−6
psc/Main.hs+12−2 src/Language/PureScript.hs+1−1 src/Language/PureScript/CodeGen/JS.hs+4−3
psc/Main.hs+12−2
@@ -42,8 +42,10 @@ import qualified Data.Map as M
4242import qualified Language.PureScript as P
4343import qualified Language.PureScript.CodeGen.JS as J
4444import qualified Language.PureScript.Constants as C
45+import qualified Language.PureScript.CoreFn as CF
4546import qualified Paths_purescript as Paths
4647
48+
4749import Foreign
4850
4951data PSCOptions = PSCOptions
@@ -82,7 +84,7 @@ compile (PSCOptions input inputForeign opts stdin output externs usePrefix) = do
8284 hPutStrLn stderr err
8385 exitFailure
8486 Right (ms, foreigns) ->
85− case runPSC opts (compileJS (map snd ms) M.empty prefix) of
87+ case runPSC opts (compileJS (map snd ms) foreigns prefix) of
8688 Left errs -> do
8789 hPutStrLn stderr (P.prettyPrintMultipleErrors (P.optionsVerboseErrors opts) errs)
8890 exitFailure
@@ -106,13 +108,21 @@ compileJS :: forall m. (Functor m, Applicative m, MonadError P.MultipleErrors m,
106108 => [P.Module] -> M.Map P.ModuleName String -> [String] -> m (String, String)
107109compileJS ms foreigns prefix = do
108110 (modulesToCodeGen, exts, env, nextVar) <- P.compile ms
109− js <- concat <$> evalSupplyT nextVar (traverse J.moduleToJs modulesToCodeGen)
111+ js <- concat <$> evalSupplyT nextVar (traverse codegenModule modulesToCodeGen)
110112 js' <- generateMain env js
111113 let pjs = unlines $ map ("// " ++) prefix ++ [P.prettyPrintJS js']
112114 return (pjs, exts)
113115
114116 where
115117
118+ --codegenModule :: CF.Module CF.Ann -> m [J.JS]
119+ codegenModule m =
120+ J.moduleToJs m $ (\js -> J.JSApp (J.JSFunction Nothing [] (J.JSBlock
121+ [ J.JSVariableIntroduction "exports" (Just $ J.JSObjectLiteral [])
122+ , J.JSRaw js
123+ , J.JSReturn (J.JSVar "exports")
124+ ])) []) <$> CF.moduleName m `M.lookup` foreigns
125+
116126 generateMain :: P.Environment -> [J.JS] -> m [J.JS]
117127 generateMain env js = do
118128 mainName <- asks P.optionsMain
src/Language/PureScript.hs+1−1
@@ -210,7 +210,7 @@ make outputDir ms prefix = do
210210 corefn = CoreFn.moduleToCoreFn env' mod'
211211 [renamed] = renameInModules [corefn]
212212
213− pjs <- prettyPrintJS <$> moduleToJs renamed
213+ pjs <- prettyPrintJS <$> moduleToJs renamed Nothing
214214 let js = unlines $ map ("// " ++) prefix ++ [pjs]
215215 let exts = unlines $ map ("-- " ++) prefix ++ [moduleToPs mod' env']
216216
src/Language/PureScript/CodeGen/JS.hs+4−3
@@ -49,8 +49,8 @@ import qualified Language.PureScript.Constants as C
4949-- module.
5050--
5151moduleToJs :: forall m mode. (Applicative m, Monad m, MonadReader (Options mode) m, MonadSupply m)
52− => Module Ann -> m [JS]
53−moduleToJs (Module coms mn imps exps foreigns decls) = do
52+ => Module Ann -> Maybe JS -> m [JS]
53+moduleToJs (Module coms mn imps exps foreigns decls) foreign = do
5454 additional <- asks optionsAdditional
5555 jsImports <- T.traverse importToJs . delete (ModuleName [ProperName C.prim]) . (\\ [mn]) $ imps
5656 jsDecls <- mapM bindToJs decls
@@ -59,7 +59,8 @@ moduleToJs (Module coms mn imps exps foreigns decls) = do
5959 comments <- not <$> asks optionsNoComments
6060 let strict = JSStringLiteral "use strict"
6161 let header = if comments && not (null coms) then JSComment coms strict else strict
62− let moduleBody = header : jsImports ++ concat optimized
62+ let foreign' = [JSVariableIntroduction "$foreign" foreign | not $ null foreigns || foreign == Nothing]
63+ let moduleBody = header : foreign' ++ jsImports ++ concat optimized
6364 let foreignExps = exps `intersect` (fst `map` foreigns)
6465 let standardExps = exps \\ foreignExps
6566 let exps' = JSObjectLiteral $ map (runIdent &&& JSVar . identToJs) standardExps