public PrivateIdSpaceMatcher(DynamicUpdateMapBuilder.NestedIdSpaceFinalizer nestedFinalizer, IdSpace originalPrivateIdSpace, IdSpace updatedPrivateIdSpace) { this.privateMap = new DynamicUpdateMap() { IsForImplementation = true, NewDefinitionMemberCount = updatedPrivateIdSpace.MemberCount }; this.nestedFinalizer = nestedFinalizer; this.argumentChangeDetected = false; this.originalPrivateIdSpace = originalPrivateIdSpace; this.updatedPrivateIdSpace = updatedPrivateIdSpace; this.matchedActivities = new Queue <Tuple <Activity, Activity> >(); }
public static bool HasPrivateMemberOtherThanArgumentsChanged(DynamicUpdateMapBuilder.NestedIdSpaceFinalizer nestedFinalizer, Activity currentElement, Activity originalElement, bool isMemberOfUpdatedIdSpace, out DynamicUpdateMap argumentChangesMap) { Fx.Assert(currentElement != null && originalElement != null, "Both activities must be non-null."); argumentChangesMap = null; IdSpace currentPrivateIdSpace = currentElement.ParentOf; IdSpace originalPrivateIdSpace = originalElement.ParentOf; // for the implementation of an activity in the IdSpace being updated--but not anywhere deeper // in the tree--we allow adding, removing or rearranging named private variables. // We don't support matching unnamed private variables, and we don't support declaring new // default variable expressions. (That would would offset the private IdSpace, which will be caught by the subsquent checks.) if ((!isMemberOfUpdatedIdSpace || IsAnyNameless(currentElement.ImplementationVariables) || IsAnyNameless(originalElement.ImplementationVariables)) && !ListEquals(currentElement.ImplementationVariables, originalElement.ImplementationVariables, CompareVariableEquality)) { return(true); } if (currentPrivateIdSpace == null && originalPrivateIdSpace == null) { return(false); } else if ((currentPrivateIdSpace != null && originalPrivateIdSpace == null) || (currentPrivateIdSpace == null && originalPrivateIdSpace != null)) { return(true); } if (!ListEquals <ActivityDelegate>(currentElement.ImplementationDelegates, originalElement.ImplementationDelegates, CompareDelegateEquality)) { return(true); } // compare structural equality of members in the private IdSpaces PrivateIdSpaceMatcher privateIdSpaceMatcher = new PrivateIdSpaceMatcher(nestedFinalizer, originalPrivateIdSpace, currentPrivateIdSpace); return(!privateIdSpaceMatcher.Match(out argumentChangesMap)); }