@@ -17,7 +17,9 @@ import qualified AST.Module.Name as ModuleName
17import qualified AST.Pattern as P
17import qualified AST.Pattern as P
18import qualified AST.Variable as Var
18import qualified AST.Variable as Var
19import Generate.JavaScript.Helpers as Help
19import Generate.JavaScript.Helpers as Help
20+import qualified Generate.JavaScript.BuiltIn as BuiltIn
20import qualified Generate.JavaScript.Crash as Crash
21import qualified Generate.JavaScript.Crash as Crash
22+import qualified Generate.JavaScript.Literal as Literal
21import qualified Generate.JavaScript.Port as Port
23import qualified Generate.JavaScript.Port as Port
22import qualified Generate.JavaScript.Variable as Var
24import qualified Generate.JavaScript.Variable as Var
23import qualified Optimize.Cases as Case
25import qualified Optimize.Cases as Case
@@ -30,28 +32,6 @@ generate modul =
30 error "TODO" modul exprToCode
32 error "TODO" modul exprToCode
35−_Utils :: String -> Expression ()
40−_List :: String -> Expression ()
45−literal :: Literal -> Expression ()
48− Chr c -> _Utils "chr" <| string [c]
50− IntNum n -> IntLit () n
51− FloatNum n -> NumLit () n
52− Boolean b -> BoolLit () b
55-- CODE CHUNKS
35-- CODE CHUNKS
@@ -139,30 +119,31 @@ exprToCode tcc annotatedExpr@(A.A _ expr) =
139 jsExpr $ Var.canonical var
119 jsExpr $ Var.canonical var
141 Literal lit ->
121 Literal lit ->
142− jsExpr $ literal lit
122+ jsExpr (Literal.literal lit)
144 Range lo hi ->
124 Range lo hi ->
145 do lo' <- toJsExpr lo
125 do lo' <- toJsExpr lo
146 hi' <- toJsExpr hi
126 hi' <- toJsExpr hi
147− jsExpr $ _List "range" `call` [lo',hi']
127+ jsExpr $ BuiltIn.range lo' hi'
149 Access record field ->
129 Access record field ->
150 do record' <- toJsExpr record
130 do record' <- toJsExpr record
151− jsExpr $ DotRef () record' (var (Var.varName field))
131+ jsExpr $ DotRef () record' (var (Var.safe field))
153 Update record fields ->
133 Update record fields ->
154− do record' <- toJsExpr record
134+ let
155− fields' <-
135+ fieldToJs (field, value) =
156− forM fields $ \(field, value) ->
136+ do jsValue <- toJsExpr value
157− do value' <- toJsExpr value
158− return $ ArrayLit () [ string (Var.varName field), value' ]
137+ return (Var.safe field, jsValue)
160− jsExpr $ _Utils "replace" `call` [ArrayLit () fields', record']
139+ do jsRecord <- toJsExpr record
140+ jsFields <- mapM fieldToJs fields
141+ jsExpr $ BuiltIn.recordUpdate jsRecord jsFields
162 Record fields ->
143 Record fields ->
163 do fields' <-
144 do fields' <-
164 forM fields $ \(field, e) ->
145 forM fields $ \(field, e) ->
165− (,) (Var.varName field) <$> toJsExpr e
146+ (,) (Var.safe field) <$> toJsExpr e
167 let fieldMap =
148 let fieldMap =
168 List.foldl' combine Map.empty fields'
149 List.foldl' combine Map.empty fields'
@@ -199,7 +180,7 @@ exprToCode tcc annotatedExpr@(A.A _ expr) =
200 ExplicitList elements ->
181 ExplicitList elements ->
201 do jsElements <- mapM toJsExpr elements
182 do jsElements <- mapM toJsExpr elements
202− jsExpr $ _List "fromArray" <| ArrayLit () jsElements
183+ jsExpr $ BuiltIn.list jsElements
204 Data tag members ->
185 Data tag members ->
205 do jsMembers <- mapM toJsExpr members
186 do jsMembers <- mapM toJsExpr members
@@ -210,7 +191,7 @@ exprToCode tcc annotatedExpr@(A.A _ expr) =
210 zipWith (\n e -> (prop ("_" ++ show n), e)) [ 0 :: Int .. ]
191 zipWith (\n e -> (prop ("_" ++ show n), e)) [ 0 :: Int .. ]
212 GLShader _uid src _tipe ->
193 GLShader _uid src _tipe ->
213− jsExpr $ ObjectLit () [(PropString () "src", literal (Str src))]
194+ jsExpr $ ObjectLit () [(PropString () "src", Literal.literal (Str src))]
215 Port impl ->
196 Port impl ->
216 case impl of
197 case impl of
@@ -276,7 +257,7 @@ destructPattern :: P.Optimized -> State Int (String, Maybe Opt.Def)
276destructPattern pattern@(A.A ann pat) =
257destructPattern pattern@(A.A ann pat) =
277 case pat of
258 case pat of
278 P.Var x ->
259 P.Var x ->
279− return (Var.varName x, Nothing)
260+ return (Var.safe x, Nothing)
282 do arg <- Case.newVar
263 do arg <- Case.newVar
@@ -444,7 +425,7 @@ defToStatementsHelp facts annPattern@(A.A _ pattern) jsExpr =
445 return [ ExprStmt () $ AssignExpr () OpAssign op jsExpr ]
426 return [ ExprStmt () $ AssignExpr () OpAssign op jsExpr ]
447− return [ VarDeclStmt () [ define (Var.varName x) ] ]
428+ return [ VarDeclStmt () [ define (Var.safe x) ] ]
449 P.Record fields ->
430 P.Record fields ->
@@ -460,7 +441,7 @@ defToStatementsHelp facts annPattern@(A.A _ pattern) jsExpr =
460 getVars patterns =
441 getVars patterns =
461 case patterns of
442 case patterns of
462 A.A _ (P.Var x) : rest ->
443 A.A _ (P.Var x) : rest ->
463− (Var.varName x :) `fmap` getVars rest
444+ (Var.safe x :) `fmap` getVars rest
@@ -498,9 +479,9 @@ generateCase tcc expr branches =
498 (revisedMatch, stmt) <-
479 (revisedMatch, stmt) <-
499 case expr of
480 case expr of
500 A.A _ (Var (Var.Canonical Var.Local x)) ->
481 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, [])
502 A.A _ (Var (Var.Canonical (Var.TopLevel _) x)) ->
483 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, [])
505 do expr' <- toJsExpr expr
486 do expr' <- toJsExpr expr
506 return (initialMatch, [VarDeclStmt () [varDecl tempVar expr']])
487 return (initialMatch, [VarDeclStmt () [varDecl tempVar expr']])
@@ -571,7 +552,7 @@ clause tcc variable (Case.Clause value vars mtch) =
571 (,) False $
552 (,) False $
572 case value of
553 case value of
573 Right (Boolean b) -> BoolLit () b
554 Right (Boolean b) -> BoolLit () b
574− Right lit -> literal lit
555+ Right lit -> Literal.literal lit
575 Left (Var.Canonical _ name) ->
556 Left (Var.Canonical _ name) ->
576 string name
557 string name
@@ -694,8 +675,8 @@ specialOps :: [(String, Expression () -> Expression () -> Expression ())]
694specialOps =
675specialOps =
695 [ (,) "^" $ \a b -> obj ["Math","pow"] `call` [a,b]
676 [ (,) "^" $ \a b -> obj ["Math","pow"] `call` [a,b]
696 , (,) "|>" $ flip (<|)
677 , (,) "|>" $ flip (<|)
697− , (,) "==" $ \a b -> _Utils "eq" `call` [a,b]
678+ , (,) "==" $ \a b -> BuiltIn.eq a b
698− , (,) "/=" $ \a b -> PrefixExpr () PrefixLNot (_Utils "eq" `call` [a,b])
679+ , (,) "/=" $ \a b -> PrefixExpr () PrefixLNot (BuiltIn.eq a b)
699 , (,) "<" $ cmp OpLT 0
680 , (,) "<" $ cmp OpLT 0
700 , (,) ">" $ cmp OpGT 0
681 , (,) ">" $ cmp OpGT 0
701 , (,) "<=" $ cmp OpLT 1
682 , (,) "<=" $ cmp OpLT 1
@@ -706,7 +687,7 @@ specialOps =
707cmp :: InfixOp -> Int -> Expression () -> Expression () -> Expression ()
688cmp :: InfixOp -> Int -> Expression () -> Expression () -> Expression ()
708cmp op n a b =
689cmp op n a b =
709− InfixExpr () op (_Utils "cmp" `call` [a,b]) (IntLit () n)
690+ InfixExpr () op (BuiltIn.compare a b) (IntLit () n)
712-- BINARY OPERATOR COLLECTORS
693-- BINARY OPERATOR COLLECTORS