1module Generate.JavaScript (generate) where
3import qualified Control.Monad.State as State
4import qualified Language.ECMAScript3.PrettyPrint as ES
5import qualified Language.ECMAScript3.Syntax as JS
6import qualified Text.PrettyPrint.Leijen as PP
8import qualified AST.Effects as Fx
9import qualified AST.Module as Module
10import qualified AST.Module.Name as ModuleName
11import qualified Generate.JavaScript.Expression as JS
12import qualified Generate.JavaScript.Helpers as JS
13import qualified Generate.JavaScript.Variable as Var
20generate :: Module.Optimized -> String
21generate (Module.Module moduleName _ info) =
24 do defsList <- mapM JS.generateDef (Module.program info)
25 let managerStmts = generateEffectManager moduleName (Module.effects info)
26 return (concat (defsList ++ [managerStmts]))
29 State.evalState genBody 0
31 PP.displayS (PP.renderPretty 1 160 (ES.prettyPrint body)) ""
35-- GENERATE EFFECT MANAGER
38generateEffectManager :: ModuleName.Canonical -> Fx.Effects -> [JS.Statement ()]
39generateEffectManager 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 ]
85tagEntry :: String -> ( JS.Prop (), JS.Expression () )
87 ( JS.PropId () (JS.Id () "tag")
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list