on 8f032c9 help sign in
115 lines 2.4 kB history raw
1module Generate.JavaScript.BuiltIn where
3import Control.Arrow (first)
4import qualified Language.ECMAScript3.Syntax as JS
6import qualified AST.Module.Name as ModuleName
7import Generate.JavaScript.Helpers
8import qualified Reporting.Region as R
12utils :: String -> [JS.Expression ()] -> JS.Expression ()
13utils func args =
14 obj ["_U", func] `call` args
18-- LITERALS
21character :: Char -> JS.Expression ()
22character char =
23 utils "chr" [ JS.StringLit () [char] ]
26string :: String -> JS.Expression ()
27string str =
28 JS.StringLit () str
32-- LISTS
35list :: [JS.Expression ()] -> JS.Expression ()
36list elements =
37 utils "list" [ JS.ArrayLit () elements ]
40range :: JS.Expression () -> JS.Expression () -> JS.Expression ()
41range low high =
42 utils "range" [ low, high ]
46-- RECORDS
49recordUpdate :: JS.Expression () -> [(String, JS.Expression ())] -> JS.Expression ()
50recordUpdate record fields =
51 utils "update"
52 [ record
53 , JS.ObjectLit () (map (first prop) fields)
54 ]
58-- COMPARISIONS
61eq :: JS.Expression () -> JS.Expression () -> JS.Expression ()
62eq left right =
63 utils "eq" [ left, right ]
66cmp :: JS.Expression () -> JS.Expression () -> JS.Expression ()
67cmp left right =
68 utils "cmp" [ left, right ]
72-- EFFECTS
75cmd :: ModuleName.Canonical -> JS.Expression ()
76cmd effectName =
77 utils "cmd" [ JS.StringLit () (ModuleName.canonicalToString effectName) ]
80sub :: ModuleName.Canonical -> JS.Expression ()
81sub effectName =
82 utils "sub" [ JS.StringLit () (ModuleName.canonicalToString effectName) ]
85-- CRASH
88crash :: ModuleName.Canonical -> R.Region -> Maybe (JS.Expression ()) -> JS.Expression ()
89crash home region maybeCaseCrashValue =
90 let
91 homeString =
92 JS.StringLit () (ModuleName.canonicalToString home)
93 in
94 case maybeCaseCrashValue of
95 Nothing ->
96 utils "crash" [ homeString, regionToJs region ]
98 Just crashValue ->
99 utils "crashCase" [ homeString, regionToJs region, crashValue ]
102regionToJs :: R.Region -> JS.Expression ()
103regionToJs (R.Region start end) =
104 JS.ObjectLit ()
105 [ ( prop "start", positionToJs start )
106 , ( prop "end", positionToJs end )
107 ]
110positionToJs :: R.Position -> JS.Expression ()
111positionToJs (R.Position line column) =
112 JS.ObjectLit ()
113 [ ( prop "line", JS.IntLit () line )
114 , ( prop "column", JS.IntLit () column )
115 ]