on 31545d1 help sign in
elk/src/Generate/JavaScript/Variable.hs
82 lines 2.5 kB history raw
1module Generate.JavaScript.Variable where
3import qualified Data.List as List
4import qualified Data.Set as Set
5import qualified Language.ECMAScript3.Syntax as JS
7import qualified AST.Helpers as Help
8import qualified AST.Module.Name as ModuleName
9import qualified AST.Variable as Var
10import qualified Elm.Package as Pkg
11import qualified Generate.JavaScript.Helpers as JS
14swap :: Char -> Char -> Char -> Char
15swap from to c =
16 if c == from then to else c
19canonical :: Var.Canonical -> JS.Expression ()
20canonical (Var.Canonical home name) =
21 if Help.isOp name then
22 JS.BracketRef () (JS.ref (addRoot home "_op")) (JS.string name)
24 else
25 JS.ref (addRoot home (varName name))
28addRoot :: Var.Home -> String -> String
29addRoot home name =
30 case home of
31 Var.Local ->
32 name
34 Var.TopLevel moduleName ->
35 canonicalName moduleName name
37 Var.BuiltIn ->
38 name
40 Var.Module moduleName ->
41 canonicalName moduleName name
44canonicalName :: ModuleName.Canonical -> String -> String
45canonicalName (ModuleName.Canonical (Pkg.Name user project) moduleName) name =
46 map (swap '-' '_') user
47 ++ '$' : map (swap '-' '_') project
48 ++ '$' : List.intercalate "$" moduleName
49 ++ '$' : name
53varName :: String -> String
54varName name =
55 let saferName =
56 if Set.member name jsReserveds then '$' : name else name
57 in
58 map (swap '\'' '$') saferName
61--value :: Module.Name -> String -> JS.Expression ()
62--value home name =
63-- canonical (Var.Canonical (Var.Module home) name)
66jsReserveds :: Set.Set String
67jsReserveds = Set.fromList
68 [ "null", "undefined", "Nan", "Infinity", "true", "false", "eval"
69 , "arguments", "int", "byte", "char", "goto", "long", "final", "float"
70 , "short", "double", "native", "throws", "boolean", "abstract", "volatile"
71 , "transient", "synchronized", "function", "break", "case", "catch"
72 , "continue", "debugger", "default", "delete", "do", "else", "finally"
73 , "for", "function", "if", "in", "instanceof", "new", "return", "switch"
74 , "this", "throw", "try", "typeof", "var", "void", "while", "with", "class"
75 , "const", "enum", "export", "extends", "import", "super", "implements"
76 , "interface", "let", "package", "private", "protected", "public"
77 , "static", "yield"
78 -- reserved by the Elm runtime system
79 , "Elm"
80 , "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9"
81 , "A2", "A3", "A4", "A5", "A6", "A7", "A8", "A9"
82 ]