//----------------------------------------------------------------------------- // Copyright (c) Microsoft Corporation. All rights reserved. //----------------------------------------------------------------------------- namespace System.Activities.XamlIntegration { using System; using System.Activities; using System.Activities.Expressions; using System.Collections.Generic; internal abstract class CompiledExpressionActivityVisitor { protected bool ForImplementation { get; private set; } public void Visit(Activity activity, bool forImplementation) { this.ForImplementation = forImplementation; bool exit; VisitRoot(activity, out exit); } void VisitCore(Activity activity, out bool exit) { if (activity is ITextExpression) { VisitITextExpression(activity, out exit); return; } // Look for variable scopes if (activity.RuntimeVariables != null && activity.RuntimeVariables.Count > 0) { VisitVariableScope(activity, out exit); if (exit) { return; } } else { Visit(activity, out exit); if (exit) { return; } } return; } protected virtual void Visit(Activity activity, out bool exit) { VisitArguments(activity, out exit); if (exit) { return; } VisitPublicActivities(activity, out exit); if (exit) { return; } } protected virtual void VisitRoot(Activity activity, out bool exit) { if (this.ForImplementation) { VisitRootImplementation(activity, out exit); if (exit) { return; } exit = false; } else { VisitRootPublic(activity, out exit); if (exit) { return; } exit = false; } } protected virtual void VisitRootImplementationArguments(Activity activity, out bool exit) { VisitArguments(activity, out exit, VisitRootImplementationArgument); if (exit) { return; } exit = false; } protected virtual void VisitRootImplementationArgument(RuntimeArgument runtimeArgument, out bool exit) { if (runtimeArgument.IsBound) { Activity expression = runtimeArgument.BoundArgument.Expression; if (expression != null) { VisitCore(expression, out exit); if (exit) { return; } } } exit = false; } protected virtual void VisitVariableScope(Activity activity, out bool exit) { // // Walk the contained variables' default expressions foreach (Variable v in activity.RuntimeVariables) { if (v.Default != null) { VisitCore(v.Default, out exit); if (exit) { return; } } } VisitVariableScopeArguments(activity, out exit); if (exit) { return; } VisitPublicActivities(activity, out exit); if (exit) { return; } exit = false; } protected virtual void VisitRootImplementationScope(Activity activity, out bool exit) { foreach (Variable v in activity.RuntimeVariables) { if (v.Default != null) { VisitCore(v.Default, out exit); if (exit) { return; } } } VisitImportedChildren(activity, out exit); if (exit) { return; } VisitImportedDelegates(activity, out exit); if (exit) { return; } } protected virtual void VisitITextExpression(Activity activity, out bool exit) { exit = false; } protected virtual void VisitChildren(Activity activity, out bool exit) { if (activity.Children != null) { for (int i = 0; i < activity.Children.Count; i++) { if (activity == activity.Children[i].Parent) { VisitCore(activity.Children[i], out exit); if (exit) { return; } } } } exit = false; } protected virtual void VisitImportedChildren(Activity activity, out bool exit) { if (activity.ImportedChildren != null) { for (int i = 0; i < activity.ImportedChildren.Count; i++) { VisitCore(activity.ImportedChildren[i], out exit); if (exit) { return; } } } exit = false; } protected virtual void VisitDelegates(Activity activity, out bool exit) { if (activity.Delegates != null) { foreach (ActivityDelegate activityDelegate in activity.Delegates) { if (activity == activityDelegate.Owner) { VisitDelegate(activityDelegate, out exit); if (exit) { return; } } } } exit = false; } protected virtual void VisitImportedDelegates(Activity activity, out bool exit) { if (activity.ImportedDelegates != null) { foreach (ActivityDelegate activityDelegate in activity.ImportedDelegates) { VisitDelegate(activityDelegate, out exit); if (exit) { return; } } } exit = false; } protected virtual void VisitDelegate(ActivityDelegate activityDelegate, out bool exit) { VisitDelegateArguments(activityDelegate, out exit); if (exit) { return; } if (activityDelegate.Handler != null) { VisitCore(activityDelegate.Handler, out exit); if (exit) { return; } } } protected virtual void VisitDelegateArguments(ActivityDelegate activityDelegate, out bool exit) { foreach (RuntimeDelegateArgument delegateArgument in activityDelegate.RuntimeDelegateArguments) { if (delegateArgument.BoundArgument != null) { VisitDelegateArgument(delegateArgument, out exit); if (exit) { return; } } } exit = false; } protected virtual void VisitDelegateArgument(RuntimeDelegateArgument delegateArgument, out bool exit) { // // Nothing further to walk into here, this is just a stub for implementors to override exit = false; } protected virtual void VisitVariableScopeArguments(Activity activity, out bool exit) { VisitArguments(activity, out exit, VisitVariableScopeArgument); if (exit) { return; } exit = false; } protected virtual void VisitVariableScopeArgument(RuntimeArgument runtimeArgument, out bool exit) { VisitArgument(runtimeArgument, out exit); if (exit) { return; } exit = false; } protected virtual void VisitArguments(Activity activity, out bool exit) { VisitArguments(activity, out exit, VisitArgument); if (exit) { return; } exit = false; } protected virtual void VisitArgument(RuntimeArgument runtimeArgument, out bool exit) { if (runtimeArgument.IsBound) { Activity expression = runtimeArgument.BoundArgument.Expression; if (expression != null) { VisitCore(expression, out exit); if (exit) { return; } } } exit = false; } void VisitRootPublic(Activity activity, out bool exit) { if (activity.RuntimeVariables != null && activity.RuntimeVariables.Count > 0) { VisitVariableScope(activity, out exit); if (exit) { return; } } else { VisitArguments(activity, out exit); if (exit) { return; } VisitPublicActivities(activity, out exit); if (exit) { return; } } } void VisitRootImplementation(Activity activity, out bool exit) { VisitRootImplementationArguments(activity, out exit); if (exit) { return; } VisitRootImplementationScope(activity, out exit); if (activity.ImplementationChildren != null) { for (int i = 0; i < activity.ImplementationChildren.Count; i++) { VisitCore(activity.ImplementationChildren[i], out exit); if (exit) { return; } } } exit = false; } void VisitPublicActivities(Activity activity, out bool exit) { VisitChildren(activity, out exit); if (exit) { return; } VisitDelegates(activity, out exit); if (exit) { return; } VisitImportedChildren(activity, out exit); if (exit) { return; } VisitImportedDelegates(activity, out exit); if (exit) { return; } } void VisitArguments(Activity activity, out bool exit, VisitArgumentDelegate visitArgument) { foreach (RuntimeArgument runtimeArgument in activity.RuntimeArguments) { visitArgument(runtimeArgument, out exit); if (exit) { return; } } exit = false; } delegate void VisitArgumentDelegate(RuntimeArgument runtimeArgument, out bool exit); } }