示例#1
0
        // 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);
                    }
                }
            }
        }
示例#2
0
        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);
                        }
                    }
                }
            }
        }