on master help sign in
Get rid of symbols, move code to unused module for now
26bf33fEvan Czaplicki
src/Elm/Compiler/Objects.hs+1−4
@@ -1,9 +1,6 @@
1{-# OPTIONS_GHC -Wall #-}
1{-# OPTIONS_GHC -Wall #-}
2module Elm.Compiler.Objects
2module Elm.Compiler.Objects
3− ( SymbolTable
4− , symbolTable
5− , Symbol(..)
6− , Graph
3+ ( Graph
7 , union
4 , union
8 , unions
5 , unions
9 , Roots
6 , Roots
src/Elm/Compiler/Objects/Internal.hs−29
@@ -5,10 +5,6 @@ module Elm.Compiler.Objects.Internal
5 , fromModule
5 , fromModule
6 , union
6 , union
7 , unions
7 , unions
8− , SymbolTable
9− , symbolTable
10− , Symbol(..)
11− , lookup
12 , Roots
8 , Roots
13 , mains
9 , mains
14 , value
10 , value
@@ -59,31 +55,6 @@ unions graphs =
59
55
60
56
61
57
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−
87-- ROOTS
58-- ROOTS
88
59
89
60
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 @@
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
6 , run
5 , run
7 , Table
6 , Table
8− , init
7+ , emptyTable
9 , fresh
8 , fresh
10 , local
9 , local
11 , safe
10 , safe
12 , global
11 , global
13− , getGlobalName
12+ , globalName
14 )
13 )
15 where
14 where
16
15
17
16
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)
27
23
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
35
30
@@ -54,13 +49,12 @@ data Table =
54 Table
49 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
58 }
52 }
59
53
60
54
61−init :: Obj.SymbolTable -> Table
55+emptyTable :: Table
62−init symbols =
56+emptyTable =
63− Table 0 Map.empty symbols
57+ Table 0 Map.empty
64
58
65
59
66
60
@@ -69,8 +63,8 @@ init symbols =
69
63
70fresh :: Generator Text
64fresh :: Generator Text
71fresh =
65fresh =
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))
75
69
76
70
@@ -118,41 +112,30 @@ reservedWords =
118
112
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
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))
131
116
132
117
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
137
122
138
123
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
144
129
130+ True ->
131+ case Map.lookup var names of
132+ Just jsName ->
133+ return jsName
134+
145− Nothing ->
135+ Nothing ->
146− let
147− (# newUid, newName #) =
148− if Help.isOp name
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))
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
138+ return jsName
156
139
157
140
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
168
151
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))