on master help sign in
Merge Nitpick.TopLevelTypes into Optimize.Module
ba0b721Evan Czaplicki
elm-compiler.cabal−1
@@ -93,7 +93,6 @@ Library
93 Generate.JavaScript.Name,
93 Generate.JavaScript.Name,
94 Json.Decode.Internals,
94 Json.Decode.Internals,
95 Nitpick.PatternMatches,
95 Nitpick.PatternMatches,
96− Nitpick.TopLevelTypes,
97 Optimize.Case,
96 Optimize.Case,
98 Optimize.DecisionTree,
97 Optimize.DecisionTree,
99 Optimize.Expression,
98 Optimize.Expression,
src/AST/Optimized.hs+2−2
@@ -138,8 +138,8 @@ data Graph =
138data Main
138data Main
139 = Static
139 = Static
140 | Dynamic
140 | Dynamic
141− { _decoder :: Expr
142− , _message :: Can.Type
141+ { _message :: Can.Type
142+ , _decoder :: Expr
143 }
143 }
144
144
145
145
src/Compile.hs+3−6
@@ -19,7 +19,6 @@ import qualified Elm.Interface as I
19import qualified Elm.Name as N
19import qualified Elm.Name as N
20import qualified Elm.Package as Pkg
20import qualified Elm.Package as Pkg
21import qualified Nitpick.PatternMatches as PatternMatches
21import qualified Nitpick.PatternMatches as PatternMatches
22−import qualified Nitpick.TopLevelTypes as TopLevelTypes
23import qualified Optimize.Module as Optimize
22import qualified Optimize.Module as Optimize
24import qualified Parse.Parse as Parse
23import qualified Parse.Parse as Parse
25import qualified Reporting.Error as Error
24import qualified Reporting.Error as Error
@@ -63,13 +62,11 @@ compile flag pkg importDict interfaces source =
63 annotations <-
62 annotations <-
64 runTypeInference canonical
63 runTypeInference canonical
65
64
66− mains <- Result.mapError Error.Main $
67− TopLevelTypes.check annotations canonical
68−
69 () <-
65 () <-
70 exhaustivenessCheck canonical
66 exhaustivenessCheck canonical
71
67
68+ graph <- Result.mapError Error.Main $
72− let (Optimize.Graph fields graph) = Optimize.optimize canonical
69+ Optimize.optimize annotations canonical
73
70
74 documentation <-
71 documentation <-
75 genaretaDocs flag canonical
72 genaretaDocs flag canonical
@@ -77,7 +74,7 @@ compile flag pkg importDict interfaces source =
77 Result.ok $
74 Result.ok $
78 Artifacts
75 Artifacts
79 { _elmi = I.fromModule annotations canonical
76 { _elmi = I.fromModule annotations canonical
80− , _elmo = Opt.Graph mains graph fields
77+ , _elmo = graph
81 , _docs = documentation
78 , _docs = documentation
82 }
79 }
83
80
src/Generate/JavaScript/Expression.hs+1−1
@@ -1006,7 +1006,7 @@ generateMain mode interfaces home main =
1006 # JS.Int 0
1006 # JS.Int 0
1007 # JS.Int 0
1007 # JS.Int 0
1008
1008
1009− Opt.Dynamic decoder msgType ->
1009+ Opt.Dynamic msgType decoder ->
1010 JS.Ref (Name.fromGlobal home "main")
1010 JS.Ref (Name.fromGlobal home "main")
1011 # generateJsExpr mode decoder
1011 # generateJsExpr mode decoder
1012 # toDebugMetadata mode interfaces msgType
1012 # toDebugMetadata mode interfaces msgType
src/Nitpick/TopLevelTypes.hsdeleted−111
@@ -1,111 +0,0 @@
1−{-# OPTIONS_GHC -Wall #-}
2−{-# LANGUAGE OverloadedStrings #-}
3−module Nitpick.TopLevelTypes
4− ( check
5− )
6− where
7−
8−
9−import Control.Monad (foldM)
10−import qualified Data.Map as Map
11−import Data.Map ((!))
12−
13−import qualified AST.Canonical as Can
14−import qualified AST.Optimized as Opt
15−import qualified AST.Module.Name as ModuleName
16−import qualified AST.Utils.Type as Type
17−import qualified Canonicalize.Effects as Effects
18−import qualified Elm.Name as N
19−import qualified Optimize.Names as Names
20−import qualified Optimize.Port as Port
21−import qualified Reporting.Annotation as A
22−import qualified Reporting.Error.Main as Error
23−import qualified Reporting.Region as R
24−import qualified Reporting.Result as Result
25−import qualified Reporting.Warning as W
26−
27−
28−
29−-- CHECK TOP-LEVEL TYPES
30−
31−
32−type Result i w a =
33− Result.Result i w Error.Error a
34−
35−
36−type Annotations =
37− Map.Map N.Name Can.Annotation
38−
39−
40−type Mains =
41− Map.Map ModuleName.Canonical Opt.Main
42−
43−
44−check :: Annotations -> Can.Module -> Result i [W.Warning] Mains
45−check annotations (Can.Module home _ _ decls _ _ _ _) =
46− checkDecls home annotations decls Map.empty
47−
48−
49−checkDecls :: ModuleName.Canonical -> Annotations -> Can.Decls -> Mains -> Result i [W.Warning] Mains
50−checkDecls home annotations decls mains =
51− case decls of
52− Can.Declare def subDecls ->
53− checkDecls home annotations subDecls =<<
54− checkDef home annotations mains def
55−
56− Can.DeclareRec defs subDecls ->
57− checkDecls home annotations subDecls =<<
58− foldM (checkDef home annotations) mains defs
59−
60− Can.SaveTheEnvironment ->
61− Result.ok mains
62−
63−
64−
65−-- MISSING ANNOTATIONS
66−
67−
68−checkDef :: ModuleName.Canonical -> Annotations -> Mains -> Can.Def -> Result i [W.Warning] Mains
69−checkDef home annotations mains def =
70− case def of
71− Can.Def (A.At region name) _ _ ->
72− do let (Can.Forall _ annotation) = annotations ! name
73− Result.warn $ W.MissingTypeAnnotation region name annotation
74− checkMain region annotations home name mains
75−
76− Can.TypedDef (A.At region name) _ _ _ _ ->
77− checkMain region annotations home name mains
78−
79−
80−
81−-- CHECK MAIN TYPE
82−
83−
84−checkMain :: R.Region -> Annotations -> ModuleName.Canonical -> N.Name -> Mains -> Result i w Mains
85−checkMain region annotations home name mains =
86− if name == N.main then
87− do mainType <- checkMainType region (annotations ! name)
88− Result.ok $ Map.insert home mainType mains
89− else
90− Result.ok mains
91−
92−
93−checkMainType :: R.Region -> Can.Annotation -> Result i w Opt.Main
94−checkMainType region (Can.Forall _ tipe) =
95− case Type.deepDealias tipe of
96− Can.TType home name [_]
97− | home == ModuleName.virtualDom && name == N.node ->
98− Result.ok Opt.Static
99−
100− Can.TType home name [flags, message, _]
101− | home == ModuleName.platform && name == N.program ->
102− case Effects.checkPayload flags of
103− Left (subType, invalidPayload) ->
104− Result.throw (Error.BadFlags region subType invalidPayload)
105−
106− Right () ->
107− let (_, _, flagDecoder) = Names.run (Port.toFlagsDecoder flags) in
108− Result.ok (Opt.Dynamic flagDecoder message)
109−
110− _ ->
111− Result.throw (Error.BadType region tipe)
src/Optimize/Module.hs+169−101
@@ -1,8 +1,7 @@
1{-# OPTIONS_GHC -Wall #-}
1{-# OPTIONS_GHC -Wall #-}
2{-# LANGUAGE OverloadedStrings #-}
2{-# LANGUAGE OverloadedStrings #-}
3module Optimize.Module
3module Optimize.Module
4− ( Graph(..)
5− , optimize
4+ ( optimize
6 )
5 )
7 where
6 where
8
7
@@ -12,49 +11,56 @@ import Control.Monad (foldM)
12import qualified Data.List as List
11import qualified Data.List as List
13import qualified Data.Map as Map
12import qualified Data.Map as Map
14import qualified Data.Set as Set
13import qualified Data.Set as Set
14+import Data.Map ((!))
15
15
16import qualified AST.Canonical as Can
16import qualified AST.Canonical as Can
17import qualified AST.Optimized as Opt
17import qualified AST.Optimized as Opt
18import qualified AST.Module.Name as ModuleName
18import qualified AST.Module.Name as ModuleName
19+import qualified AST.Utils.Type as Type
20+import qualified Canonicalize.Effects as Effects
19import qualified Elm.Name as N
21import qualified Elm.Name as N
20import qualified Optimize.Expression as Expr
22import qualified Optimize.Expression as Expr
21import qualified Optimize.Names as Names
23import qualified Optimize.Names as Names
22import qualified Optimize.Port as Port
24import qualified Optimize.Port as Port
23import qualified Reporting.Annotation as A
25import qualified Reporting.Annotation as A
26+import qualified Reporting.Error.Main as E
27+import qualified Reporting.Region as R
28+import qualified Reporting.Result as Result
29+import qualified Reporting.Warning as W
24
30
25
31
26
32
27-- OPTIMIZE
33-- OPTIMIZE
28
34
29
35
30−data Graph =
36+type Result i w a =
31− Graph
37+ Result.Result i w E.Error a
32− { _fields :: Map.Map N.Name Int
33− , _nodes :: Nodes
34− }
35
38
36
39
37−type Nodes =
40+type Annotations =
38− Map.Map Opt.Global Opt.Node
41+ Map.Map N.Name Can.Annotation
39
42
40
43
41−optimize :: Can.Module -> Graph
44+optimize :: Annotations -> Can.Module -> Result i [W.Warning] Opt.Graph
42−optimize (Can.Module home _ _ decls unions aliases _ effects) =
45+optimize annotations (Can.Module home _ _ decls unions aliases _ effects) =
46+ addDecls home annotations decls $
43− addEffects home effects $
47+ addEffects home effects $
44− addUnions home unions $
48+ addUnions home unions $
45− addAliases home aliases $
49+ addAliases home aliases $
46− addDecls home decls $
47− Graph Map.empty Map.empty
50+ Opt.Graph Map.empty Map.empty Map.empty
48
51
49
52
50
53
51-- UNION
54-- UNION
52
55
53
56
57+type Nodes =
58+ Map.Map Opt.Global Opt.Node
59+
60+
54−addUnions :: ModuleName.Canonical -> Map.Map N.Name Can.Union -> Graph -> Graph
61+addUnions :: ModuleName.Canonical -> Map.Map N.Name Can.Union -> Opt.Graph -> Opt.Graph
55−addUnions home unions (Graph fields nodes) =
62+addUnions home unions (Opt.Graph mains nodes fields) =
56− Graph fields $
57− Map.foldr (addUnion home) nodes unions
63+ Opt.Graph mains (Map.foldr (addUnion home) nodes unions) fields
58
64
59
65
60addUnion :: ModuleName.Canonical -> Can.Union -> Nodes -> Nodes
66addUnion :: ModuleName.Canonical -> Can.Union -> Nodes -> Nodes
@@ -71,13 +77,13 @@ addCtorNode home nodes (Can.Ctor name index numArgs _) =
71-- ALIAS
77-- ALIAS
72
78
73
79
74−addAliases :: ModuleName.Canonical -> Map.Map N.Name Can.Alias -> Graph -> Graph
80+addAliases :: ModuleName.Canonical -> Map.Map N.Name Can.Alias -> Opt.Graph -> Opt.Graph
75addAliases home aliases graph =
81addAliases home aliases graph =
76 Map.foldrWithKey (addAlias home) graph aliases
82 Map.foldrWithKey (addAlias home) graph aliases
77
83
78
84
79−addAlias :: ModuleName.Canonical -> N.Name -> Can.Alias -> Graph -> Graph
85+addAlias :: ModuleName.Canonical -> N.Name -> Can.Alias -> Opt.Graph -> Opt.Graph
80−addAlias home name (Can.Alias _ _ maybeFields) graph@(Graph fieldCounts nodes) =
86+addAlias home name (Can.Alias _ _ maybeFields) graph@(Opt.Graph mains nodes fieldCounts) =
81 case maybeFields of
87 case maybeFields of
82 Nothing ->
88 Nothing ->
83 graph
89 graph
@@ -91,9 +97,10 @@ addAlias home name (Can.Alias _ _ maybeFields) graph@(Graph fieldCounts nodes) =
91 node =
97 node =
92 Opt.Define function Set.empty
98 Opt.Define function Set.empty
93 in
99 in
94− Graph
100+ Opt.Graph
95− (foldr addOne fieldCounts fields)
101+ mains
96 (Map.insert (Opt.Global home name) node nodes)
102 (Map.insert (Opt.Global home name) node nodes)
103+ (foldr addOne fieldCounts fields)
97
104
98
105
99toPair :: N.Name -> (N.Name, Opt.Expr)
106toPair :: N.Name -> (N.Name, Opt.Expr)
@@ -110,8 +117,8 @@ addOne name fields =
110-- ADD EFFECTS
117-- ADD EFFECTS
111
118
112
119
113−addEffects :: ModuleName.Canonical -> Can.Effects -> Graph -> Graph
120+addEffects :: ModuleName.Canonical -> Can.Effects -> Opt.Graph -> Opt.Graph
114−addEffects home effects graph@(Graph fields nodes) =
121+addEffects home effects graph@(Opt.Graph mains nodes fields) =
115 case effects of
122 case effects of
116 Can.NoEffects ->
123 Can.NoEffects ->
117 graph
124 graph
@@ -120,30 +127,30 @@ addEffects home effects graph@(Graph fields nodes) =
120 Map.foldrWithKey (addPort home) graph ports
127 Map.foldrWithKey (addPort home) graph ports
121
128
122 Can.Manager _ _ _ manager ->
129 Can.Manager _ _ _ manager ->
123− Graph fields $
124− let
130+ let
125− fx = Opt.Global home "$fx$"
131+ fx = Opt.Global home "$fx$"
126− cmd = Opt.Global home "command"
132+ cmd = Opt.Global home "command"
127− sub = Opt.Global home "subscription"
133+ sub = Opt.Global home "subscription"
128− link = Opt.Link fx
134+ link = Opt.Link fx
129− in
135+ newNodes =
130− case manager of
136+ case manager of
131− Can.Cmd _ ->
137+ Can.Cmd _ ->
132− Map.insert cmd link $
138+ Map.insert cmd link $
133− Map.insert fx (Opt.Manager Opt.Cmd) nodes
139+ Map.insert fx (Opt.Manager Opt.Cmd) nodes
134−
140+
135− Can.Sub _ ->
141+ Can.Sub _ ->
136− Map.insert sub link $
142+ Map.insert sub link $
137− Map.insert fx (Opt.Manager Opt.Sub) nodes
143+ Map.insert fx (Opt.Manager Opt.Sub) nodes
138−
144+
139− Can.Fx _ _ ->
145+ Can.Fx _ _ ->
140− Map.insert cmd link $
146+ Map.insert cmd link $
141− Map.insert sub link $
147+ Map.insert sub link $
142− Map.insert fx (Opt.Manager Opt.Fx) nodes
148+ Map.insert fx (Opt.Manager Opt.Fx) nodes
143−
149+ in
150+ Opt.Graph mains newNodes fields
144
151
145
152
146−addPort :: ModuleName.Canonical -> N.Name -> Can.Port -> Graph -> Graph
153+addPort :: ModuleName.Canonical -> N.Name -> Can.Port -> Opt.Graph -> Opt.Graph
147addPort home name port_ graph =
154addPort home name port_ graph =
148 case port_ of
155 case port_ of
149 Can.Incoming _ payloadType _ ->
156 Can.Incoming _ payloadType _ ->
@@ -162,86 +169,151 @@ addPort home name port_ graph =
162
169
163
170
164
171
172+-- HELPER
173+
174+
175+addToGraph :: Opt.Global -> Opt.Node -> Map.Map N.Name Int -> Opt.Graph -> Opt.Graph
176+addToGraph name node fields (Opt.Graph mains nodes fieldCounts) =
177+ Opt.Graph
178+ mains
179+ (Map.insert name node nodes)
180+ (Map.unionWith (+) fields fieldCounts)
181+
182+
183+
165-- ADD DECLS
184-- ADD DECLS
166
185
167
186
168−addDecls :: ModuleName.Canonical -> Can.Decls -> Graph -> Graph
187+addDecls :: ModuleName.Canonical -> Annotations -> Can.Decls -> Opt.Graph -> Result i [W.Warning] Opt.Graph
169−addDecls home decls graph =
188+addDecls home annotations decls graph =
170 case decls of
189 case decls of
171 Can.Declare def subDecls ->
190 Can.Declare def subDecls ->
172− addDecls home subDecls (addDef home def graph)
191+ addDecls home annotations subDecls =<< addDef home annotations def graph
173
192
174 Can.DeclareRec defs subDecls ->
193 Can.DeclareRec defs subDecls ->
194+ case findMain defs of
195+ Nothing ->
175− addDecls home subDecls (addRecDefs home defs graph)
196+ addDecls home annotations subDecls (addRecDefs home defs graph)
197+
198+ Just region ->
199+ Result.throw $ E.BadCycle region (map defToName defs)
176
200
177 Can.SaveTheEnvironment ->
201 Can.SaveTheEnvironment ->
178− graph
202+ Result.ok graph
203+
204+
205+findMain :: [Can.Def] -> Maybe R.Region
206+findMain defs =
207+ case defs of
208+ [] ->
209+ Nothing
210+
211+ def:rest ->
212+ case def of
213+ Can.Def (A.At region name) _ _ ->
214+ if name == N.main then Just region else findMain rest
215+
216+ Can.TypedDef (A.At region name) _ _ _ _ ->
217+ if name == N.main then Just region else findMain rest
218+
219+
220+defToName :: Can.Def -> N.Name
221+defToName def =
222+ case def of
223+ Can.Def (A.At _ name) _ _ -> name
224+ Can.TypedDef (A.At _ name) _ _ _ _ -> name
179
225
180
226
181
227
182-- ADD DEFS
228-- ADD DEFS
183
229
184
230
185−addDef :: ModuleName.Canonical -> Can.Def -> Graph -> Graph
231+addDef :: ModuleName.Canonical -> Annotations -> Can.Def -> Opt.Graph -> Result i [W.Warning] Opt.Graph
186−addDef home def graph =
232+addDef home annotations def graph =
187 case def of
233 case def of
188− Can.Def (A.At _ name) args body ->
234+ Can.Def (A.At region name) args body ->
235+ do let (Can.Forall _ tipe) = annotations ! name
236+ Result.warn $ W.MissingTypeAnnotation region name tipe
189− addDefHelp (Opt.Global home name) args body graph
237+ addDefHelp region annotations home name args body graph
190
238
191− Can.TypedDef (A.At _ name) _ typedArgs body _ ->
239+ Can.TypedDef (A.At region name) _ typedArgs body _ ->
192− addDefHelp (Opt.Global home name) (map fst typedArgs) body graph
240+ addDefHelp region annotations home name (map fst typedArgs) body graph
193
241
194
242
195−addDefHelp :: Opt.Global -> [Can.Pattern] -> Can.Expr -> Graph -> Graph
243+addDefHelp :: R.Region -> Annotations -> ModuleName.Canonical -> N.Name -> [Can.Pattern] -> Can.Expr -> Opt.Graph -> Result i w Opt.Graph
196−addDefHelp name args body graph =
244+addDefHelp region annotations home name args body graph@(Opt.Graph mains nodes fieldCounts) =
197− case args of
245+ if name /= N.main then
198− [] ->
246+ Result.ok (addDefNode home name args body Set.empty graph)
199− let
247+ else
200− (deps, fields, value) =
248+ let
201− Names.run (Expr.optimize Set.empty body)
249+ (Can.Forall _ tipe) = annotations ! name
202− in
203− addToGraph name (Opt.Define value deps) fields graph
204
250
205− _ ->
251+ addMain (deps, fields, main) =
252+ let
253+ newMains = Map.insert home main mains
254+ newFields = Map.unionWith (+) fields fieldCounts
255+ in
256+ addDefNode home name args body deps $
257+ Opt.Graph newMains nodes newFields
258+ in
259+ case Type.deepDealias tipe of
260+ Can.TType hm nm [_] | hm == ModuleName.virtualDom && nm == N.node ->
261+ Result.ok $ addMain $ Names.run $
262+ Names.registerKernel N.browser Opt.Static
263+
264+ Can.TType hm nm [flags, message, _] | hm == ModuleName.platform && nm == N.program ->
265+ case Effects.checkPayload flags of
266+ Right () ->
267+ Result.ok $ addMain $ Names.run $
268+ Opt.Dynamic message <$> Port.toFlagsDecoder flags
269+
270+ Left (subType, invalidPayload) ->
271+ Result.throw (E.BadFlags region subType invalidPayload)
272+
273+ _ ->
274+ Result.throw (E.BadType region tipe)
275+
276+
277+addDefNode :: ModuleName.Canonical -> N.Name -> [Can.Pattern] -> Can.Expr -> Set.Set Opt.Global -> Opt.Graph -> Opt.Graph
278+addDefNode home name args body mainDeps graph =
206− let
279+ let
207− (deps, fields, function) =
280+ (deps, fields, def) =
208− Names.run $
281+ Names.run $
282+ case args of
283+ [] ->
284+ Expr.optimize Set.empty body
285+
286+ _ ->
209 do (argNames, destructors) <- Expr.destructArgs args
287 do (argNames, destructors) <- Expr.destructArgs args
210 obody <- Expr.optimize Set.empty body
288 obody <- Expr.optimize Set.empty body
211 pure $ Opt.Function argNames $
289 pure $ Opt.Function argNames $
212 foldr Opt.Destruct obody destructors
290 foldr Opt.Destruct obody destructors
213− in
291+ in
214− addToGraph name (Opt.Define function deps) fields graph
292+ addToGraph (Opt.Global home name) (Opt.Define def (Set.union deps mainDeps)) fields graph
215
293
216
294
217−addToGraph :: Opt.Global -> Opt.Node -> Map.Map N.Name Int -> Graph -> Graph
218−addToGraph name node fields (Graph fieldCounts nodes) =
219− Graph
220− (Map.unionWith (+) fields fieldCounts)
221− (Map.insert name node nodes)
222
295
296+-- ADD RECURSIVE DEFS
223
297
224
298
225−-- ADD RECURSIVE DEFS
299+data State =
300+ State
301+ { _values :: [(N.Name, Opt.Expr)]
302+ , _graph :: Opt.Graph
303+ }
226
304
227
305
228−addRecDefs :: ModuleName.Canonical -> [Can.Def] -> Graph -> Graph
306+addRecDefs :: ModuleName.Canonical -> [Can.Def] -> Opt.Graph -> Opt.Graph
229addRecDefs home defs graph =
307addRecDefs home defs graph =
230 let
308 let
231− cycleValues =
232− foldr addValueName Set.empty defs
309+ cycleValues = foldr addValueName Set.empty defs
233−
234− dummyName =
235− Opt.Global home (N.toCompositeName cycleValues)
310+ dummyName = Opt.Global home (N.toCompositeName cycleValues)
236
311
237 (deps, fields, State cyclicValuePairs newGraph) =
312 (deps, fields, State cyclicValuePairs newGraph) =
238 Names.run $
313 Names.run $
239 foldM (addRecDef home dummyName cycleValues) (State [] graph) defs
314 foldM (addRecDef home dummyName cycleValues) (State [] graph) defs
240−
241− node =
242− Opt.Cycle cyclicValuePairs deps
243 in
315 in
244− addToGraph dummyName node fields newGraph
316+ addToGraph dummyName (Opt.Cycle cyclicValuePairs deps) fields newGraph
245
317
246
318
247addValueName :: Can.Def -> Set.Set N.Name -> Set.Set N.Name
319addValueName :: Can.Def -> Set.Set N.Name -> Set.Set N.Name
@@ -261,13 +333,6 @@ addValueName def valueNames =
261-- ADD RECURSIVE DEFS
333-- ADD RECURSIVE DEFS
262
334
263
335
264−data State =
265− State
266− { _values :: [(N.Name, Opt.Expr)]
267− , _graph :: Graph
268− }
269−
270−
271addRecDef :: ModuleName.Canonical -> Opt.Global -> Expr.Cycle -> State -> Can.Def -> Names.Tracker State
336addRecDef :: ModuleName.Canonical -> Opt.Global -> Expr.Cycle -> State -> Can.Def -> Names.Tracker State
272addRecDef home dummyName cycle state@(State values graph) def =
337addRecDef home dummyName cycle state@(State values graph) def =
273 case def of
338 case def of
@@ -294,11 +359,14 @@ addRecDef home dummyName cycle state@(State values graph) def =
294
359
295
360
296addRecValue :: ModuleName.Canonical -> Opt.Global -> Expr.Cycle -> N.Name -> Can.Expr -> State -> Names.Tracker State
361addRecValue :: ModuleName.Canonical -> Opt.Global -> Expr.Cycle -> N.Name -> Can.Expr -> State -> Names.Tracker State
297−addRecValue home dummyName cycle name body (State values (Graph fields nodes)) =
362+addRecValue home dummyName cycle name body (State values (Opt.Graph mains nodes fields)) =
298 do obody <- Expr.optimize cycle body
363 do obody <- Expr.optimize cycle body
364+
365+ let global = Opt.Global home name
366+ let node = Opt.Link dummyName
367+
299 pure $
368 pure $
300 State
369 State
301 { _values = (name, obody) : values
370 { _values = (name, obody) : values
302− , _graph = Graph fields $
371+ , _graph = Opt.Graph mains (Map.insert global node nodes) fields
303− Map.insert (Opt.Global home name) (Opt.Link dummyName) nodes
304 }
372 }