@@ -21,6 +21,7 @@ import IRTS.JavaScript.PrimOp
21import IRTS.JavaScript.Specialize
21import IRTS.JavaScript.Specialize
22import IRTS.Lang
22import IRTS.Lang
23import IRTS.System
23import IRTS.System
25import Control.Applicative (pure, (<$>))
26import Control.Applicative (pure, (<$>))
26import Control.Monad
27import Control.Monad
@@ -98,6 +99,14 @@ isYes (Just "Y") = True
98isYes (Just "y") = True
99isYes (Just "y") = True
99isYes _ = False
100isYes _ = False
102+makeExportDecls :: ExportIFace -> [Text]
103+makeExportDecls (Export _ _ e) =
104+ concatMap makeExport e
106+ makeExport (ExportData _) =
108+ makeExport (ExportFun name (FStr exportname) _ _) =
109+ [T.concat [T.pack $ exportname, ": ", jsName name]]
102codegenJs :: CGConf -> CodeGenerator
111codegenJs :: CGConf -> CodeGenerator
103codegenJs conf ci =
112codegenJs conf ci =
@@ -105,7 +114,11 @@ codegenJs conf ci =
105 debug <- isYes <$> lookupEnv "IDRISJS_DEBUG"
114 debug <- isYes <$> lookupEnv "IDRISJS_DEBUG"
106 let defs' = Map.fromList $ liftDecls ci
115 let defs' = Map.fromList $ liftDecls ci
107 let defs = globlToCon defs'
116 let defs = globlToCon defs'
117+ let isExec = outputType ci == Executable
118+ putStrLn $ show $ isExec
119+ let used = if isExec then
108− let used = Map.elems $ removeDeadCode defs [sMN 0 "runMain"]
120+ Map.elems $ removeDeadCode defs [sMN 0 "runMain"]
121+ else Map.elems $ removeDeadCode defs (getExpNames $ exportDecls ci)
109 when debug $ do
122 when debug $ do
110 writeFile (outputFile ci ++ ".LDeclsDebug") $ (unlines $ intersperse "" $ map show used) ++ "\n\n\n"
123 writeFile (outputFile ci ++ ".LDeclsDebug") $ (unlines $ intersperse "" $ map show used) ++ "\n\n\n"
111 putStrLn $ "Finished calculating used"
124 putStrLn $ "Finished calculating used"
@@ -136,7 +149,8 @@ codegenJs conf ci =
136 , doPartials (partialApplications stats), "\n"
149 , doPartials (partialApplications stats), "\n"
137 , doHiddenClasses (hiddenClasses stats), "\n"
150 , doHiddenClasses (hiddenClasses stats), "\n"
138 , out, "\n"
151 , out, "\n"
139− , jsName (sMN 0 "runMain"), "();\n"
152+ , if isExec then jsName (sMN 0 "runMain") `T.append` "();\n"
153+ else T.concat ["module.exports = {\n", T.intercalate ";\n" $ concatMap makeExportDecls (exportDecls ci), "\n};\n"]
140 , "}.call(this))"
154 , "}.call(this))"
141 , footer conf
155 , footer conf