1module Generate.JavaScript (generate) where
3import qualified Control.Monad.State as State
4import qualified Data.Text.Lazy as LazyText
5import qualified Language.ECMAScript3.Syntax as JS
7import qualified AST.Effects as Effects
8import qualified AST.Module as Module
9import qualified AST.Module.Name as ModuleName
10import qualified Generate.JavaScript.Builder as Builder
11import qualified Generate.JavaScript.Expression as JS
12import qualified Generate.JavaScript.Helpers as JS
13import qualified Generate.JavaScript.Variable as Var
20generate :: Module.Optimized -> LazyText.Text
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 Builder.stmtsToText body
35-- GENERATE EFFECT MANAGER
38generateEffectManager :: ModuleName.Canonical -> Effects.Canonical -> [JS.Statement ()]
39generateEffectManager moduleName effects =
47 Effects.Manager (Effects.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)
68 Effects.CmdManager _ ->
69 [ tagEntry "cmd", entry "cmdMap" ]
71 Effects.SubManager _ ->
72 [ tagEntry "sub", entry "subMap" ]
74 Effects.FxManager _ _ ->
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