@@ -1,21 +1,89 @@
1module Generate.JavaScript (generate) where
1module Generate.JavaScript (generate) where
3−import Control.Monad.State as State
3+import qualified Control.Monad.State as State
4−import Language.ECMAScript3.PrettyPrint as ES
4+import qualified Language.ECMAScript3.PrettyPrint as ES
5+import qualified Language.ECMAScript3.Syntax as JS
5import qualified Text.PrettyPrint.Leijen as PP
6import qualified Text.PrettyPrint.Leijen as PP
8+import qualified AST.Effects as Fx
7import qualified AST.Module as Module
9import qualified AST.Module as Module
10+import qualified AST.Module.Name as ModuleName
8import qualified Generate.JavaScript.Expression as JS
11import qualified Generate.JavaScript.Expression as JS
12+import qualified Generate.JavaScript.Helpers as JS
13+import qualified Generate.JavaScript.Variable as Var
17+-- GENERATE JAVASCRIPT
11generate :: Module.Optimized -> String
20generate :: Module.Optimized -> String
12−generate (Module.Module _ _ info) =
21+generate (Module.Module moduleName _ info) =
15− concat <$> mapM JS.generateDef (Module.program info)
24+ do defsList <- mapM JS.generateDef (Module.program info)
25+ let managerStmts = generateEffectManager moduleName (Module.effects info)
26+ return (concat (defsList ++ [managerStmts]))
18 State.evalState genBody 0
29 State.evalState genBody 0
20 PP.displayS (PP.renderPretty 1 160 (ES.prettyPrint body)) ""
31 PP.displayS (PP.renderPretty 1 160 (ES.prettyPrint body)) ""
35+-- GENERATE EFFECT MANAGER
38+generateEffectManager :: ModuleName.Canonical -> Fx.Effects -> [JS.Statement ()]
39+generateEffectManager moduleName effects =
47+ Fx.Effect (Fx.Info _ _ _ _ managerType) ->
50+ Var.native (ModuleName.inCore ["Native","Platform"]) "globalManagerInfo"
53+ JS.StringLit () (ModuleName.canonicalToString moduleName)
56+ ( JS.PropId () (JS.Id () name)
57+ , JS.ref (Var.qualified moduleName name)
69+ [ tagEntry "cmd", entry "cmdMap" ]
72+ [ tagEntry "sub", entry "subMap" ]
75+ [ tagEntry "fx", entry "cmdMap", entry "subMap" ]
78+ JS.AssignExpr () JS.OpAssign
79+ (JS.LBracket () managers managerName)
80+ (JS.ObjectLit () (managerEntries ++ otherEntries))
82+ [ JS.ExprStmt () addManager ]
85+tagEntry :: String -> ( JS.Prop (), JS.Expression () )
87+ ( JS.PropId () (JS.Id () "tag")
88+ , JS.StringLit () tag