private void WriteCustomActivity(StringWriter writer, CustomActivityCode customActivityCode, int tabs)
 {
     if (customActivityCode.Method != null)
     {
         foreach (MethodParameter parameter in customActivityCode.Method.Parameters)
         {
             if (!parameter.Variable.WasInitialized)
             {
                 writer.WriteLineTabs($"{parameter.Variable.Type} {parameter.Variable.Name} = default({parameter.Variable.Type});", tabs);
                 parameter.Variable.WasInitialized = true;
             }
         }
         if (string.IsNullOrWhiteSpace(customActivityCode.ResultTo))
         {
             writer.WriteLineTabs($"{customActivityCode.Method.Name}({string.Join(", ", ConvertParameters(customActivityCode.Method.Parameters, x => x.Name))});", tabs);
         }
         else
         {
             WriteAssign(writer, new AssignCode
             {
                 To    = customActivityCode.ResultTo,
                 Value = $"{customActivityCode.Method.Name}({ConvertParameters(customActivityCode.Method.Parameters, x => x.Name)})"
             }, tabs);
         }
     }
     else
     {
         writer.WriteLineTabs($"var {customActivityCode.Name} = new {customActivityCode.Name}();", tabs);
         foreach (AssignCode assignCode in customActivityCode.Assigns)
         {
             if (assignCode.Value != null)
             {
                 writer.WriteLineTabs($"{customActivityCode.Name}.{assignCode.To} = {assignCode.Value};", tabs);
             }
             else
             {
                 writer.WriteLineTabs($"// {customActivityCode.Name}.{assignCode.To} = {assignCode.Value};", tabs);
             }
         }
         writer.WriteLineTabs($"{customActivityCode.Name}.Execute();", tabs);
     }
 }
Beispiel #2
0
        private CustomActivityCode GetCustomActivity(XElement element)
        {
            var result = new CustomActivityCode
            {
                Name       = element.Name.LocalName,
                Assigns    = new List <CustomMethodAssignCode>(),
                ReturnType = "void"
            };
            IEnumerable <XElement> children = element.Elements();

            foreach (var child in children)
            {
                string name = child.Name.LocalName;
                if (name.StartsWith(element.Name.LocalName))
                {
                    string[] names           = name.Split('.');
                    string   variableName    = names.Last();
                    XElement argumentElement = child.Elements().FirstOrDefault();
                    if (variableName == "Result")
                    {
                        result.ResultTo = GetValueOfArgument(argumentElement);
                        string returnType = argumentElement.GetAttribute("TypeArguments").Value;
                        if (returnType.Contains(":"))
                        {
                            returnType = returnType.Split(':').Last();
                        }
                        result.ReturnType = returnType;
                        continue;
                    }
                    var assign = new CustomMethodAssignCode
                    {
                        To        = variableName,
                        Value     = GetValueOfArgument(argumentElement),
                        Direction = GetArgumentType(argumentElement)
                    };
                    result.Assigns.Add(assign);
                }
            }
            return(result);
        }
Beispiel #3
0
        private Method CreateMethodFromCustomActivity(CustomActivityCode entity)
        {
            var result = new Method
            {
                AccessModifier = "private",
                Name           = entity.Name,
                ReturnType     = entity.ReturnType,
                Parameters     = new List <MethodParameter>(),
                Sequence       = new Sequence()
            };
            var objectName = "entity";

            result.Sequence.Values.Add(new AssignCode
            {
                To    = $"var {objectName}",
                Value = $"new {entity.Name}()"
            });
            var finallyBlock = new Sequence();

            foreach (CustomMethodAssignCode assign in entity.Assigns)
            {
                result.Parameters.AddRange(fieldManager.GetUsingVariables(assign.Value)
                                           .Select(x => new MethodParameter
                {
                    Variable  = x,
                    Direction = assign.Direction
                }));
                result.Sequence.Values.Add(new AssignCode
                {
                    To    = $"{objectName}.{assign.To}",
                    Value = assign.Value
                });
                if (assign.Direction == ParameterDirection.InOut ||
                    assign.Direction == ParameterDirection.Out)
                {
                    finallyBlock.Values.Add(new AssignCode
                    {
                        To    = assign.Value,
                        Value = $"{objectName}.{assign.To}"
                    });
                }
            }
            for (var i = result.Parameters.Count - 1; i >= 0; i--)
            {
                MethodParameter parameter = result.Parameters[i];
                if (result.Parameters.Where(x => x.Variable.Name == parameter.Variable.Name).Count() > 1)
                {
                    result.Parameters.RemoveAt(i);
                }
            }
            var executeLine = $"{objectName}.Execute()";

            if (entity.ReturnType != "void")
            {
                executeLine = "return " + executeLine;
            }
            var executeStringCode = new StringCode
            {
                Value = executeLine
            };

            if (finallyBlock.Values.Count > 0)
            {
                var tryFinally = new TryCatchCode
                {
                    Try = new StringCode {
                        Value = executeLine
                    }.WrapInSequence(),
                    Catches = new List <CatchCode>(),
                    Finally = finallyBlock
                };
                result.Sequence.Values.Add(tryFinally);
            }
            else
            {
                result.Sequence.Values.Add(executeStringCode);
            }
            entity.Method = result;
            return(result);
        }