private static void SetupForProcessing(Activity activity, bool canBeExecuted, ref ChildActivity nextActivity, ref Stack <ChildActivity> activitiesRemaining) { if (!nextActivity.Equals(ChildActivity.Empty)) { if (activitiesRemaining == null) { activitiesRemaining = new Stack <ChildActivity>(); } activitiesRemaining.Push(nextActivity); } nextActivity = new ChildActivity(activity, canBeExecuted); }
private static void ProcessActivityTreeCore(ChildActivity currentActivity, ActivityCallStack parentChain, ProcessActivityTreeOptions options, ProcessActivityCallback callback, ref IList <ValidationError> validationErrors) { ChildActivity empty = ChildActivity.Empty; Stack <ChildActivity> activitiesRemaining = null; if (parentChain == null) { parentChain = new ActivityCallStack(); } if (options.OnlyVisitSingleLevel) { ProcessActivity(currentActivity, ref empty, ref activitiesRemaining, parentChain, ref validationErrors, options, callback); } else { while (!currentActivity.Equals(ChildActivity.Empty)) { if (object.ReferenceEquals(currentActivity.Activity, popActivity)) { parentChain.Pop().Activity.SetCached(); } else { SetupForProcessing(popActivity, true, ref empty, ref activitiesRemaining); ProcessActivity(currentActivity, ref empty, ref activitiesRemaining, parentChain, ref validationErrors, options, callback); parentChain.Push(currentActivity); } currentActivity = empty; if ((activitiesRemaining != null) && (activitiesRemaining.Count > 0)) { empty = activitiesRemaining.Pop(); } else { empty = ChildActivity.Empty; } } } }