on ef280ed help sign in
102 lines 2.1 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-- CRASH
75crash :: ModuleName.Canonical -> R.Region -> Maybe (JS.Expression ()) -> JS.Expression ()
76crash home region maybeCaseCrashValue =
77 let
78 homeString =
79 JS.StringLit () (ModuleName.canonicalToString home)
80 in
81 case maybeCaseCrashValue of
82 Nothing ->
83 utils "crash" [ homeString, regionToJs region ]
85 Just crashValue ->
86 utils "crashCase" [ homeString, regionToJs region, crashValue ]
89regionToJs :: R.Region -> JS.Expression ()
90regionToJs (R.Region start end) =
91 JS.ObjectLit ()
92 [ ( prop "start", positionToJs start )
93 , ( prop "end", positionToJs end )
94 ]
97positionToJs :: R.Position -> JS.Expression ()
98positionToJs (R.Position line column) =
99 JS.ObjectLit ()
100 [ ( prop "line", JS.IntLit () line )
101 , ( prop "column", JS.IntLit () column )
102 ]