private ICompiledExpressionRoot GetCompiledExpressionRoot() { if (this.rootInstance != null && this.rootInstance.Activity != null) { ICompiledExpressionRoot compiledExpressionRoot; Activity rootActivity = this.rootInstance.Activity; if (QualifiedId.TryGetElementFromRoot(rootActivity, this.compiledRootActivityQualifiedId, out Activity compiledRootActivity) && QualifiedId.TryGetElementFromRoot(rootActivity, this.expressionActivityQualifiedId, out Activity expressionActivity)) { if (CompiledExpressionInvoker.TryGetCompiledExpressionRoot(expressionActivity, compiledRootActivity, out compiledExpressionRoot)) { // // Revalidate to make sure we didn't hit an ID shift if (compiledExpressionRoot.CanExecuteExpression(this.expressionText, true /* this is always a reference */, this.locationReferences, out this.expressionId)) { return(compiledExpressionRoot); } } } // // We were valid when this location was generated so an ID shift occurred (likely due to a dynamic update) // Need to search all of the ICERs for one that can execute this expression. if (FindCompiledExpressionRoot(rootActivity, out compiledExpressionRoot)) { return(compiledExpressionRoot); } } throw FxTrace.Exception.AsError(new InvalidOperationException(SR.UnableToLocateCompiledLocationContext(this.expressionText))); }
public void LoadActivityTree(Activity rootActivity, System.Activities.ActivityInstance rootInstance, List <System.Activities.ActivityInstance> secondaryRootInstances, ActivityExecutor executor) { this.instanceMapping = new Dictionary <Activity, InstanceList>(this.rawDeserializedLists.Length); for (int i = 0; i < this.rawDeserializedLists.Length; i++) { Activity activity; InstanceList list = this.rawDeserializedLists[i]; if (!QualifiedId.TryGetElementFromRoot(rootActivity, list.ActivityId, out activity)) { throw FxTrace.Exception.AsError(new InvalidOperationException(System.Activities.SR.ActivityInstanceFixupFailed)); } this.instanceMapping.Add(activity, list); list.Load(activity, this); } this.rawDeserializedLists = null; Func <System.Activities.ActivityInstance, ActivityExecutor, bool> callback = new Func <System.Activities.ActivityInstance, ActivityExecutor, bool>(this.OnActivityInstanceLoaded); rootInstance.FixupInstance(null, this, executor); ActivityUtilities.ProcessActivityInstanceTree(rootInstance, executor, callback); if (secondaryRootInstances != null) { foreach (System.Activities.ActivityInstance instance in secondaryRootInstances) { instance.FixupInstance(null, this, executor); ActivityUtilities.ProcessActivityInstanceTree(instance, executor, callback); } } }
public void LoadActivityTree( Activity rootActivity, ActivityInstance?rootInstance, List <ActivityInstance> secondaryRootInstances, ActivityExecutor executor) { Fx.Assert(this.rawDeserializedLists != null, "We should always have deserialized some lists."); if (this.rawDeserializedLists == null) { throw new NullReferenceException("We should always have deserialized some lists."); } this.instanceMapping = new Dictionary <Activity, InstanceList>(this.rawDeserializedLists?.Length ?? 0); for (var i = 0; i < this.rawDeserializedLists.Length; i++) { var list = this.rawDeserializedLists[i]; if (!QualifiedId.TryGetElementFromRoot(rootActivity, list.ActivityId, out var activity)) { throw FxTrace.Exception.AsError(new InvalidOperationException(SR.ActivityInstanceFixupFailed)); } this.instanceMapping.Add(activity, list); list.Load(activity, this); } // We need to null this out once we've recreated the dictionary to avoid having out of // sync data this.rawDeserializedLists = null; // then walk our instance list, fixup parent references, and perform basic validation var processInstanceCallback = new Func <ActivityInstance, ActivityExecutor, bool>(OnActivityInstanceLoaded); rootInstance.FixupInstance(null, this, executor); ActivityUtilities.ProcessActivityInstanceTree(rootInstance, executor, processInstanceCallback); if (secondaryRootInstances != null) { foreach (var instance in secondaryRootInstances) { instance.FixupInstance(null, this, executor); ActivityUtilities.ProcessActivityInstanceTree(instance, executor, processInstanceCallback); } } }
// For most of the time, we need source location for object that appear on XAML. // During debugging, however, we must not transform the internal activity to their origin to make sure it stop when the internal activity is about the execute // Therefore, in debugger scenario, translateInternalActivityToOrigin will be set to false. internal static Dictionary <object, SourceLocation> GetSourceLocations(Activity rootActivity, WorkflowSymbol symbol, bool translateInternalActivityToOrigin) { Activity workflowRoot = rootActivity.RootActivity ?? rootActivity; if (!workflowRoot.IsMetadataFullyCached) { IList <ValidationError> validationErrors = null; ActivityUtilities.CacheRootMetadata(workflowRoot, new ActivityLocationReferenceEnvironment(), ProcessActivityTreeOptions.ValidationOptions, null, ref validationErrors); } Dictionary <object, SourceLocation> newMapping = new Dictionary <object, SourceLocation>(); // Make sure the qid we are using to TryGetElementFromRoot // are shifted appropriately such that the first digit that QID is // the same as the last digit of the rootActivity.QualifiedId. int[] rootIdArray = rootActivity.QualifiedId.AsIDArray(); int idOffset = rootIdArray[rootIdArray.Length - 1] - 1; foreach (ActivitySymbol actSym in symbol.Symbols) { QualifiedId qid = new QualifiedId(actSym.QualifiedId); if (idOffset != 0) { int[] idArray = qid.AsIDArray(); idArray[0] += idOffset; qid = new QualifiedId(idArray); } Activity activity; if (QualifiedId.TryGetElementFromRoot(rootActivity, qid, out activity)) { object origin = activity; if (translateInternalActivityToOrigin && activity.Origin != null) { origin = activity.Origin; } newMapping.Add(origin, new SourceLocation(symbol.FileName, symbol.GetChecksum(), actSym.StartLine, actSym.StartColumn, actSym.EndLine, actSym.EndColumn)); } } return(newMapping); }
public void LoadActivityTree(Activity rootActivity, ActivityInstance rootInstance, List <ActivityInstance> secondaryRootInstances, ActivityExecutor executor) { Fx.Assert(_rawDeserializedLists != null, "We should always have deserialized some lists."); _instanceMapping = new Dictionary <Activity, InstanceList>(_rawDeserializedLists.Length); for (int i = 0; i < _rawDeserializedLists.Length; i++) { InstanceList list = _rawDeserializedLists[i]; Activity activity; if (!QualifiedId.TryGetElementFromRoot(rootActivity, list.ActivityId, out activity)) { throw Microsoft.CoreWf.Internals.FxTrace.Exception.AsError(new InvalidOperationException(SR.ActivityInstanceFixupFailed)); } _instanceMapping.Add(activity, list); list.Load(activity, this); } // We need to null this out once we've recreated the dictionary to avoid // having out of sync data _rawDeserializedLists = null; // then walk our instance list, fixup parent references, and perform basic validation Func <ActivityInstance, ActivityExecutor, bool> processInstanceCallback = new Func <ActivityInstance, ActivityExecutor, bool>(OnActivityInstanceLoaded); rootInstance.FixupInstance(null, this, executor); ActivityUtilities.ProcessActivityInstanceTree(rootInstance, executor, processInstanceCallback); if (secondaryRootInstances != null) { foreach (ActivityInstance instance in secondaryRootInstances) { instance.FixupInstance(null, this, executor); ActivityUtilities.ProcessActivityInstanceTree(instance, executor, processInstanceCallback); } } }