on master help sign in
Get rid of symbols, move code to unused module for now
commit26bf33f56b9bc0dde06de55330efaff660178f69 authorEvan Czaplicki <evancz@users.noreply.github.com> dateTue 16 May 2017, 17:15 (9 years ago) parent400f0f2
4 files changed+100−118
src/Elm/Compiler/Objects.hs+1−4 src/Elm/Compiler/Objects/Internal.hs−29 src/Generate/JavaScript/Symbol.hs+74 src/Generate/JavaScript/Variable.hs+25−85
src/Elm/Compiler/Objects.hs+1−4
@@ -1,9 +1,6 @@
11{-# OPTIONS_GHC -Wall #-}
22module Elm.Compiler.Objects
3− ( SymbolTable
4− , symbolTable
5− , Symbol(..)
6− , Graph
3+ ( Graph
74 , union
85 , unions
96 , Roots
src/Elm/Compiler/Objects/Internal.hs−29
@@ -5,10 +5,6 @@ module Elm.Compiler.Objects.Internal
55 , fromModule
66 , union
77 , unions
8− , SymbolTable
9− , symbolTable
10− , Symbol(..)
11− , lookup
128 , Roots
139 , mains
1410 , value
@@ -59,31 +55,6 @@ unions graphs =
5955
6056
6157
62−-- SYMBOLS
63−
64−
65−newtype SymbolTable =
66− SymbolTable (Map.Map Var.Global Symbol)
67−
68−
69−symbolTable :: Map.Map Var.Global Symbol -> SymbolTable
70−symbolTable =
71− SymbolTable
72−
73−
74−data Symbol =
75− Symbol
76− { _home :: !Word16
77− , _name :: !Word32
78− }
79−
80−
81−lookup :: Var.Global -> SymbolTable -> Maybe Symbol
82−lookup var (SymbolTable symbols) =
83− Map.lookup var symbols
84−
85−
86−
8758-- ROOTS
8859
8960
src/Generate/JavaScript/Symbol.hsnew file+74
@@ -0,0 +1,74 @@
1+import qualified Data.Char as Char
2+import Data.Word (Word16, Word32)
3+
4+
5+
6+-- SYMBOLS
7+
8+
9+data Symbol =
10+ Symbol
11+ { _home :: !Word16
12+ , _name :: !Word32
13+ }
14+
15+
16+
17+-- BINARY
18+
19+
20+instance Binary Symbol where
21+ put (Symbol home name) =
22+ put home >> put name
23+
24+ get =
25+ liftM2 Symbol get get
26+
27+
28+
29+-- EXPRESSION
30+
31+
32+toExpr :: Symbol -> JS.Expr
33+toExpr (Symbol home name) =
34+ JS.DotRef (JS.ref (homeToText home)) (JS.Id (nameToText name))
35+
36+
37+homeToText :: Word16 -> Text
38+homeToText word =
39+ Text.pack ('$' : show word)
40+
41+
42+nameToText :: Word32 -> Text
43+nameToText word =
44+ Text.pack (makeName word "")
45+
46+
47+makeName :: Word32 -> String -> String
48+makeName word str =
49+ if word < 26 then
50+ makeChar 97 word : str
51+
52+ else if word < 52 then
53+ makeChar 65 (word - 26) : str
54+
55+ else
56+ let
57+ (next, leftover) =
58+ quotRem word 52
59+ in
60+ makeName next (makeInnerChar leftover : str)
61+
62+
63+makeInnerChar :: Word32 -> Char
64+makeInnerChar word =
65+ if word < 26 then
66+ makeChar 97 word
67+ else
68+ makeChar 65 (word - 26)
69+
70+
71+{-# INLINE makeChar #-}
72+makeChar :: Word32 -> Word32 -> Char
73+makeChar root offset =
74+ Char.chr (fromIntegral (root + offset))
src/Generate/JavaScript/Variable.hs+25−85
@@ -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))