1module Generate.JavaScript (generate) where
3import Control.Monad.State as State
4import qualified Data.List as List
5import Language.ECMAScript3.PrettyPrint as ES
6import Language.ECMAScript3.Syntax
7import qualified Text.PrettyPrint.Leijen as PP
9import qualified AST.Expression.Optimized as Optimized
10import qualified AST.Helpers as Help
11import qualified AST.Module as Module
12import qualified AST.Module.Name as ModuleName
13import qualified AST.Variable as Variable
14import qualified Generate.JavaScript.Expression as JS
15import Generate.JavaScript.Helpers (call, function, localRuntime, obj, prop, ref, varDecl)
16import qualified Generate.JavaScript.Variable as Var
19generate :: Module.Optimized -> String
22 (ModuleName.Canonical _ name) =
28 , checkForCachedVersion name
29 , imports (Module.imports module_)
30 , definitions (Module.program (Module.body module_))
31 , exports name (Module.exports module_)
35 "Elm" : name ++ ["make"]
38 buildIntermediateObjects make
40 [ assign make (function [localRuntime] body)
43 PP.displayS (PP.renderPretty 1 160 (ES.prettyPrint javascript)) ""
50useStrict :: [Statement ()]
52 [ ExprStmt () (StringLit () "use strict")
56checkForCachedVersion :: ModuleName.Raw -> [Statement ()]
57checkForCachedVersion name =
60 localRuntime : name ++ ["values"]
65 buildIntermediateObjects values
67 [ IfSingleStmt () valuesObject (ReturnStmt () (Just valuesObject))
71buildIntermediateObjects :: [String] -> [Statement ()]
72buildIntermediateObjects path =
75 assign name (InfixExpr () OpLOr (obj name) (ObjectLit () []))
78 drop 2 (init (List.inits path))
83assign :: [String] -> Expression () -> Statement ()
87 VarDeclStmt () [ varDecl x expr ]
91 AssignExpr () OpAssign (LDot () (obj (init path)) (last path)) expr
98imports :: [ModuleName.Raw] -> [Statement ()]
102 varDecl "_U" (call (obj ["Elm", "Native", "Utils", "make"]) [ref localRuntime])
104 [ VarDeclStmt () (utils : map jsImport rawImports) ]
107jsImport :: ModuleName.Raw -> VarDecl ()
111 obj ("Elm" : name ++ ["make"])
113 varDecl (Var.modulePrefix name) (call make [ref localRuntime])
120definitions :: [Optimized.Def] -> [Statement ()]
124 Var.define "_op" (ObjectLit () [])
126 setup : State.evalState (mapM JS.generateDef defs) 0
133exports :: ModuleName.Raw -> [Variable.Value] -> [Statement ()]
134exports name exportedValues =
137 map toField ("_op" : concatMap extract exportedValues)
154 Variable.Union _ (Variable.Listing ctors _) ->
158 LDot () (obj (localRuntime : name)) "values"
160 [ ReturnStmt () $ Just $
161 AssignExpr () OpAssign values (ObjectLit () exportedFields)
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