on master help sign in
Add binary instances for Opt.Graph / improve KChunk representation

The old KChunk did not distinguish between Elm variables and kernel variables. This is necessary for correct code generation, so these edits make that explicit.

commitda57d72dab42afd2739fcab65c0d0639ee529434 authorEvan Czaplicki <evancz@users.noreply.github.com> dateWed 13 Dec 2017, 15:20 (9 years ago) parent92b06de
1 file changed+100−14
src/AST/Optimized.hs+100−14
src/AST/Optimized.hs+100−14
@@ -3,12 +3,14 @@ module AST.Optimized
33 ( Def(..)
44 , Expr(..)
55 , Global(..)
6+ , kernel
67 , Decider(..)
78 , Choice(..)
89 , Graph(..)
910 , Main(..)
1011 , Node(..)
1112 , EffectsType(..)
13+ , KContent(..)
1214 , KChunk(..)
1315 )
1416 where
@@ -25,6 +27,7 @@ import qualified AST.Canonical as Can
2527import qualified AST.Module.Name as ModuleName
2628import qualified Data.Index as Index
2729import qualified Elm.Name as N
30+import qualified Elm.Package as Pkg
2831import qualified Optimize.DecisionTree as DT
2932import qualified Reporting.Region as R
3033
@@ -64,6 +67,13 @@ data Global = Global ModuleName.Canonical N.Name
6467 deriving (Eq, Ord)
6568
6669
70+-- Provide "List" not "Elm.Kernel.List"
71+--
72+kernel :: N.Name -> Global
73+kernel home =
74+ Global (ModuleName.Canonical Pkg.kernel home) N.dollar
75+
76+
6777
6878-- DEFINITIONS
6979
@@ -121,7 +131,7 @@ data Node
121131 | Link Global
122132 | Cycle [(N.Name, Expr)] (Set.Set Global)
123133 | Manager EffectsType
124− | Kernel [KChunk] (Set.Set Global) (Maybe ([KChunk], Set.Set Global))
134+ | Kernel KContent (Maybe KContent)
125135 | PortIncoming Expr (Set.Set Global)
126136 | PortOutgoing Expr (Set.Set Global)
127137
@@ -129,9 +139,14 @@ data Node
129139data EffectsType = Cmd | Sub | Fx
130140
131141
142+data KContent =
143+ KContent [KChunk] (Set.Set Global)
144+
145+
132146data KChunk
133147 = JS BS.ByteString
134− | Var N.Name N.Name
148+ | ElmVar ModuleName.Canonical N.Name
149+ | JsVar N.Name N.Name
135150 | ElmField N.Name
136151 | JsField Int
137152 | Enum Int
@@ -250,25 +265,96 @@ instance Binary Choice where
250265 _ -> error "problem getting Opt.Choice binary"
251266
252267
268+
269+instance Binary Graph where
270+ get = liftM3 Graph get get get
271+ put (Graph a b c) = put a >> put b >> put c
272+
273+
274+instance Binary Main where
275+ put main =
276+ case main of
277+ Static -> putWord8 0
278+ Dynamic a -> putWord8 1 >> put a
279+
280+ get =
281+ do word <- getWord8
282+ case word of
283+ 0 -> return Static
284+ 1 -> liftM Dynamic get
285+ _ -> error "problem getting Opt.Main binary"
286+
287+
288+instance Binary Node where
289+ put node =
290+ case node of
291+ Define a b -> putWord8 0 >> put a >> put b
292+ DefineTailFunc a b c -> putWord8 1 >> put a >> put b >> put c
293+ Ctor a b c -> putWord8 2 >> put a >> put b >> put c
294+ Link a -> putWord8 3 >> put a
295+ Cycle a b -> putWord8 4 >> put a >> put b
296+ Manager a -> putWord8 5 >> put a
297+ Kernel a b -> putWord8 6 >> put a >> put b
298+ PortIncoming a b -> putWord8 7 >> put a >> put b
299+ PortOutgoing a b -> putWord8 8 >> put a >> put b
300+
301+ get =
302+ do word <- getWord8
303+ case word of
304+ 0 -> liftM2 Define get get
305+ 1 -> liftM3 DefineTailFunc get get get
306+ 2 -> liftM3 Ctor get get get
307+ 3 -> liftM Link get
308+ 4 -> liftM2 Cycle get get
309+ 5 -> liftM Manager get
310+ 6 -> liftM2 Kernel get get
311+ 7 -> liftM2 PortIncoming get get
312+ 8 -> liftM2 PortOutgoing get get
313+ _ -> error "problem getting Opt.Node binary"
314+
315+
316+instance Binary EffectsType where
317+ put effectsType =
318+ case effectsType of
319+ Cmd -> putWord8 0
320+ Sub -> putWord8 1
321+ Fx -> putWord8 2
322+
323+ get =
324+ do word <- getWord8
325+ case word of
326+ 0 -> return Cmd
327+ 1 -> return Sub
328+ 2 -> return Fx
329+ _ -> error "problem getting Opt.EffectsType binary"
330+
331+
332+instance Binary KContent where
333+ get = liftM2 KContent get get
334+ put (KContent a b) = put a >> put b
335+
336+
253337instance Binary KChunk where
254338 put chunk =
255339 case chunk of
256340 JS a -> putWord8 0 >> put a
257− Var a b -> putWord8 1 >> put a >> put b
258− ElmField a -> putWord8 2 >> put a
259− JsField a -> putWord8 3 >> put a
260− Enum a -> putWord8 4 >> put a
261− Debug -> putWord8 5
262− Prod -> putWord8 6
341+ ElmVar a b -> putWord8 1 >> put a >> put b
342+ JsVar a b -> putWord8 2 >> put a >> put b
343+ ElmField a -> putWord8 3 >> put a
344+ JsField a -> putWord8 4 >> put a
345+ Enum a -> putWord8 5 >> put a
346+ Debug -> putWord8 6
347+ Prod -> putWord8 7
263348
264349 get =
265350 do word <- getWord8
266351 case word of
267352 0 -> liftM JS get
268− 1 -> liftM2 Var get get
269− 2 -> liftM ElmField get
270− 3 -> liftM JsField get
271− 4 -> liftM Enum get
272− 5 -> return Debug
273− 6 -> return Prod
353+ 1 -> liftM2 ElmVar get get
354+ 2 -> liftM2 JsVar get get
355+ 3 -> liftM ElmField get
356+ 4 -> liftM JsField get
357+ 5 -> liftM Enum get
358+ 6 -> return Debug
359+ 7 -> return Prod
274360 _ -> error "problem deserializing AST.Optimized.KChunk"