on 2cd0692 help sign in
elk/src/Generate/JavaScript/Variable.hs
66 lines 2.2 kB history raw
1module Generate.JavaScript.Variable where
3import qualified AST.Helpers as Help
4import qualified AST.Module as Module
5import qualified AST.Variable as Var
6import qualified Data.List as List
7import qualified Data.Set as Set
8import qualified Generate.JavaScript.Helpers as JS
9import qualified Language.ECMAScript3.Syntax as JS
12swap :: Char -> Char -> Char -> Char
13swap from to c =
14 if c == from then to else c
17canonical :: Var.Canonical -> JS.Expression ()
18canonical (Var.Canonical home name) =
19 case Help.isOp name of
20 True -> JS.BracketRef () (JS.obj (home' ++ ["_op"])) (JS.string name)
21 False -> JS.obj (home' ++ [ varName name ])
22 where
23 home' =
24 case home of
25 Var.Local -> []
26 --TODO: change this to act like Module
27 Var.TopLevel _ -> []
28 Var.BuiltIn -> []
29 Var.Module path -> [ moduleName path ]
32moduleName :: Module.Name -> String
33moduleName name =
34 '$' : List.intercalate "$" name
37varName :: String -> String
38varName name =
39 let saferName =
40 if Set.member name jsReserveds then '$' : name else name
41 in
42 map (swap '\'' '$') saferName
45value :: Module.Name -> String -> JS.Expression ()
46value home name =
47 canonical (Var.Canonical (Var.Module home) name)
50jsReserveds :: Set.Set String
51jsReserveds = Set.fromList
52 [ "null", "undefined", "Nan", "Infinity", "true", "false", "eval"
53 , "arguments", "int", "byte", "char", "goto", "long", "final", "float"
54 , "short", "double", "native", "throws", "boolean", "abstract", "volatile"
55 , "transient", "synchronized", "function", "break", "case", "catch"
56 , "continue", "debugger", "default", "delete", "do", "else", "finally"
57 , "for", "function", "if", "in", "instanceof", "new", "return", "switch"
58 , "this", "throw", "try", "typeof", "var", "void", "while", "with", "class"
59 , "const", "enum", "export", "extends", "import", "super", "implements"
60 , "interface", "let", "package", "private", "protected", "public"
61 , "static", "yield"
62 -- reserved by the Elm runtime system
63 , "Elm"
64 , "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9"
65 , "A2", "A3", "A4", "A5", "A6", "A7", "A8", "A9"
66 ]