// Remove a resolved dependency from the graph. // Enqueues all removed edges so that the ObjectWriter can process the dependents // (rerun converters, apply simple fixups, call EndInit on parent ojects, etc). public void ResolveDependenciesTo(object instance, string name) { // Remove any dependency on this instance NameFixupToken token = null; if (instance != null) { if (_dependenciesByChildObject.TryGetValue(instance, out token)) { _dependenciesByChildObject.Remove(instance); RemoveTokenByParent(token); _resolvedTokensPendingProcessing.Enqueue(token); } } // Remove any dependencies on this name, and return any tokens whose dependencies // have all been resolved. FrugalObjectList <NameFixupToken> nameDependencies; if (name != null && _dependenciesByName.TryGetValue(name, out nameDependencies)) { int i = 0; while (i < nameDependencies.Count) { token = nameDependencies[i]; // The same name can occur in multiple namescopes, so we need to make sure that // this named object is visible in the scope of the token. object resolvedName = token.ResolveName(name); if (instance != resolvedName) { i++; continue; } if (token.CanAssignDirectly) { // For simple fixups, we need to return the resolved object token.ReferencedObject = instance; } token.NeededNames.Remove(name); nameDependencies.RemoveAt(i); if (nameDependencies.Count == 0) { _dependenciesByName.Remove(name); } if (token.NeededNames.Count == 0) { RemoveTokenByParent(token); _resolvedTokensPendingProcessing.Enqueue(token); } } } }
public void ResolveDependenciesTo(object instance, string name) { NameFixupToken token = null; FrugalObjectList <NameFixupToken> list; if ((instance != null) && this._dependenciesByChildObject.TryGetValue(instance, out token)) { this._dependenciesByChildObject.Remove(instance); this.RemoveTokenByParent(token); this._resolvedTokensPendingProcessing.Enqueue(token); } if ((name != null) && this._dependenciesByName.TryGetValue(name, out list)) { int index = 0; while (index < list.Count) { token = list[index]; object obj2 = token.ResolveName(name); if (instance != obj2) { index++; } else { if (token.CanAssignDirectly) { token.ReferencedObject = instance; } token.NeededNames.Remove(name); list.RemoveAt(index); if (list.Count == 0) { this._dependenciesByName.Remove(name); } if (token.NeededNames.Count == 0) { this.RemoveTokenByParent(token); this._resolvedTokensPendingProcessing.Enqueue(token); } } } } }