private void UpdateAtomicCompositionQueryForPartEquals(
            AtomicComposition atomicComposition,
            ComposablePartDefinition part,
            AtomicCompositionQueryState state)
        {
            PartQueryStateNode previousNode = GetPartQueryStateNode(atomicComposition);

            atomicComposition.SetValue(this, new PartEqualsQueryStateNode(part, previousNode, state));
        }
        private void UpdateAtomicCompositionQueryForPartInHashSet(
            AtomicComposition atomicComposition,
            HashSet <ComposablePartDefinition> hashset,
            AtomicCompositionQueryState state)
        {
            PartQueryStateNode previousNode = GetPartQueryStateNode(atomicComposition);

            atomicComposition.SetValue(this, new PartInHashSetQueryStateNode(hashset, previousNode, state));
        }
        private bool IsRejected(ComposablePartDefinition definition, AtomicComposition?atomicComposition)
        {
            // Check to see if we're currently working on the definition in question.
            // Recursive queries always answer optimistically, as if the definition hasn't
            // been rejected - because if it is we can discard all decisions that were based
            // on the faulty assumption in the first place.
            var forceRejectionTest = false;

            if (atomicComposition != null)
            {
                AtomicCompositionQueryState state = QueryPartState(atomicComposition, definition);
                switch (state)
                {
                case AtomicCompositionQueryState.TreatAsRejected:
                    return(true);

                case AtomicCompositionQueryState.TreatAsValidated:
                    return(false);

                case AtomicCompositionQueryState.NeedsTesting:
                    forceRejectionTest = true;
                    break;

                default:
                    if (state != AtomicCompositionQueryState.Unknown)
                    {
                        throw new Exception(SR.Diagnostic_InternalExceptionMessage);
                    }
                    // Need to do the work to determine the state
                    break;
                }
            }

            if (!forceRejectionTest)
            {
                // Next, anything that has been activated is not rejected
                using (_lock.LockStateForRead())
                {
                    if (_activatedParts.ContainsKey(definition))
                    {
                        return(false);
                    }

                    // Last stop before doing the hard work: check a specific registry of rejected parts
                    if (_rejectedParts.Contains(definition))
                    {
                        return(true);
                    }
                }
            }

            // Determine whether or not the definition's imports can be satisfied
            return(DetermineRejection(definition, atomicComposition));
        }
        private void UpdateAtomicCompositionQuery(
            AtomicComposition atomicComposition,
            Func <ComposablePartDefinition, bool> query,
            AtomicCompositionQueryState state)
        {
            var parentQuery = GetAtomicCompositionQuery(atomicComposition);
            Func <ComposablePartDefinition, AtomicCompositionQueryState> newQuery = definition =>
            {
                if (query(definition))
                {
                    return(state);
                }
                return(parentQuery(definition));
            };

            atomicComposition.SetValue(this, newQuery);
        }
        private void UpdateAtomicCompositionQuery(
            AtomicComposition atomicComposition,
            Func <ComposablePartDefinition, bool> query,
            AtomicCompositionQueryState state)
        {
            var parentQuery = GetAtomicCompositionQuery(atomicComposition);
            Func <ComposablePartDefinition, AtomicCompositionQueryState> newQuery = definition =>
            {
                if (query(definition))
                {
                    if (state == AtomicCompositionQueryState.TreatAsValidated)
                    {
                        // Graph is in a cycle
                        atomicComposition.CompositionInCycle = true;
                    }
                    return(state);
                }
                return(parentQuery(definition));
            };

            atomicComposition.SetValue(this, newQuery);
        }
 protected PartQueryStateNode(PartQueryStateNode previousNode, AtomicCompositionQueryState state)
 {
     _previousNode = previousNode;
     _state        = state;
 }
 public PartInHashSetQueryStateNode(HashSet <ComposablePartDefinition> parts, PartQueryStateNode previousNode, AtomicCompositionQueryState state) :
     base(previousNode, state)
 {
     _parts = parts;
 }
 public PartEqualsQueryStateNode(ComposablePartDefinition part, PartQueryStateNode previousNode, AtomicCompositionQueryState state) :
     base(previousNode, state)
 {
     _part     = part;
     _hashCode = part.GetHashCode();
 }