1{-# OPTIONS_GHC -Wall #-}
2{-# LANGUAGE OverloadedStrings #-}
3module Generate.JavaScript.Variable
17import Prelude hiding (init)
18import qualified Control.Monad.State as State
19import qualified Data.Char as Char
20import Data.Monoid ((<>))
21import qualified Data.Map as Map
22import qualified Data.Set as Set
23import qualified Data.Text as Text
24import Data.Text (Text)
25import Data.Word (Word16, Word32)
27import qualified AST.Helpers as Help
28import qualified AST.Module.Name as ModuleName
29import qualified AST.Variable as Var
30import qualified Elm.Package as Pkg
31import qualified Elm.Compiler.Objects.Internal as Obj
32import qualified Generate.JavaScript.Builder as JS
33import qualified Generate.JavaScript.Helpers as JS
40type Generator = State.State Table
43run :: Table -> Generator a -> ( a, Table )
45 State.runState generator table
55 , _names :: Map.Map Var.Global Text
56 , _symbols :: Obj.SymbolTable
60init :: Obj.SymbolTable -> Table
62 Table 0 Map.empty symbols
69fresh :: Generator Text
71 do (Table uid names symbols) <- State.get
72 State.put (Table (uid + 1) names symbols)
73 return (Text.pack ("_v" ++ show uid))
80local :: Text -> JS.Expr
87 if Set.member name reservedWords then
93reservedWords :: Set.Set Text
96 -- reserved by JavaScript
97 [ "null", "undefined", "Nan", "Infinity", "true", "false", "eval"
98 , "arguments", "int", "byte", "char", "goto", "long", "final", "float"
99 , "short", "double", "native", "throws", "boolean", "abstract", "volatile"
100 , "transient", "synchronized", "function", "break", "case", "catch"
101 , "continue", "debugger", "default", "delete", "do", "else", "finally"
102 , "for", "function", "if", "in", "instanceof", "new", "return", "switch"
103 , "this", "throw", "try", "typeof", "var", "void", "while", "with", "class"
104 , "const", "enum", "export", "extends", "import", "super", "implements"
105 , "interface", "let", "package", "private", "protected", "public"
108 , "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9"
109 , "A2", "A3", "A4", "A5", "A6", "A7", "A8", "A9"
118global :: Var.Global -> Generator JS.Expr
120 do table@(Table _ _ symbols) <- State.get
121 case Obj.lookup var symbols of
123 JS.ref <$> getGlobalNameHelp var table
125 Just (Obj.Symbol symHome symName) ->
128 (JS.ref (symbolHomeToText symHome))
129 (JS.Id (symbolNameToText symName))
132getGlobalName :: Var.Global -> Generator Text
134 do table <- State.get
135 getGlobalNameHelp var table
138getGlobalNameHelp :: Var.Global -> Table -> Generator Text
139getGlobalNameHelp var@(Var.Global home name) (Table uid names symbols) =
140 case Map.lookup var names of
145 case Help.isOp name of
147 do let jsName = globalToName home name
148 State.put (Table uid (Map.insert var jsName names) symbols)
152 do let jsName = globalToName home ("_op" <> Text.pack (show uid))
153 State.put (Table (uid + 1) (Map.insert var jsName names) symbols)
157globalToName :: ModuleName.Canonical -> Text -> Text
158globalToName (ModuleName.Canonical (Pkg.Name user project) moduleName) name =
159 Text.replace "-" "_" user
160 <> "$" <> Text.replace "-" "_" project
161 <> "$" <> Text.replace "." "_" moduleName
169symbolHomeToText :: Word16 -> Text
170symbolHomeToText word =
171 Text.pack ('$' : show word)
174symbolNameToText :: Word32 -> Text
175symbolNameToText word =
176 Text.pack (makeName word "")
179makeName :: Word32 -> String -> String
182 makeChar 97 word : str
184 else if word < 52 then
185 makeChar 65 (word - 26) : str
192 makeName next (makeInnerChar leftover : str)
195makeInnerChar :: Word32 -> Char
200 makeChar 65 (word - 26)
203{-# INLINE makeChar #-}
204makeChar :: Word32 -> Word32 -> Char
205makeChar root offset =
206 Char.chr (fromIntegral (root + offset))
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