@@ -17,7 +17,9 @@ import qualified AST.Module.Name as ModuleName
1717import qualified AST.Pattern as P
1818import qualified AST.Variable as Var
1919import Generate.JavaScript.Helpers as Help
20+import qualified Generate.JavaScript.BuiltIn as BuiltIn
2021import qualified Generate.JavaScript.Crash as Crash
22+import qualified Generate.JavaScript.Literal as Literal
2123import qualified Generate.JavaScript.Port as Port
2224import qualified Generate.JavaScript.Variable as Var
2325import qualified Optimize.Cases as Case
@@ -30,28 +32,6 @@ generate modul =
3032 error "TODO" modul exprToCode
3133
3234
33−-- HELPERS
34−
35−_Utils :: String -> Expression ()
36−_Utils x =
37− obj ["_U", x]
38−
39−
40−_List :: String -> Expression ()
41−_List x =
42− obj ["_L", x]
43−
44−
45−literal :: Literal -> Expression ()
46−literal lit =
47− case lit of
48− Chr c -> _Utils "chr" <| string [c]
49− Str s -> string s
50− IntNum n -> IntLit () n
51− FloatNum n -> NumLit () n
52− Boolean b -> BoolLit () b
53−
54−
5535-- CODE CHUNKS
5636
5737data Code
@@ -139,30 +119,31 @@ exprToCode tcc annotatedExpr@(A.A _ expr) =
139119 jsExpr $ Var.canonical var
140120
141121 Literal lit ->
142− jsExpr $ literal lit
122+ jsExpr (Literal.literal lit)
143123
144124 Range lo hi ->
145125 do lo' <- toJsExpr lo
146126 hi' <- toJsExpr hi
147− jsExpr $ _List "range" `call` [lo',hi']
127+ jsExpr $ BuiltIn.range lo' hi'
148128
149129 Access record field ->
150130 do record' <- toJsExpr record
151− jsExpr $ DotRef () record' (var (Var.varName field))
131+ jsExpr $ DotRef () record' (var (Var.safe field))
152132
153133 Update record fields ->
154− do record' <- toJsExpr record
155− fields' <-
156− forM fields $ \(field, value) ->
157− do value' <- toJsExpr value
158− return $ ArrayLit () [ string (Var.varName field), value' ]
159−
160− jsExpr $ _Utils "replace" `call` [ArrayLit () fields', record']
134+ let
135+ fieldToJs (field, value) =
136+ do jsValue <- toJsExpr value
137+ return (Var.safe field, jsValue)
138+ in
139+ do jsRecord <- toJsExpr record
140+ jsFields <- mapM fieldToJs fields
141+ jsExpr $ BuiltIn.recordUpdate jsRecord jsFields
161142
162143 Record fields ->
163144 do fields' <-
164145 forM fields $ \(field, e) ->
165− (,) (Var.varName field) <$> toJsExpr e
146+ (,) (Var.safe field) <$> toJsExpr e
166147
167148 let fieldMap =
168149 List.foldl' combine Map.empty fields'
@@ -199,7 +180,7 @@ exprToCode tcc annotatedExpr@(A.A _ expr) =
199180
200181 ExplicitList elements ->
201182 do jsElements <- mapM toJsExpr elements
202− jsExpr $ _List "fromArray" <| ArrayLit () jsElements
183+ jsExpr $ BuiltIn.list jsElements
203184
204185 Data tag members ->
205186 do jsMembers <- mapM toJsExpr members
@@ -210,7 +191,7 @@ exprToCode tcc annotatedExpr@(A.A _ expr) =
210191 zipWith (\n e -> (prop ("_" ++ show n), e)) [ 0 :: Int .. ]
211192
212193 GLShader _uid src _tipe ->
213− jsExpr $ ObjectLit () [(PropString () "src", literal (Str src))]
194+ jsExpr $ ObjectLit () [(PropString () "src", Literal.literal (Str src))]
214195
215196 Port impl ->
216197 case impl of
@@ -276,7 +257,7 @@ destructPattern :: P.Optimized -> State Int (String, Maybe Opt.Def)
276257destructPattern pattern@(A.A ann pat) =
277258 case pat of
278259 P.Var x ->
279− return (Var.varName x, Nothing)
260+ return (Var.safe x, Nothing)
280261
281262 _ ->
282263 do arg <- Case.newVar
@@ -444,7 +425,7 @@ defToStatementsHelp facts annPattern@(A.A _ pattern) jsExpr =
444425 in
445426 return [ ExprStmt () $ AssignExpr () OpAssign op jsExpr ]
446427 else
447− return [ VarDeclStmt () [ define (Var.varName x) ] ]
428+ return [ VarDeclStmt () [ define (Var.safe x) ] ]
448429
449430 P.Record fields ->
450431 let
@@ -460,7 +441,7 @@ defToStatementsHelp facts annPattern@(A.A _ pattern) jsExpr =
460441 getVars patterns =
461442 case patterns of
462443 A.A _ (P.Var x) : rest ->
463− (Var.varName x :) `fmap` getVars rest
444+ (Var.safe x :) `fmap` getVars rest
464445 [] ->
465446 Just []
466447 _ ->
@@ -498,9 +479,9 @@ generateCase tcc expr branches =
498479 (revisedMatch, stmt) <-
499480 case expr of
500481 A.A _ (Var (Var.Canonical Var.Local x)) ->
501− return (Case.matchSubst [(tempVar, Var.varName x)] initialMatch, [])
482+ return (Case.matchSubst [(tempVar, Var.safe x)] initialMatch, [])
502483 A.A _ (Var (Var.Canonical (Var.TopLevel _) x)) ->
503− return (Case.matchSubst [(tempVar, Var.varName x)] initialMatch, [])
484+ return (Case.matchSubst [(tempVar, Var.safe x)] initialMatch, [])
504485 _ ->
505486 do expr' <- toJsExpr expr
506487 return (initialMatch, [VarDeclStmt () [varDecl tempVar expr']])
@@ -571,7 +552,7 @@ clause tcc variable (Case.Clause value vars mtch) =
571552 (,) False $
572553 case value of
573554 Right (Boolean b) -> BoolLit () b
574− Right lit -> literal lit
555+ Right lit -> Literal.literal lit
575556 Left (Var.Canonical _ name) ->
576557 string name
577558
@@ -694,8 +675,8 @@ specialOps :: [(String, Expression () -> Expression () -> Expression ())]
694675specialOps =
695676 [ (,) "^" $ \a b -> obj ["Math","pow"] `call` [a,b]
696677 , (,) "|>" $ flip (<|)
697− , (,) "==" $ \a b -> _Utils "eq" `call` [a,b]
698− , (,) "/=" $ \a b -> PrefixExpr () PrefixLNot (_Utils "eq" `call` [a,b])
678+ , (,) "==" $ \a b -> BuiltIn.eq a b
679+ , (,) "/=" $ \a b -> PrefixExpr () PrefixLNot (BuiltIn.eq a b)
699680 , (,) "<" $ cmp OpLT 0
700681 , (,) ">" $ cmp OpGT 0
701682 , (,) "<=" $ cmp OpLT 1
@@ -706,7 +687,7 @@ specialOps =
706687
707688cmp :: InfixOp -> Int -> Expression () -> Expression () -> Expression ()
708689cmp op n a b =
709− InfixExpr () op (_Utils "cmp" `call` [a,b]) (IntLit () n)
690+ InfixExpr () op (BuiltIn.compare a b) (IntLit () n)
710691
711692
712693-- BINARY OPERATOR COLLECTORS