on master help sign in
support crashes in Generate.JavaScript.BuiltIn and improve code
d4e067dEvan Czaplicki
src/Generate/JavaScript.hs+2−2
@@ -230,8 +230,8 @@ generateCode expr =
230 do expr' <- generateJsExpr expr
230 do expr' <- generateJsExpr expr
231 jsExpr (Port.task name expr' portType)
231 jsExpr (Port.task name expr' portType)
232
232
233− Crash _ _ ->
233+ Crash region maybeCaseCrashValue ->
234− error "TODO"
234+ jsExpr $ BuiltIn.crash region maybeCaseCrashValue
235
235
236
236
237-- FUNCTIONS
237-- FUNCTIONS
src/Generate/JavaScript/BuiltIn.hs+47−6
@@ -2,12 +2,20 @@ module Generate.JavaScript.BuiltIn where
2
2
3import qualified Language.ECMAScript3.Syntax as JS
3import qualified Language.ECMAScript3.Syntax as JS
4
4
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+
5
13
6-- LITERALS
14-- LITERALS
7
15
8character :: Char -> JS.Expression ()
16character :: Char -> JS.Expression ()
9character char =
17character char =
10− error "TODO - utils.chr" JS.StringLit () [char]
18+ utils "chr" [ JS.StringLit () [char] ]
11
19
12
20
13string :: String -> JS.Expression ()
21string :: String -> JS.Expression ()
@@ -19,28 +27,61 @@ string str =
19
27
20list :: [JS.Expression ()] -> JS.Expression ()
28list :: [JS.Expression ()] -> JS.Expression ()
21list elements =
29list elements =
22− error "TODO - utils.list" (JS.ArrayLit () elements)
30+ utils "list" [ JS.ArrayLit () elements ]
23
31
24
32
25range :: JS.Expression () -> JS.Expression () -> JS.Expression ()
33range :: JS.Expression () -> JS.Expression () -> JS.Expression ()
26range low high =
34range low high =
27− error "TODO - utils.range" low high
35+ utils "range" [ low, high ]
28
36
29
37
30-- RECORDS
38-- RECORDS
31
39
32recordUpdate :: JS.Expression () -> [(String, JS.Expression ())] -> JS.Expression ()
40recordUpdate :: JS.Expression () -> [(String, JS.Expression ())] -> JS.Expression ()
33recordUpdate record fields =
41recordUpdate 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 ]
35
48
36
49
37-- COMPARISIONS
50-- COMPARISIONS
38
51
39eq :: JS.Expression () -> JS.Expression () -> JS.Expression ()
52eq :: JS.Expression () -> JS.Expression () -> JS.Expression ()
40eq left right =
53eq left right =
41− error "TODO - utils.eq" left right
54+ utils "eq" [ left, right ]
42
55
43
56
44compare :: JS.Expression () -> JS.Expression () -> JS.Expression ()
57compare :: JS.Expression () -> JS.Expression () -> JS.Expression ()
45compare left right =
58compare 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+ ]