@@ -1,35 +1,30 @@
1{-# OPTIONS_GHC -Wall #-}
1{-# OPTIONS_GHC -Wall #-}
2{-# LANGUAGE OverloadedStrings #-}
2{-# LANGUAGE OverloadedStrings #-}
3−{-# LANGUAGE UnboxedTuples #-}
4module Generate.JavaScript.Variable
3module Generate.JavaScript.Variable
5 ( Generator
4 ( Generator
13− , getGlobalName
12+ , globalName
18−import Prelude hiding (init)
19import qualified Control.Monad.State as State
17import qualified Control.Monad.State as State
20−import qualified Data.Char as Char
21import Data.Monoid ((<>))
18import Data.Monoid ((<>))
22import qualified Data.Map as Map
19import qualified Data.Map as Map
23import qualified Data.Set as Set
20import qualified Data.Set as Set
24import qualified Data.Text as Text
21import qualified Data.Text as Text
25import Data.Text (Text)
22import Data.Text (Text)
26−import Data.Word (Word16, Word32)
28import qualified AST.Helpers as Help
24import qualified AST.Helpers as Help
29import qualified AST.Module.Name as ModuleName
25import qualified AST.Module.Name as ModuleName
30import qualified AST.Variable as Var
26import qualified AST.Variable as Var
31import qualified Elm.Package as Pkg
27import qualified Elm.Package as Pkg
32−import qualified Elm.Compiler.Objects.Internal as Obj
33import qualified Generate.JavaScript.Builder as JS
28import qualified Generate.JavaScript.Builder as JS
34import qualified Generate.JavaScript.Helpers as JS
29import qualified Generate.JavaScript.Helpers as JS
@@ -54,13 +49,12 @@ data Table =
55 { _uid :: !Int
50 { _uid :: !Int
56 , _names :: Map.Map Var.Global Text
51 , _names :: Map.Map Var.Global Text
57− , _symbols :: Obj.SymbolTable
61−init :: Obj.SymbolTable -> Table
55+emptyTable :: Table
62−init symbols =
56+emptyTable =
63− Table 0 Map.empty symbols
57+ Table 0 Map.empty
@@ -69,8 +63,8 @@ init symbols =
70fresh :: Generator Text
64fresh :: Generator Text
72− do (Table uid names symbols) <- State.get
66+ do (Table uid names) <- State.get
73− State.put (Table (uid + 1) names symbols)
67+ State.put (Table (uid + 1) names)
74 return (Text.pack ("_v" ++ show uid))
68 return (Text.pack ("_v" ++ show uid))
@@ -118,41 +112,30 @@ reservedWords =
119global :: Var.Global -> Generator JS.Expr
113global :: Var.Global -> Generator JS.Expr
120global var =
114global var =
121− do table@(Table _ _ symbols) <- State.get
115+ JS.ref <$> globalName var
122− case Obj.lookup var symbols of
124− JS.ref <$> getGlobalNameHelp var table
126− Just (Obj.Symbol symHome symName) ->
129− (JS.ref (symbolHomeToText symHome))
130− (JS.Id (symbolNameToText symName))
133−getGlobalName :: Var.Global -> Generator Text
118+globalName :: Var.Global -> Generator Text
134−getGlobalName var =
119+globalName var =
135 do table <- State.get
120 do table <- State.get
136− getGlobalNameHelp var table
121+ globalNameHelp var table
139−getGlobalNameHelp :: Var.Global -> Table -> Generator Text
124+globalNameHelp :: Var.Global -> Table -> Generator Text
140−getGlobalNameHelp var@(Var.Global home name) (Table uid names symbols) =
125+globalNameHelp var@(Var.Global home name) (Table uid names) =
141− case Map.lookup var names of
126+ case Help.isOp name of
142− Just jsName ->
127+ False ->
143− return jsName
128+ return $ globalToName home name
131+ case Map.lookup var names of
145− Nothing ->
135+ Nothing ->
147− (# newUid, newName #) =
149− then (# uid + 1, "_op" <> Text.pack (show uid) #)
136+ do let jsName = globalToName home ("_op" <> Text.pack (show uid))
150− else (# uid, name #)
137+ State.put (Table (uid + 1) (Map.insert var jsName names))
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
138+ return jsName
158globalToName :: ModuleName.Canonical -> Text -> Text
141globalToName :: ModuleName.Canonical -> Text -> Text
@@ -166,46 +149,3 @@ globalToName (ModuleName.Canonical (Pkg.Name user project) moduleName) name =
166 <> "$" <> Text.replace "." "_" moduleName
149 <> "$" <> Text.replace "." "_" moduleName
167 <> "$" <> name
150 <> "$" <> name
174−symbolHomeToText :: Word16 -> Text
175−symbolHomeToText word =
176− Text.pack ('$' : show word)
179−symbolNameToText :: Word32 -> Text
180−symbolNameToText word =
181− Text.pack (makeName word "")
184−makeName :: Word32 -> String -> String
187− makeChar 97 word : str
189− else if word < 52 then
190− makeChar 65 (word - 26) : str
197− makeName next (makeInnerChar leftover : str)
200−makeInnerChar :: Word32 -> Char
205− makeChar 65 (word - 26)
208−{-# INLINE makeChar #-}
209−makeChar :: Word32 -> Word32 -> Char
210−makeChar root offset =
211− Char.chr (fromIntegral (root + offset))