1{-# OPTIONS_GHC -Wall #-}
2{-# LANGUAGE OverloadedStrings #-}
3module Generate.JavaScript.Variable
15import qualified Control.Monad.State as State
17import qualified Data.Set as Set
18import qualified Data.Text as Text
19import Data.Text (Text)
21import qualified AST.Helpers as Help
22import qualified AST.Module.Name as ModuleName
23import qualified Elm.Package as Pkg
24import qualified Generate.JavaScript.Builder as JS
25import qualified Generate.JavaScript.Helpers as JS
32fresh :: State.State Int Text
36 return (Text.pack ("_v" ++ show n))
43local :: Text -> JS.Expr
48global :: ModuleName.Canonical -> Text -> JS.Expr
50 if Help.isOp name then
51 JS.BracketRef (JS.ref (opsDict home)) (JS.String name)
53 JS.ref (qualified home name)
60coreNative :: Text -> Text -> JS.Expr
61coreNative moduleName name =
62 global (ModuleName.inCore ("Native." <> moduleName)) name
65staticProgram :: JS.Expr
67 global (ModuleName.inVirtualDom "Native.VirtualDom") "staticProgram"
74defineGlobal :: ModuleName.Canonical -> Text -> JS.Expr -> [JS.Stmt]
75defineGlobal home name body =
76 case Help.isOp name of
78 [ JS.VarDeclStmt [ JS.varDecl (qualified home name) body ]
84 lvalue = JS.LBracket (JS.ref dict) (JS.String name)
86 [ JS.VarDeclStmt [ JS.varDecl dict (JS.refOrObject dict) ]
87 , JS.ExprStmt (JS.Assign lvalue body)
95qualified :: ModuleName.Canonical -> Text -> Text
97 moduleToText home <> "$" <> name
100opsDict :: ModuleName.Canonical -> Text
102 moduleToText home <> "_ops"
105moduleToText :: ModuleName.Canonical -> Text
106moduleToText (ModuleName.Canonical (Pkg.Name user project) moduleName) =
109 Text.replace "-" "_" user
112 Text.replace "-" "_" project
115 Text.replace "." "_" moduleName
117 "_" <> safeUser <> "$" <> safeProject <> "$" <> safeModuleName
126 if Set.member name jsReserveds then "_" <> name else name
129jsReserveds :: Set.Set Text
133 [ "null", "undefined", "Nan", "Infinity", "true", "false", "eval"
134 , "arguments", "int", "byte", "char", "goto", "long", "final", "float"
135 , "short", "double", "native", "throws", "boolean", "abstract", "volatile"
136 , "transient", "synchronized", "function", "break", "case", "catch"
137 , "continue", "debugger", "default", "delete", "do", "else", "finally"
138 , "for", "function", "if", "in", "instanceof", "new", "return", "switch"
139 , "this", "throw", "try", "typeof", "var", "void", "while", "with", "class"
140 , "const", "enum", "export", "extends", "import", "super", "implements"
141 , "interface", "let", "package", "private", "protected", "public"
143 -- reserved by the Elm runtime system
144 , "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9"
145 , "A2", "A3", "A4", "A5", "A6", "A7", "A8", "A9"
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list