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))
44define :: Maybe ModuleName.Canonical -> Text -> JS.Expr -> [JS.Stmt]
45define maybeHome name body =
46 if not (Help.isOp name) then
49 maybe unqualified qualified maybeHome name
51 [ JS.VarDeclStmt [ JS.varDecl jsName body ] ]
56 error "can only define infix operators at the top level"
61 getOpsDictName (Var.TopLevel home)
64 JS.LBracket (JS.ref opsDictName) (JS.String name)
66 [ JS.VarDeclStmt [ JS.varDecl opsDictName (JS.refOrObject opsDictName) ]
67 , JS.ExprStmt (JS.Assign JS.OpAssign lvalue body)
72-- INSTANTIATE VARIABLES
75canonical :: Var.Canonical -> JS.Expr
76canonical (Var.Canonical home name) =
77 if Help.isOp name then
78 JS.BracketRef (JS.ref (getOpsDictName home)) (JS.String name)
83 JS.ref (unqualified name)
86 JS.ref (unqualified name)
88 Var.Module moduleName@(ModuleName.Canonical _ rawName) ->
89 if ModuleName.isNative rawName then
90 native moduleName name
93 JS.ref (qualified moduleName name)
95 Var.TopLevel moduleName ->
96 JS.ref (qualified moduleName name)
99unqualified :: Text -> Text
104qualified :: ModuleName.Canonical -> Text -> Text
105qualified moduleName name =
106 moduleToText moduleName <> "$" <> name
109native :: ModuleName.Canonical -> Text -> JS.Expr
110native moduleName name =
111 JS.obj [ moduleToText moduleName, name ]
114coreNative :: Text -> Text -> JS.Expr
115coreNative moduleName name =
116 native (ModuleName.inCore ("Native." <> moduleName)) name
119staticProgram :: JS.Expr
121 native (ModuleName.inVirtualDom "Native.VirtualDom") "staticProgram"
124getOpsDictName :: Var.Home -> Text
129 Var.Local -> error "infix operators should only be defined in top-level declarations"
130 Var.BuiltIn -> error "there should be no built-in infix operators"
131 Var.Module name -> name
132 Var.TopLevel name -> name
134 moduleToText moduleName <> "_ops"
137moduleToText :: ModuleName.Canonical -> Text
138moduleToText (ModuleName.Canonical (Pkg.Name user project) moduleName) =
141 Text.replace "-" "_" user
144 Text.replace "-" "_" project
147 Text.replace "." "_" moduleName
149 "_" <> safeUser <> "$" <> safeProject <> "$" <> safeModuleName
158 if Set.member name jsReserveds then "$" <> name else name
161jsReserveds :: Set.Set Text
165 [ "null", "undefined", "Nan", "Infinity", "true", "false", "eval"
166 , "arguments", "int", "byte", "char", "goto", "long", "final", "float"
167 , "short", "double", "native", "throws", "boolean", "abstract", "volatile"
168 , "transient", "synchronized", "function", "break", "case", "catch"
169 , "continue", "debugger", "default", "delete", "do", "else", "finally"
170 , "for", "function", "if", "in", "instanceof", "new", "return", "switch"
171 , "this", "throw", "try", "typeof", "var", "void", "while", "with", "class"
172 , "const", "enum", "export", "extends", "import", "super", "implements"
173 , "interface", "let", "package", "private", "protected", "public"
175 -- reserved by the Elm runtime system
176 , "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9"
177 , "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