on master help sign in
Move kernel chunks into AST.Optimized

It now lives in the object graph nodes, so it makes sense to have all the details in one place.

commit579464eec33f56215f12d839446a7528d75bbf8f authorEvan Czaplicki <evancz@users.noreply.github.com> dateWed 6 Dec 2017, 16:59 (9 years ago) parent84e60f0
3 files changed+53−110
src/AST/Optimized.hs+42−5 src/AST/Utils/Kernel.hs−94 src/Parse/Kernel.hs+11−11
src/AST/Optimized.hs+42−5
@@ -9,12 +9,14 @@ module AST.Optimized
99 , Main(..)
1010 , Node(..)
1111 , EffectsType(..)
12+ , KChunk(..)
1213 )
1314 where
1415
1516
1617import Control.Monad (liftM, liftM2, liftM3, liftM4)
1718import Data.Binary
19+import qualified Data.ByteString as BS
1820import qualified Data.Map as Map
1921import qualified Data.Set as Set
2022import Data.Text (Text)
@@ -113,19 +115,30 @@ data Main
113115
114116
115117data Node
116− = Define Expr (Set.Set N.Name) (Set.Set Global)
117− | DefineTailFunc [N.Name] Expr (Set.Set N.Name) (Set.Set Global)
118+ = Define Expr (Set.Set Global)
119+ | DefineTailFunc [N.Name] Expr (Set.Set Global)
118120 | Ctor N.Name Index.ZeroBased Int
119121 | Link Global
120− | Cycle [(N.Name, Expr)] (Set.Set N.Name) (Set.Set Global)
121− | PortIncoming Expr (Set.Set N.Name) (Set.Set Global)
122− | PortOutgoing Expr (Set.Set N.Name) (Set.Set Global)
122+ | Cycle [(N.Name, Expr)] (Set.Set Global)
123123 | Manager EffectsType
124+ | Kernel [KChunk] (Set.Set Global) (Maybe ([KChunk], Set.Set Global))
125+ | PortIncoming Expr (Set.Set Global)
126+ | PortOutgoing Expr (Set.Set Global)
124127
125128
126129data EffectsType = Cmd | Sub | Fx
127130
128131
132+data KChunk
133+ = JS BS.ByteString
134+ | Var N.Name N.Name
135+ | ElmField N.Name
136+ | JsField Int
137+ | Enum Int
138+ | Debug
139+ | Prod
140+
141+
129142
130143-- BINARY
131144
@@ -235,3 +248,27 @@ instance Binary Choice where
235248 0 -> liftM Inline get
236249 1 -> liftM Jump get
237250 _ -> error "problem getting Opt.Choice binary"
251+
252+
253+instance Binary KChunk where
254+ put chunk =
255+ case chunk of
256+ 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
263+
264+ get =
265+ do word <- getWord8
266+ case word of
267+ 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
274+ _ -> error "problem deserializing AST.Optimized.KChunk"
src/AST/Utils/Kernel.hsdeleted−94
@@ -1,94 +0,0 @@
1−{-# OPTIONS_GHC -Wall #-}
2−module AST.Utils.Kernel
3− ( Data(..)
4− , Content(..)
5− , Chunk(..)
6− )
7− where
8−
9−
10−import Control.Monad (liftM, liftM2)
11−import Data.Binary
12−import qualified Data.ByteString as BS
13−
14−import qualified Elm.Name as N
15−
16−
17−
18−-- DATA
19−
20−
21−data Data =
22− Data
23− { _client :: Content
24− , _server :: Maybe Content
25− }
26−
27−
28−
29−-- CONTENT
30−
31−
32−data Content =
33− Content
34− { _imports :: [(N.Name, N.Name)]
35− , _chunks :: [Chunk]
36− }
37−
38−
39−
40−-- CHUNKS
41−
42−
43−data Chunk
44− = JS BS.ByteString
45− | Var N.Name N.Name
46− | ElmField N.Name
47− | JsField Int
48− | Enum Int
49− | Debug
50− | Prod
51−
52−
53−
54−-- BINARY
55−
56−
57−instance Binary Data where
58− put (Data a b) =
59− put a >> put b
60−
61− get =
62− liftM2 Data get get
63−
64−
65−instance Binary Content where
66− put (Content a b) =
67− put a >> put b
68−
69− get =
70− liftM2 Content get get
71−
72−
73−instance Binary Chunk where
74− put chunk =
75− case chunk of
76− JS a -> putWord8 0 >> put a
77− Var a b -> putWord8 1 >> put a >> put b
78− ElmField a -> putWord8 2 >> put a
79− JsField a -> putWord8 3 >> put a
80− Enum a -> putWord8 4 >> put a
81− Debug -> putWord8 5
82− Prod -> putWord8 6
83−
84− get =
85− do word <- getWord8
86− case word of
87− 0 -> liftM JS get
88− 1 -> liftM2 Var get get
89− 2 -> liftM ElmField get
90− 3 -> liftM JsField get
91− 4 -> liftM Enum get
92− 5 -> return Debug
93− 6 -> return Prod
94− _ -> error "problem deserializing Parse.Kernel.Chunk"
src/Parse/Kernel.hs+11−11
@@ -12,8 +12,8 @@ import Data.Text (Text)
1212import qualified Data.Text as Text
1313import Data.Word (Word8)
1414
15+import qualified AST.Optimized as Opt
1516import qualified AST.Source as Src
16−import qualified AST.Utils.Kernel as Kernel
1717import qualified AST.Module.Name as ModuleName
1818import qualified Elm.Name as N
1919import Parse.Primitives (Parser)
@@ -27,7 +27,7 @@ import qualified Reporting.Annotation as A
2727-- PARSER
2828
2929
30−parser :: Parser Kernel.Content
30+parser :: Parser ( [(N.Name, N.Name)], [Opt.KChunk] )
3131parser =
3232 do Symbol.jsMultiCommentOpen
3333 Module.freshLine
@@ -35,25 +35,25 @@ parser =
3535 Symbol.jsMultiCommentClose
3636 let imports = Map.unions (map destructImport srcImports)
3737 chunks <- parserHelp imports Map.empty Map.empty []
38− return (Kernel.Content (Map.elems imports) chunks)
38+ return ( Map.elems imports, chunks )
3939
4040
41−parserHelp :: Imports -> Enums -> Fields -> [Kernel.Chunk] -> Parser [Kernel.Chunk]
41+parserHelp :: Imports -> Enums -> Fields -> [Opt.KChunk] -> Parser [Opt.KChunk]
4242parserHelp imports enums fields chunks =
4343 do (javascript, maybeTag) <- K.chunk
4444 case maybeTag of
4545 Nothing ->
46− return (Kernel.JS javascript : chunks)
46+ return (Opt.JS javascript : chunks)
4747
4848 Just tag ->
4949 case tag of
5050 K.Prod ->
5151 parserHelp imports enums fields $
52− Kernel.Prod : Kernel.JS javascript : chunks
52+ Opt.Prod : Opt.JS javascript : chunks
5353
5454 K.Debug ->
5555 parserHelp imports enums fields $
56− Kernel.Debug : Kernel.JS javascript : chunks
56+ Opt.Debug : Opt.JS javascript : chunks
5757
5858 K.Import var ->
5959 case Map.lookup var imports of
@@ -62,21 +62,21 @@ parserHelp imports enums fields chunks =
6262
6363 Just (home, name) ->
6464 parserHelp imports enums fields $
65− Kernel.Var home name : Kernel.JS javascript : chunks
65+ Opt.Var home name : Opt.JS javascript : chunks
6666
6767 K.Enum n var ->
6868 let (enum, newEnums) = lookupEnum n var enums in
6969 parserHelp imports newEnums fields $
70− Kernel.Enum enum : Kernel.JS javascript : chunks
70+ Opt.Enum enum : Opt.JS javascript : chunks
7171
7272 K.ElmField name ->
7373 parserHelp imports enums fields $
74− Kernel.ElmField name : Kernel.JS javascript : chunks
74+ Opt.ElmField name : Opt.JS javascript : chunks
7575
7676 K.JsField name ->
7777 let (field, newFields) = lookupField name fields in
7878 parserHelp imports enums newFields $
79− Kernel.JsField field : Kernel.JS javascript : chunks
79+ Opt.JsField field : Opt.JS javascript : chunks
8080
8181
8282