Beispiel #1
0
        private void GenerateFileExtensionMethod(ClassDeclaration classDeclaration, ClassDeclaration extensionClass)
        {
            var methods = classDeclaration.Members
                          .OfType <MethodDeclaration>()
                          .Where(ContainsFileArgument)
                          .ToList();

            foreach (var methodDeclaration in methods)
            {
                var method = methodDeclaration.Data["Method"] as Method;
                if (method == null)
                {
                    continue;
                }

                var m = GenerateMethod(extensionClass, method);
                m.Modifiers |= Modifiers.Static;
                m.Statements.Clear();

                var extensionArgument = new MethodArgumentDeclaration(new TypeReference("IGitLabClient"), "client")
                {
                    IsExtension = true
                };

                var invoke = new MethodInvokeExpression(extensionArgument.CreateMemberReferenceExpression(methodDeclaration.Name));

                foreach (var arg in m.Arguments.ToList())
                {
                    if (arg.Name == "encoding")
                    {
                        invoke.Arguments.Add(new LiteralExpression("base64"));
                        m.Arguments.Remove(arg);
                    }
                    else if (arg.Name == "content")
                    {
                        invoke.Arguments.Add(new TypeReference(typeof(Convert)).CreateInvokeMethodExpression(nameof(Convert.ToBase64String), arg));
                        arg.Type = typeof(byte[]);
                    }
                    else
                    {
                        invoke.Arguments.Add(arg);
                    }
                }

                m.Statements.Add(new ReturnStatement(invoke));

                m.Name = m.Name.Replace(extensionClass.Name, "", StringComparison.OrdinalIgnoreCase);
                m.Arguments.Insert(0, extensionArgument);
            }

            bool ContainsFileArgument(MethodDeclaration m)
            {
                return(m.Arguments.Any(a => a.Name == "content" && a.Type.ClrFullTypeName == typeof(string).FullName) &&
                       m.Arguments.Any(a => a.Name == "encoding" && a.Type.ClrFullTypeName == typeof(string).FullName));
            }
        }