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
20generate (Module.Module (ModuleName.Canonical _ name) _ info) =
25 , checkForCachedVersion name
26 , imports (Module.imports info)
27 , definitions (Module.program info)
28 , exports name (Module.exports info)
32 "Elm" : name ++ ["make"]
35 buildIntermediateObjects make
37 [ assign make (function [localRuntime] body)
40 PP.displayS (PP.renderPretty 1 160 (ES.prettyPrint javascript)) ""
47useStrict :: [Statement ()]
49 [ ExprStmt () (StringLit () "use strict")
53checkForCachedVersion :: ModuleName.Raw -> [Statement ()]
54checkForCachedVersion name =
57 localRuntime : name ++ ["values"]
62 buildIntermediateObjects values
64 [ IfSingleStmt () valuesObject (ReturnStmt () (Just valuesObject))
68buildIntermediateObjects :: [String] -> [Statement ()]
69buildIntermediateObjects path =
72 assign name (InfixExpr () OpLOr (obj name) (ObjectLit () []))
75 drop 2 (init (List.inits path))
80assign :: [String] -> Expression () -> Statement ()
84 VarDeclStmt () [ varDecl x expr ]
88 AssignExpr () OpAssign (LDot () (obj (init path)) (last path)) expr
95imports :: [ModuleName.Raw] -> [Statement ()]
99 varDecl "_U" (call (obj ["Elm", "Native", "Utils", "make"]) [ref localRuntime])
101 [ VarDeclStmt () (utils : map jsImport rawImports) ]
104jsImport :: ModuleName.Raw -> VarDecl ()
108 obj ("Elm" : name ++ ["make"])
110 varDecl (Var.modulePrefix name) (call make [ref localRuntime])
117definitions :: [Optimized.Def] -> [Statement ()]
121 Var.define "_op" (ObjectLit () [])
123 setup : State.evalState (mapM JS.generateDef defs) 0
130exports :: ModuleName.Raw -> [Variable.Value] -> [Statement ()]
131exports name exportedValues =
134 map toField ("_op" : concatMap extract exportedValues)
151 Variable.Union _ (Variable.Listing ctors _) ->
155 LDot () (obj (localRuntime : name)) "values"
157 [ ReturnStmt () $ Just $
158 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