internal static bool TryMorphExpression(ActivityWithResult originalExpression, bool isLocation, Type targetType, EditingContext context, out ActivityWithResult morphedExpression) { bool succeeded = false; morphedExpression = null; if (originalExpression != null) { Type resultType = originalExpression.ResultType; if ((isLocation) && (ExpressionHelper.IsGenericLocationExpressionType(originalExpression) && (targetType == resultType.GetGenericArguments()[0])) || (!isLocation) && (resultType == targetType)) { //no need to morph succeeded = true; morphedExpression = originalExpression; } else { Type expressionType = originalExpression.GetType(); if (expressionType.IsGenericType) { expressionType = expressionType.GetGenericTypeDefinition(); } ExpressionMorphHelperAttribute morphHelperAttribute = ExtensibilityAccessor.GetAttribute <ExpressionMorphHelperAttribute>(expressionType); if (morphHelperAttribute != null) { ExpressionMorphHelper morphHelper = Activator.CreateInstance(morphHelperAttribute.ExpressionMorphHelperType) as ExpressionMorphHelper; if (morphHelper != null) { succeeded = morphHelper.TryMorphExpression(originalExpression, isLocation, targetType, context, out morphedExpression); if (succeeded && morphedExpression != null) { string editorName = ExpressionActivityEditor.GetExpressionActivityEditor(originalExpression); if (!string.IsNullOrWhiteSpace(editorName)) { ExpressionActivityEditor.SetExpressionActivityEditor(morphedExpression, editorName); } } } } } } else { succeeded = true; } return(succeeded); }
// this method may has side effect, it may modify model. internal static bool TryInferReturnType(ActivityWithResult expression, EditingContext context, out Type returnType) { bool succeeded = false; returnType = null; Type expressionType = expression.GetType(); if (expressionType.IsGenericType) { expressionType = expressionType.GetGenericTypeDefinition(); ExpressionMorphHelperAttribute morphHelperAttribute = ExtensibilityAccessor.GetAttribute <ExpressionMorphHelperAttribute>(expressionType); if (morphHelperAttribute != null) { ExpressionMorphHelper morphHelper = Activator.CreateInstance(morphHelperAttribute.ExpressionMorphHelperType) as ExpressionMorphHelper; if (morphHelper != null) { succeeded = morphHelper.TryInferReturnType(expression, context, out returnType); } } } return(succeeded); }