on master help sign in
start breaking JS gen into smaller modules and clean up code
commit6ccaf92df1efcb3f0d368e9da445bb0803235e56 authorEvan Czaplicki <info@elm-lang.org> dateSat 29 Aug 2015, 14:11 (11 years ago) parentfc17235
5 files changed+112−59
elm-compiler.cabal+2 src/Generate/JavaScript.hs+25−44 src/Generate/JavaScript/BuiltIn.hs+46 src/Generate/JavaScript/Literal.hs+25 src/Generate/JavaScript/Variable.hs+14−15
elm-compiler.cabal+2
@@ -77,8 +77,10 @@ Library
7777 Elm.Compiler.Type.Extract,
7878 Elm.Compiler.Version,
7979 Generate.JavaScript,
80+ Generate.JavaScript.BuiltIn,
8081 Generate.JavaScript.Crash,
8182 Generate.JavaScript.Helpers,
83+ Generate.JavaScript.Literal,
8284 Generate.JavaScript.Port,
8385 Generate.JavaScript.Variable,
8486 Nitpick.Pattern,
src/Generate/JavaScript.hs+25−44
@@ -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
src/Generate/JavaScript/BuiltIn.hsnew file+46
@@ -0,0 +1,46 @@
1+module Generate.JavaScript.BuiltIn where
2+
3+import qualified Language.ECMAScript3.Syntax as JS
4+
5+
6+-- LITERALS
7+
8+character :: Char -> JS.Expression ()
9+character char =
10+ error "TODO - utils.chr" JS.StringLit () [char]
11+
12+
13+string :: String -> JS.Expression ()
14+string str =
15+ JS.StringLit () str
16+
17+
18+-- LISTS
19+
20+list :: [JS.Expression ()] -> JS.Expression ()
21+list elements =
22+ error "TODO - utils.list" (JS.ArrayLit () elements)
23+
24+
25+range :: JS.Expression () -> JS.Expression () -> JS.Expression ()
26+range low high =
27+ error "TODO - utils.range" low high
28+
29+
30+-- RECORDS
31+
32+recordUpdate :: JS.Expression () -> [(String, JS.Expression ())] -> JS.Expression ()
33+recordUpdate record fields =
34+ error "TODO - utils.update" record fields
35+
36+
37+-- COMPARISIONS
38+
39+eq :: JS.Expression () -> JS.Expression () -> JS.Expression ()
40+eq left right =
41+ error "TODO - utils.eq" left right
42+
43+
44+compare :: JS.Expression () -> JS.Expression () -> JS.Expression ()
45+compare left right =
46+ error "TODO - utils.compare" left right
src/Generate/JavaScript/Literal.hsnew file+25
@@ -0,0 +1,25 @@
1+module Generate.JavaScript.Literal (literal) where
2+
3+import qualified Language.ECMAScript3.Syntax as JS
4+
5+import qualified AST.Literal as Lit
6+import qualified Generate.JavaScript.BuiltIn as BuiltIn
7+
8+
9+literal :: Lit.Literal -> JS.Expression ()
10+literal lit =
11+ case lit of
12+ Lit.Chr char ->
13+ BuiltIn.character char
14+
15+ Lit.Str string ->
16+ BuiltIn.string string
17+
18+ Lit.IntNum number ->
19+ JS.IntLit () number
20+
21+ Lit.FloatNum number ->
22+ JS.NumLit () number
23+
24+ Lit.Boolean boolean ->
25+ JS.BoolLit () boolean
src/Generate/JavaScript/Variable.hs+14−15
@@ -1,4 +1,4 @@
1−module Generate.JavaScript.Variable where
1+module Generate.JavaScript.Variable (canonical, safe) where
22
33import qualified Data.List as List
44import qualified Data.Set as Set
@@ -11,10 +11,7 @@ import qualified Elm.Package as Pkg
1111import qualified Generate.JavaScript.Helpers as JS
1212
1313
14−swap :: Char -> Char -> Char -> Char
15−swap from to c =
16− if c == from then to else c
17−
14+-- INSTANTIATE VARIABLES
1815
1916canonical :: Var.Canonical -> JS.Expression ()
2017canonical (Var.Canonical home name) =
@@ -22,7 +19,7 @@ canonical (Var.Canonical home name) =
2219 JS.BracketRef () (JS.ref (addRoot home "_op")) (JS.string name)
2320
2421 else
25− JS.ref (addRoot home (varName name))
22+ JS.ref (addRoot home (safe name))
2623
2724
2825addRoot :: Var.Home -> String -> String
@@ -49,22 +46,25 @@ canonicalName (ModuleName.Canonical (Pkg.Name user project) moduleName) name =
4946 ++ '$' : name
5047
5148
49+swap :: Char -> Char -> Char -> Char
50+swap from to c =
51+ if c == from then to else c
52+
53+
54+-- SAFE NAMES
5255
53−varName :: String -> String
54−varName name =
56+safe :: String -> String
57+safe name =
5558 let saferName =
5659 if Set.member name jsReserveds then '$' : name else name
5760 in
5861 map (swap '\'' '$') saferName
5962
6063
61−--value :: Module.Name -> String -> JS.Expression ()
62−--value home name =
63−-- canonical (Var.Canonical (Var.Module home) name)
64−
65−
6664jsReserveds :: Set.Set String
67−jsReserveds = Set.fromList
65+jsReserveds =
66+ Set.fromList
67+ -- JS reserved words
6868 [ "null", "undefined", "Nan", "Infinity", "true", "false", "eval"
6969 , "arguments", "int", "byte", "char", "goto", "long", "final", "float"
7070 , "short", "double", "native", "throws", "boolean", "abstract", "volatile"
@@ -76,7 +76,6 @@ jsReserveds = Set.fromList
7676 , "interface", "let", "package", "private", "protected", "public"
7777 , "static", "yield"
7878 -- reserved by the Elm runtime system
79− , "Elm"
8079 , "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9"
8180 , "A2", "A3", "A4", "A5", "A6", "A7", "A8", "A9"
8281 ]