on 2d29699 help sign in
elk/src/Generate/JavaScript/Variable.hs
103 lines 2.8 kB history raw
1module Generate.JavaScript.Variable (fresh, canonical, defName, safe) where
3import qualified Control.Monad.State as State
4import qualified Data.List as List
5import qualified Data.Set as Set
6import qualified Language.ECMAScript3.Syntax as JS
8import qualified AST.Helpers as Help
9import qualified AST.Module.Name as ModuleName
10import qualified AST.Variable as Var
11import qualified Elm.Package as Pkg
12import qualified Generate.JavaScript.Helpers as JS
15-- FRESH NAMES
17fresh :: State.State Int String
18fresh =
19 do n <- State.get
20 State.modify (+1)
21 return ("_v" ++ show n)
24-- DEF NAMES
26defName :: Maybe ModuleName.Canonical -> String -> String
27defName maybeHome name =
28 case maybeHome of
29 Nothing ->
30 safe name
32 Just home ->
33 canonicalPrefix home (safe name)
36-- INSTANTIATE VARIABLES
38canonical :: Var.Canonical -> JS.Expression ()
39canonical (Var.Canonical home name) =
40 if Help.isOp name then
41 JS.BracketRef () (JS.ref (addRoot home "_op")) (JS.string name)
43 else
44 JS.ref (addRoot home (safe name))
47addRoot :: Var.Home -> String -> String
48addRoot home name =
49 case home of
50 Var.Local ->
51 name
53 Var.TopLevel moduleName ->
54 canonicalPrefix moduleName name
56 Var.BuiltIn ->
57 name
59 Var.Module moduleName ->
60 canonicalPrefix moduleName name
63canonicalPrefix :: ModuleName.Canonical -> String -> String
64canonicalPrefix (ModuleName.Canonical (Pkg.Name user project) moduleName) name =
65 map (swap '-' '_') user
66 ++ '$' : map (swap '-' '_') project
67 ++ '$' : List.intercalate "$" moduleName
68 ++ '$' : safe name
71swap :: Char -> Char -> Char -> Char
72swap from to c =
73 if c == from then to else c
76-- SAFE NAMES
78safe :: String -> String
79safe name =
80 let saferName =
81 if Set.member name jsReserveds then '$' : name else name
82 in
83 map (swap '\'' '$') saferName
86jsReserveds :: Set.Set String
87jsReserveds =
88 Set.fromList
89 -- JS reserved words
90 [ "null", "undefined", "Nan", "Infinity", "true", "false", "eval"
91 , "arguments", "int", "byte", "char", "goto", "long", "final", "float"
92 , "short", "double", "native", "throws", "boolean", "abstract", "volatile"
93 , "transient", "synchronized", "function", "break", "case", "catch"
94 , "continue", "debugger", "default", "delete", "do", "else", "finally"
95 , "for", "function", "if", "in", "instanceof", "new", "return", "switch"
96 , "this", "throw", "try", "typeof", "var", "void", "while", "with", "class"
97 , "const", "enum", "export", "extends", "import", "super", "implements"
98 , "interface", "let", "package", "private", "protected", "public"
99 , "static", "yield"
100 -- reserved by the Elm runtime system
101 , "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9"
102 , "A2", "A3", "A4", "A5", "A6", "A7", "A8", "A9"
103 ]