1{-# OPTIONS_GHC -Wall #-}
2{-# LANGUAGE OverloadedStrings #-}
3module Generate.JavaScript.Variable
16import qualified Control.Monad.State as State
18import qualified Data.Set as Set
19import qualified Data.Text as Text
20import Data.Text (Text)
22import qualified AST.Helpers as Help
23import qualified AST.Module.Name as ModuleName
24import qualified Elm.Package as Pkg
25import qualified Generate.JavaScript.Builder as JS
26import qualified Generate.JavaScript.Helpers as JS
33fresh :: State.State Int Text
37 return (Text.pack ("_v" ++ show n))
44local :: Text -> JS.Expr
49global :: ModuleName.Canonical -> Text -> JS.Expr
51 if Help.isOp name then
52 JS.BracketRef (JS.ref (opsDict home)) (JS.String name)
54 JS.ref (qualified home name)
61native :: ModuleName.Canonical -> Text -> JS.Expr
62native moduleName name =
63 JS.obj [ moduleToText moduleName, name ]
66coreNative :: Text -> Text -> JS.Expr
67coreNative moduleName name =
68 native (ModuleName.inCore ("Native." <> moduleName)) name
71staticProgram :: JS.Expr
73 native (ModuleName.inVirtualDom "Native.VirtualDom") "staticProgram"
80defineGlobal :: ModuleName.Canonical -> Text -> JS.Expr -> [JS.Stmt]
81defineGlobal home name body =
82 case Help.isOp name of
84 [ JS.VarDeclStmt [ JS.varDecl (qualified home name) body ]
90 lvalue = JS.LBracket (JS.ref dict) (JS.String name)
92 [ JS.VarDeclStmt [ JS.varDecl dict (JS.refOrObject dict) ]
93 , JS.ExprStmt (JS.Assign lvalue body)
101qualified :: ModuleName.Canonical -> Text -> Text
103 moduleToText home <> "$" <> name
106opsDict :: ModuleName.Canonical -> Text
108 moduleToText home <> "_ops"
111moduleToText :: ModuleName.Canonical -> Text
112moduleToText (ModuleName.Canonical (Pkg.Name user project) moduleName) =
115 Text.replace "-" "_" user
118 Text.replace "-" "_" project
121 Text.replace "." "_" moduleName
123 "_" <> safeUser <> "$" <> safeProject <> "$" <> safeModuleName
132 if Set.member name jsReserveds then "_" <> name else name
135jsReserveds :: Set.Set Text
139 [ "null", "undefined", "Nan", "Infinity", "true", "false", "eval"
140 , "arguments", "int", "byte", "char", "goto", "long", "final", "float"
141 , "short", "double", "native", "throws", "boolean", "abstract", "volatile"
142 , "transient", "synchronized", "function", "break", "case", "catch"
143 , "continue", "debugger", "default", "delete", "do", "else", "finally"
144 , "for", "function", "if", "in", "instanceof", "new", "return", "switch"
145 , "this", "throw", "try", "typeof", "var", "void", "while", "with", "class"
146 , "const", "enum", "export", "extends", "import", "super", "implements"
147 , "interface", "let", "package", "private", "protected", "public"
149 -- reserved by the Elm runtime system
150 , "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9"
151 , "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