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 AST.Variable as Var
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 :: Var.Global -> JS.Expr
50global (Var.Global home name) =
51 if Help.isOp name then
52 JS.BracketRef (JS.ref (opsDict home)) (JS.String name)
54 JS.ref (qualified home name)
61coreNative :: Text -> Text -> JS.Expr
62coreNative moduleName name =
63 global (Var.Global (ModuleName.inCore ("Native." <> moduleName)) name)
66staticProgram :: JS.Expr
68 global (Var.Global (ModuleName.inVirtualDom "Native.VirtualDom") "staticProgram")
75defineGlobal :: ModuleName.Canonical -> Text -> JS.Expr -> [JS.Stmt]
76defineGlobal home name body =
77 case Help.isOp name of
79 [ JS.VarDeclStmt [ JS.varDecl (qualified home name) body ]
85 lvalue = JS.LBracket (JS.ref dict) (JS.String name)
87 [ JS.VarDeclStmt [ JS.varDecl dict (JS.refOrObject dict) ]
88 , JS.ExprStmt (JS.Assign lvalue body)
96qualified :: ModuleName.Canonical -> Text -> Text
98 moduleToText home <> "$" <> name
101opsDict :: ModuleName.Canonical -> Text
103 moduleToText home <> "_ops"
106moduleToText :: ModuleName.Canonical -> Text
107moduleToText (ModuleName.Canonical (Pkg.Name user project) moduleName) =
110 Text.replace "-" "_" user
113 Text.replace "-" "_" project
116 Text.replace "." "_" moduleName
118 "_" <> safeUser <> "$" <> safeProject <> "$" <> safeModuleName
127 if Set.member name jsReserveds then "_" <> name else name
130jsReserveds :: Set.Set Text
134 [ "null", "undefined", "Nan", "Infinity", "true", "false", "eval"
135 , "arguments", "int", "byte", "char", "goto", "long", "final", "float"
136 , "short", "double", "native", "throws", "boolean", "abstract", "volatile"
137 , "transient", "synchronized", "function", "break", "case", "catch"
138 , "continue", "debugger", "default", "delete", "do", "else", "finally"
139 , "for", "function", "if", "in", "instanceof", "new", "return", "switch"
140 , "this", "throw", "try", "typeof", "var", "void", "while", "with", "class"
141 , "const", "enum", "export", "extends", "import", "super", "implements"
142 , "interface", "let", "package", "private", "protected", "public"
144 -- reserved by the Elm runtime system
145 , "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9"
146 , "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