@@ -12,7 +12,7 @@ public IGraph<DependencyNode, Dependency> Rewrite(
1212 IGraph < DependencyNode , Dependency > graph ,
1313 ref int bindingId )
1414 {
15- var entries = new List < GraphEntry < DependencyNode , Dependency > > ( graph . Entries . Count ) ;
15+ var entries = new Dictionary < DependencyNode , IReadOnlyCollection < Dependency > > ( graph . Entries . Count ) ;
1616 var processed = new Dictionary < int , DependencyNode > ( graph . Entries . Count ) ;
1717 foreach ( var rootNode in from node in graph . Vertices where node . Root is not null select node )
1818 {
@@ -39,28 +39,31 @@ public IGraph<DependencyNode, Dependency> Rewrite(
3939 return graph ;
4040 }
4141
42- var entriesMap = entries . ToDictionary ( i => i . Target , i => i . Edges ) ;
43- foreach ( var entry in graph . Entries . Where ( i => ! entriesMap . ContainsKey ( i . Target ) ) )
42+ foreach ( var graphEntry in graph . Entries )
4443 {
45- entriesMap . Add ( entry . Target , entry . Edges ) ;
44+ if ( entries . ContainsKey ( graphEntry . Target ) )
45+ {
46+ continue ;
47+ }
48+
49+ entries [ graphEntry . Target ] = graphEntry . Edges ;
4650 }
4751
48- return new Graph < DependencyNode , Dependency > (
49- entriesMap . Select ( i => new GraphEntry < DependencyNode , Dependency > ( i . Key , i . Value ) ) ) ;
52+ return new Graph < DependencyNode , Dependency > ( entries . Select ( i => new GraphEntry < DependencyNode , Dependency > ( i . Key , i . Value ) ) ) ;
5053 }
5154
5255 private DependencyNode Override (
53- IDictionary < int , DependencyNode > processed ,
54- IReadOnlyDictionary < Injection , DependencyNode > nodes ,
55- IReadOnlyDictionary < Injection , DependencyNode > localOverrides ,
56+ Dictionary < int , DependencyNode > processed ,
57+ Dictionary < Injection , DependencyNode > nodes ,
58+ Dictionary < Injection , DependencyNode > localOverrides ,
5659 bool consumeLocalOverrides ,
57- IReadOnlyDictionary < int , DpOverride > overrides ,
60+ Dictionary < int , DpOverride > overrides ,
5861 MdSetup setup ,
5962 IGraph < DependencyNode , Dependency > graph ,
6063 DependencyNode rootNode ,
6164 DependencyNode targetNode ,
6265 ref int maxId ,
63- List < GraphEntry < DependencyNode , Dependency > > entries )
66+ Dictionary < DependencyNode , IReadOnlyCollection < Dependency > > entries )
6467 {
6568 if ( ! graph . TryGetInEdges ( targetNode , out var dependencies ) )
6669 {
@@ -73,15 +76,16 @@ private DependencyNode Override(
7376 nodes ,
7477 localOverrides ,
7578 overrides ) ;
79+
7680 if ( branchProcessed . TryGetValue ( targetNode . Binding . Id , out var node ) )
7781 {
7882 return node ;
7983 }
8084
81- var nodesMap = nodes . ToDictionary ( ) ;
85+ var nodesMap = new Dictionary < Injection , DependencyNode > ( nodes ) ;
8286 var localNodesMap = CreateLocalNodesMap ( nodesMap , localOverrides , consumeLocalOverrides ) ;
8387
84- var overridesMap = overrides . ToDictionary ( ) ;
88+ var overridesMap = new Dictionary < int , DpOverride > ( overrides ) ;
8589 IEnumerable < ImmutableArray < DpOverride > > overridesEnumerable ;
8690 if ( targetNode . Factory is { } factory )
8791 {
@@ -178,7 +182,7 @@ private DependencyNode Override(
178182 var currentDependency = dependency with { Target = targetNode } ;
179183 if ( ! localNodesMap . TryGetValue ( currentDependency . Injection , out var overridingSourceNode ) )
180184 {
181- var sourceOverrides = overridesMap . ToDictionary ( ) ;
185+ var sourceOverrides = new Dictionary < int , DpOverride > ( overridesMap ) ;
182186 var source = Override (
183187 branchProcessed ,
184188 nodesMap ,
@@ -206,17 +210,16 @@ private DependencyNode Override(
206210 newDependencies . Add ( currentDependency ) ;
207211 }
208212
209- UpsertEntry ( entries , targetNode , newDependencies ) ;
210-
213+ entries [ targetNode ] = newDependencies ;
211214 return targetNode ;
212215 }
213216
214- private static IDictionary < int , DependencyNode > CreateBranchProcessedCache (
215- IDictionary < int , DependencyNode > processed ,
217+ private static Dictionary < int , DependencyNode > CreateBranchProcessedCache (
218+ Dictionary < int , DependencyNode > processed ,
216219 bool consumeLocalOverrides ,
217- IReadOnlyDictionary < Injection , DependencyNode > nodes ,
218- IReadOnlyDictionary < Injection , DependencyNode > localOverrides ,
219- IReadOnlyDictionary < int , DpOverride > overrides )
220+ Dictionary < Injection , DependencyNode > nodes ,
221+ Dictionary < Injection , DependencyNode > localOverrides ,
222+ Dictionary < int , DpOverride > overrides )
220223 {
221224 // Rewritten nodes are context-dependent when any override scope is active.
222225 // In such cases we isolate memoization to the current branch to avoid
@@ -230,11 +233,11 @@ private static IDictionary<int, DependencyNode> CreateBranchProcessedCache(
230233 }
231234
232235 private static Dictionary < Injection , DependencyNode > CreateLocalNodesMap (
233- IReadOnlyDictionary < Injection , DependencyNode > nodes ,
234- IReadOnlyDictionary < Injection , DependencyNode > localOverrides ,
236+ Dictionary < Injection , DependencyNode > nodes ,
237+ Dictionary < Injection , DependencyNode > localOverrides ,
235238 bool consumeLocalOverrides )
236239 {
237- var localNodesMap = nodes . ToDictionary ( ) ;
240+ var localNodesMap = new Dictionary < Injection , DependencyNode > ( nodes ) ;
238241 if ( ! consumeLocalOverrides || localOverrides . Count <= 0 )
239242 {
240243 return localNodesMap ;
@@ -247,27 +250,4 @@ private static Dictionary<Injection, DependencyNode> CreateLocalNodesMap(
247250
248251 return localNodesMap ;
249252 }
250-
251- private static void UpsertEntry (
252- ICollection < GraphEntry < DependencyNode , Dependency > > entries ,
253- DependencyNode targetNode ,
254- IReadOnlyCollection < Dependency > newDependencies )
255- {
256- var entry = new GraphEntry < DependencyNode , Dependency > ( targetNode , newDependencies ) ;
257- if ( entries is not List < GraphEntry < DependencyNode , Dependency > > list )
258- {
259- entries . Add ( entry ) ;
260- return ;
261- }
262-
263- var entryIndex = list . FindIndex ( i => Equals ( i . Target , targetNode ) ) ;
264- if ( entryIndex >= 0 )
265- {
266- list [ entryIndex ] = entry ;
267- }
268- else
269- {
270- list . Add ( entry ) ;
271- }
272- }
273253}
0 commit comments