public PropertyAccess(PropertyChainNode baseNode, PropertyInfo property, bool isCrossReference)
 {
     this.baseNode    = baseNode;
     Property         = property;
     IsCrossReference = isCrossReference;
 }
 public override PropertyChainNode Rebase(PropertyChainNode newBase)
 {
     return(newBase);
 }
 public abstract PropertyChainNode Rebase(PropertyChainNode newBase);
        private void PropagatePropertyAccesses(LooselyLinkedListNode <PropertyChainNode>[] propertyAccessArray, LooselyLinkedListNode <PropertyChainNode> objectPropertyAccesses, ref LooselyLinkedListNode <PropertyChainNode> current, ref LooselyLinkedListNode <PropertyChainNode> currentGhost, PropertyChainNode access, int dependency)
        {
            LooselyLinkedListNode <PropertyChainNode> dependentParameters;

            if (dependency == ParameterDataflowAttribute.TargetObjectIndex)
            {
                dependentParameters = objectPropertyAccesses;
            }
            else
            {
                dependentParameters = propertyAccessArray[dependency];
            }
            if (dependentParameters == null)
            {
                return;
            }
            foreach (var p in dependentParameters.FromHere)
            {
                var rebased = access.Rebase(p);
                var newNode = new LooselyLinkedListNode <PropertyChainNode>(rebased);
                if (rebased != access)
                {
                    propertyAccesses.AddAfter(current, newNode);
                    current = newNode;
                }
                else
                {
                    propertyAccesses.AddAfter(currentGhost, newNode);
                    currentGhost = newNode;
                }
            }
        }
 public override PropertyChainNode Rebase(PropertyChainNode newBase)
 {
     return(new PropertyAccess(Base.Rebase(newBase), Property, IsCrossReference));
 }