@@ -1,35 +1,30 @@
11{-# OPTIONS_GHC -Wall #-}
22{-# LANGUAGE OverloadedStrings #-}
3−{-# LANGUAGE UnboxedTuples #-}
43module Generate.JavaScript.Variable
54 ( Generator
65 , run
76 , Table
8− , init
7+ , emptyTable
98 , fresh
109 , local
1110 , safe
1211 , global
13− , getGlobalName
12+ , globalName
1413 )
1514 where
1615
1716
18−import Prelude hiding (init)
1917import qualified Control.Monad.State as State
20−import qualified Data.Char as Char
2118import Data.Monoid ((<>))
2219import qualified Data.Map as Map
2320import qualified Data.Set as Set
2421import qualified Data.Text as Text
2522import Data.Text (Text)
26−import Data.Word (Word16, Word32)
2723
2824import qualified AST.Helpers as Help
2925import qualified AST.Module.Name as ModuleName
3026import qualified AST.Variable as Var
3127import qualified Elm.Package as Pkg
32−import qualified Elm.Compiler.Objects.Internal as Obj
3328import qualified Generate.JavaScript.Builder as JS
3429import qualified Generate.JavaScript.Helpers as JS
3530
@@ -54,13 +49,12 @@ data Table =
5449 Table
5550 { _uid :: !Int
5651 , _names :: Map.Map Var.Global Text
57− , _symbols :: Obj.SymbolTable
5852 }
5953
6054
61−init :: Obj.SymbolTable -> Table
62−init symbols =
63− Table 0 Map.empty symbols
55+emptyTable :: Table
56+emptyTable =
57+ Table 0 Map.empty
6458
6559
6660
@@ -69,8 +63,8 @@ init symbols =
6963
7064fresh :: Generator Text
7165fresh =
72− do (Table uid names symbols) <- State.get
73− State.put (Table (uid + 1) names symbols)
66+ do (Table uid names) <- State.get
67+ State.put (Table (uid + 1) names)
7468 return (Text.pack ("_v" ++ show uid))
7569
7670
@@ -118,41 +112,30 @@ reservedWords =
118112
119113global :: Var.Global -> Generator JS.Expr
120114global var =
121− do table@(Table _ _ symbols) <- State.get
122− case Obj.lookup var symbols of
123− Nothing ->
124− JS.ref <$> getGlobalNameHelp var table
125−
126− Just (Obj.Symbol symHome symName) ->
127− return $
128− JS.DotRef
129− (JS.ref (symbolHomeToText symHome))
130− (JS.Id (symbolNameToText symName))
115+ JS.ref <$> globalName var
131116
132117
133−getGlobalName :: Var.Global -> Generator Text
134−getGlobalName var =
118+globalName :: Var.Global -> Generator Text
119+globalName var =
135120 do table <- State.get
136− getGlobalNameHelp var table
121+ globalNameHelp var table
137122
138123
139−getGlobalNameHelp :: Var.Global -> Table -> Generator Text
140−getGlobalNameHelp var@(Var.Global home name) (Table uid names symbols) =
141− case Map.lookup var names of
142− Just jsName ->
143− return jsName
124+globalNameHelp :: Var.Global -> Table -> Generator Text
125+globalNameHelp var@(Var.Global home name) (Table uid names) =
126+ case Help.isOp name of
127+ False ->
128+ return $ globalToName home name
144129
145− Nothing ->
146− let
147− (# newUid, newName #) =
148− if Help.isOp name
149− then (# uid + 1, "_op" <> Text.pack (show uid) #)
150− else (# uid, name #)
151− in
152− do let jsName = globalToName home newName
153− let newNames = Map.insert var jsName names
154− State.put (Table newUid newNames symbols)
155− return jsName
130+ True ->
131+ case Map.lookup var names of
132+ Just jsName ->
133+ return jsName
134+
135+ Nothing ->
136+ do let jsName = globalToName home ("_op" <> Text.pack (show uid))
137+ State.put (Table (uid + 1) (Map.insert var jsName names))
138+ return jsName
156139
157140
158141globalToName :: ModuleName.Canonical -> Text -> Text
@@ -166,46 +149,3 @@ globalToName (ModuleName.Canonical (Pkg.Name user project) moduleName) name =
166149 <> "$" <> Text.replace "." "_" moduleName
167150 <> "$" <> name
168151
169−
170−
171−-- SYMBOLS
172−
173−
174−symbolHomeToText :: Word16 -> Text
175−symbolHomeToText word =
176− Text.pack ('$' : show word)
177−
178−
179−symbolNameToText :: Word32 -> Text
180−symbolNameToText word =
181− Text.pack (makeName word "")
182−
183−
184−makeName :: Word32 -> String -> String
185−makeName word str =
186− if word < 26 then
187− makeChar 97 word : str
188−
189− else if word < 52 then
190− makeChar 65 (word - 26) : str
191−
192− else
193− let
194− (next, leftover) =
195− quotRem word 52
196− in
197− makeName next (makeInnerChar leftover : str)
198−
199−
200−makeInnerChar :: Word32 -> Char
201−makeInnerChar word =
202− if word < 26 then
203− makeChar 97 word
204− else
205− makeChar 65 (word - 26)
206−
207−
208−{-# INLINE makeChar #-}
209−makeChar :: Word32 -> Word32 -> Char
210−makeChar root offset =
211− Char.chr (fromIntegral (root + offset))