on 7de84bc help sign in
126 lines 2.6 kB history raw
1module Generate.JavaScript.BuiltIn
2 ( character, string
3 , list, range
4 , recordUpdate
5 , eq, cmp
6 , effect
7 , crash
8 )
9 where
11import Control.Arrow (first)
12import qualified Language.ECMAScript3.Syntax as JS
14import qualified AST.Module.Name as ModuleName
15import Generate.JavaScript.Helpers
16import qualified Generate.JavaScript.Variable as Var
17import qualified Reporting.Region as R
21utils :: String -> [JS.Expression ()] -> JS.Expression ()
22utils func args =
23 Var.native (ModuleName.inCore ["Native","Utils"]) func `call` args
26nativeList :: String -> [JS.Expression ()] -> JS.Expression ()
27nativeList func args =
28 Var.native (ModuleName.inCore ["Native","List"]) func `call` args
32-- LITERALS
35character :: Char -> JS.Expression ()
36character char =
37 utils "chr" [ JS.StringLit () [char] ]
40string :: String -> JS.Expression ()
41string str =
42 JS.StringLit () str
46-- LISTS
49list :: [JS.Expression ()] -> JS.Expression ()
50list elements =
51 nativeList "fromArray" [ JS.ArrayLit () elements ]
54range :: JS.Expression () -> JS.Expression () -> JS.Expression ()
55range low high =
56 nativeList "range" [ low, high ]
60-- RECORDS
63recordUpdate :: JS.Expression () -> [(String, JS.Expression ())] -> JS.Expression ()
64recordUpdate record fields =
65 utils "update"
66 [ record
67 , JS.ObjectLit () (map (first prop) fields)
68 ]
72-- COMPARISIONS
75eq :: JS.Expression () -> JS.Expression () -> JS.Expression ()
76eq left right =
77 utils "eq" [ left, right ]
80cmp :: JS.Expression () -> JS.Expression () -> JS.Expression ()
81cmp left right =
82 utils "cmp" [ left, right ]
86-- EFFECTS
89effect :: ModuleName.Canonical -> JS.Expression ()
90effect effectName =
91 Var.native (ModuleName.inCore ["Native","Platform"]) "leaf" <|
92 JS.StringLit () (ModuleName.canonicalToString effectName)
96-- CRASH
99crash :: ModuleName.Canonical -> R.Region -> Maybe (JS.Expression ()) -> JS.Expression ()
100crash home region maybeCaseCrashValue =
101 let
102 homeString =
103 JS.StringLit () (ModuleName.canonicalToString home)
104 in
105 case maybeCaseCrashValue of
106 Nothing ->
107 utils "crash" [ homeString, regionToJs region ]
109 Just crashValue ->
110 utils "crashCase" [ homeString, regionToJs region, crashValue ]
113regionToJs :: R.Region -> JS.Expression ()
114regionToJs (R.Region start end) =
115 JS.ObjectLit ()
116 [ ( prop "start", positionToJs start )
117 , ( prop "end", positionToJs end )
118 ]
121positionToJs :: R.Position -> JS.Expression ()
122positionToJs (R.Position line column) =
123 JS.ObjectLit ()
124 [ ( prop "line", JS.IntLit () line )
125 , ( prop "column", JS.IntLit () column )
126 ]