on master help sign in
Make Generate.JavaScript.Mode its own module

This change also moves towards getting --debug working again. In particular, if you are in debug mode, you must have the full transitive set of module interfaces. By putting that information in the Mode, it means it only needs to be loaded in that case. In dev and prod mode, no extra work is needed.

commit6d686c5b576b6472a496caac5d965c0b677d9293 authorEvan Czaplicki <evancz@users.noreply.github.com> dateTue 10 Apr 2018, 16:20 (9 years ago) parent4efbdd9
3 files changed+95−78
compiler/src/Generate/JavaScript/Mode.hs+94 compiler/src/Generate/JavaScript/Name.hs−78 elm.cabal+1
compiler/src/Generate/JavaScript/Mode.hsnew file+94
@@ -0,0 +1,94 @@
1+module Generate.JavaScript.Mode
2+ ( Mode(..)
3+ , Target(..)
4+ , debug
5+ , dev
6+ , prod
7+ , isServer
8+ )
9+ where
10+
11+
12+import qualified Data.List as List
13+import qualified Data.Map as Map
14+
15+import qualified AST.Optimized as Opt
16+import qualified Elm.Interface as I
17+import qualified Elm.Name as N
18+import qualified Generate.JavaScript.Name as Name
19+
20+
21+
22+-- MODE
23+
24+
25+data Mode
26+ = Dev Target (Maybe I.Interfaces)
27+ | Prod Target ShortFieldNames
28+
29+
30+data Target = Client | Server
31+
32+
33+debug :: Target -> I.Interfaces -> Mode
34+debug target interfaces =
35+ Dev target (Just interfaces)
36+
37+
38+dev :: Target -> Mode
39+dev target =
40+ Dev target Nothing
41+
42+
43+prod :: Target -> Opt.Graph -> Mode
44+prod target (Opt.Graph _ _ fieldCounts) =
45+ Prod target (shortenFieldNames fieldCounts)
46+
47+
48+
49+-- IS SERVER?
50+
51+
52+isServer :: Mode -> Bool
53+isServer mode =
54+ case mode of
55+ Dev target _ -> isServerHelp target
56+ Prod target _ -> isServerHelp target
57+
58+
59+isServerHelp :: Target -> Bool
60+isServerHelp target =
61+ case target of
62+ Client -> False
63+ Server -> True
64+
65+
66+
67+-- SHORTEN FIELD NAMES
68+
69+
70+type ShortFieldNames =
71+ Map.Map N.Name Name.Name
72+
73+
74+shortenFieldNames :: Map.Map N.Name Int -> ShortFieldNames
75+shortenFieldNames frequencies =
76+ Map.foldr addToShortNames Map.empty $
77+ Map.foldrWithKey addToBuckets Map.empty frequencies
78+
79+
80+addToBuckets :: N.Name -> Int -> Map.Map Int [N.Name] -> Map.Map Int [N.Name]
81+addToBuckets field frequency buckets =
82+ -- TODO try using an IntMap for buckets
83+ Map.insertWith (++) frequency [field] buckets
84+
85+
86+addToShortNames :: [N.Name] -> ShortFieldNames -> ShortFieldNames
87+addToShortNames fields shortNames =
88+ List.foldl' addField shortNames fields
89+
90+
91+addField :: ShortFieldNames -> N.Name -> ShortFieldNames
92+addField shortNames field =
93+ let rename = Name.fromInt (Map.size shortNames) in
94+ Map.insert field rename shortNames
compiler/src/Generate/JavaScript/Name.hs−78
@@ -2,10 +2,6 @@
22{-# LANGUAGE OverloadedStrings #-}
33module Generate.JavaScript.Name
44 ( Name
5− , Mode(..)
6− , Target(..)
7− , Debugger(..)
8− , isServer
95 , toBuilder
106 , fromIndex
117 , fromInt
@@ -13,22 +9,18 @@ module Generate.JavaScript.Name
139 , fromGlobal
1410 , fromCycle
1511 , fromKernel
16− , fromField
1712 , makeF
1813 , makeA
1914 , makeLabel
2015 , makeTemp
2116 , dollar
22− , shortenFieldNames
2317 )
2418 where
2519
2620
2721import qualified Data.ByteString.Builder as B
2822import qualified Data.ByteString.Short as S
29−import qualified Data.List as List
3023import Data.Monoid ((<>))
31−import Data.Map ((!))
3224import qualified Data.Map as Map
3325import qualified Data.Set as Set
3426import qualified Data.Text as Text
@@ -50,39 +42,6 @@ newtype Name =
5042
5143
5244
53−-- MODE
54−
55−
56−data Mode
57− = Dev Target Debugger
58− | Prod Target ShortFieldNames
59−
60−
61−data Target = Client | Server
62−
63−
64−data Debugger
65− = DebuggerOn
66− | DebuggerOff
67−
68−
69−type ShortFieldNames =
70− Map.Map N.Name Name
71−
72−
73−isServer :: Mode -> Bool
74−isServer mode =
75− case mode of
76− Dev target _ -> isServerHelp target
77− Prod target _ -> isServerHelp target
78−
79−
80−isServerHelp :: Target -> Bool
81−isServerHelp target =
82− case target of { Client -> False ; Server -> True }
83−
84−
85−
8645-- CONSTRUCTORS
8746
8847
@@ -127,16 +86,6 @@ fromKernel home name =
12786 Name ("_" <> N.toBuilder home <> "_" <> N.toBuilder name)
12887
12988
130−fromField :: Mode -> N.Name -> Name
131−fromField mode name =
132− case mode of
133− Dev _ _ ->
134− Name (N.toBuilder name)
135−
136− Prod _ fields ->
137− fields ! name
138−
139−
14089
14190-- TEMPORARY NAMES
14291
@@ -167,33 +116,6 @@ dollar =
167116
168117
169118
170−-- SHORTEN FIELD NAMES
171−
172−
173−shortenFieldNames :: Map.Map N.Name Int -> ShortFieldNames
174−shortenFieldNames frequencies =
175− Map.foldr addToShortNames Map.empty $
176− Map.foldrWithKey addToBuckets Map.empty frequencies
177−
178−
179−addToBuckets :: N.Name -> Int -> Map.Map Int [N.Name] -> Map.Map Int [N.Name]
180−addToBuckets field frequency buckets =
181− -- TODO try using an IntMap for buckets
182− Map.insertWith (++) frequency [field] buckets
183−
184−
185−addToShortNames :: [N.Name] -> ShortFieldNames -> ShortFieldNames
186−addToShortNames fields shortNames =
187− List.foldl' addField shortNames fields
188−
189−
190−addField :: ShortFieldNames -> N.Name -> ShortFieldNames
191−addField shortNames field =
192− let rename = fromInt (Map.size shortNames) in
193− Map.insert field rename shortNames
194−
195−
196−
197119-- RESERVED NAMES
198120
199121
elm.cabal+1
@@ -167,6 +167,7 @@ Executable elm
167167 Generate.JavaScript,
168168 Generate.JavaScript.Builder,
169169 Generate.JavaScript.Expression,
170+ Generate.JavaScript.Mode,
170171 Generate.JavaScript.Name,
171172 Json.Decode.Error,
172173 Json.Decode.Internals,