@@ -2,12 +2,20 @@ module Generate.JavaScript.BuiltIn where
22
33import qualified Language.ECMAScript3.Syntax as JS
44
5+import Generate.JavaScript.Helpers
6+import qualified Reporting.Region as R
7+
8+
9+utils :: String -> [JS.Expression ()] -> JS.Expression ()
10+utils func args =
11+ error "TODO"
12+
513
614-- LITERALS
715
816character :: Char -> JS.Expression ()
917character char =
10− error "TODO - utils.chr" JS.StringLit () [char]
18+ utils "chr" [ JS.StringLit () [char] ]
1119
1220
1321string :: String -> JS.Expression ()
@@ -19,28 +27,61 @@ string str =
1927
2028list :: [JS.Expression ()] -> JS.Expression ()
2129list elements =
22− error "TODO - utils.list" (JS.ArrayLit () elements)
30+ utils "list" [ JS.ArrayLit () elements ]
2331
2432
2533range :: JS.Expression () -> JS.Expression () -> JS.Expression ()
2634range low high =
27− error "TODO - utils.range" low high
35+ utils "range" [ low, high ]
2836
2937
3038-- RECORDS
3139
3240recordUpdate :: JS.Expression () -> [(String, JS.Expression ())] -> JS.Expression ()
3341recordUpdate record fields =
34− error "TODO - utils.update" record fields
42+ utils "update" [ record, JS.ArrayLit () (map toKeyValue fields) ]
43+
44+
45+toKeyValue :: (String, JS.Expression ()) -> JS.Expression ()
46+toKeyValue (key, value) =
47+ JS.ArrayLit () [ JS.StringLit () key, value ]
3548
3649
3750-- COMPARISIONS
3851
3952eq :: JS.Expression () -> JS.Expression () -> JS.Expression ()
4053eq left right =
41− error "TODO - utils.eq" left right
54+ utils "eq" [ left, right ]
4255
4356
4457compare :: JS.Expression () -> JS.Expression () -> JS.Expression ()
4558compare left right =
46− error "TODO - utils.compare" left right
59+ utils "compare" [ left, right ]
60+
61+
62+-- CRASH
63+
64+crash :: R.Region -> Maybe String -> JS.Expression ()
65+crash region maybeCaseCrashValue =
66+ case maybeCaseCrashValue of
67+ Nothing ->
68+ utils "crash" [ regionToJs region ]
69+
70+ Just crashValue ->
71+ utils "caseCrash" [ regionToJs region, ref crashValue ]
72+
73+
74+regionToJs :: R.Region -> JS.Expression ()
75+regionToJs (R.Region start end) =
76+ JS.ObjectLit ()
77+ [ ( prop "start", positionToJs start )
78+ , ( prop "end", positionToJs end )
79+ ]
80+
81+
82+positionToJs :: R.Position -> JS.Expression ()
83+positionToJs (R.Position line column) =
84+ JS.ObjectLit ()
85+ [ ( prop "line", JS.IntLit () line )
86+ , ( prop "column", JS.IntLit () column )
87+ ]