Ejemplo n.º 1
0
        private string GenerateForEachStatement(ForEachStatementSyntax forEachStatementSyntax, SemanticModel semanticModel)
        {
            string variable   = forEachStatementSyntax.Identifier.ValueText;
            var    symbolInfo = semanticModel.GetSymbolInfo(forEachStatementSyntax.Type);
            string variableTypeText;

            if (symbolInfo.Symbol is INamedTypeSymbol)
            {
                var namedTypeSymbol = symbolInfo.Symbol as INamedTypeSymbol;
                var typeReference   = TypeReferenceGenerator.GenerateTypeReference(namedTypeSymbol, semanticModel);
                variableTypeText = typeReference.Text;
            }
            else if (symbolInfo.Symbol is ITypeParameterSymbol)
            {
                variableTypeText = (symbolInfo.Symbol as ITypeParameterSymbol).Name;
            }
            else
            {
                throw new NotImplementedException();
            }
            string iterable = ExpressionGenerator.GenerateExpression(forEachStatementSyntax.Expression, semanticModel);
            string jStatements;

            if (!(forEachStatementSyntax.Statement is BlockSyntax))
            {
                jStatements = Generate(forEachStatementSyntax.Statement, semanticModel);
            }
            else
            {
                jStatements = GenerateBlock(forEachStatementSyntax.Statement as BlockSyntax, semanticModel);
            }
            return("for (" + variableTypeText + " " + variable + " : " + iterable + ") {\n"
                   + "    " + jStatements + "\n"
                   + "}");
        }
Ejemplo n.º 2
0
        private SourceCode GetConstructors(SemanticModel semanticModel, HashSet <string> typeReferences, IEnumerable <ConstructorDeclarationSyntax> constructorDeclarations)
        {
            var generatedConstructors = new SourceCode {
                MainPart = ""
            };

            foreach (var constructorDeclaration in constructorDeclarations)
            {
                string identifier = constructorDeclaration.Identifier.ValueText;
                var    parameters = new List <Var>();
                foreach (var parameter in constructorDeclaration.ParameterList.Parameters)
                {
                    var typeReference = TypeReferenceGenerator.GenerateTypeReference(parameter.Type, semanticModel);
                    parameters.Add(new Var
                    {
                        Name = parameter.Identifier.ValueText,
                        Type = typeReference
                    });
                }
                var constructorAccessModifier = GetAccessModifier(constructorDeclaration.Modifiers.ToList());
                var statements = new List <string>();
                foreach (var statement in constructorDeclaration.Body.Statements)
                {
                    string generatedStatement = StatementGenerator.Generate(statement, semanticModel);
                    statements.Add(generatedStatement);
                }
                var generatedConstructor = ConstructorGenerator.Generate(identifier, constructorAccessModifier, parameters,
                                                                         statements, semanticModel);
                generatedConstructors.MainPart += "\n" + generatedConstructor.MainPart;
            }
            return(generatedConstructors);
        }
Ejemplo n.º 3
0
        private string GenerateObjectCreationExpression(ObjectCreationExpressionSyntax objectCreationExpressionSyntax, SemanticModel semanticModel)
        {
            var type = (INamedTypeSymbol)ModelExtensions.GetTypeInfo(semanticModel, objectCreationExpressionSyntax).Type;

            if (IsExceptionType(type))
            {
                return(GenerateExceptionCreationExpression(objectCreationExpressionSyntax, semanticModel));
            }
            string typeReference   = TypeReferenceGenerator.GenerateTypeReference(type, semanticModel).Text;
            string argumentList    = ArgumentListGenerator.Generate(objectCreationExpressionSyntax.ArgumentList, semanticModel);
            string constructorCall = "new " + typeReference + argumentList;

            var initializer = objectCreationExpressionSyntax.Initializer;

            if (initializer == null || !initializer.Expressions.Any())
            {
                return(constructorCall);
            }
            else
            {
                string objectToCreateName = "temp";

                string initializations = "";

                var expressions = objectCreationExpressionSyntax.Initializer.Expressions;
                foreach (var expressionSyntax in expressions)
                {
                    if (expressionSyntax is AssignmentExpressionSyntax)
                    {
                        var assignmentExpressionSyntax = expressionSyntax as AssignmentExpressionSyntax;
                        //string left = objectToCreateName + "." + GenerateExpression(assignmentExpressionSyntax.Left, semanticModel);
                        string expressionString = GenerateAssignmentExpression(assignmentExpressionSyntax, semanticModel);
                        initializations += objectToCreateName + "." + expressionString + ";\n";
                    }
                    else
                    {
                        //string left = objectToCreateName + "." + GenerateExpression(assignmentExpressionSyntax.Left, semanticModel);
                        string expressionString = GenerateExpression(expressionSyntax, semanticModel);
                        initializations += objectToCreateName + ".add(" + expressionString + ");\n";
                    }
                }

                string creationStatements = typeReference + " " + objectToCreateName + " = " + constructorCall + ";\n" +
                                            initializations +
                                            "return " + objectToCreateName + ";\n";

                string constructAndInitialize = "((new by.besmart.cross.delegates.Func() {\n" +
                                                "\t\tpublic " + typeReference + " invoke() {\n" +
                                                creationStatements.AddTab(3) +
                                                "}\n" +
                                                "\t}).invoke())";

                return(constructAndInitialize);
            }
        }
Ejemplo n.º 4
0
        private string GenerateLambdaExpression(List <ParameterSyntax> parameters, INamedTypeSymbol typeSymbol, CSharpSyntaxNode body, SemanticModel semanticModel)
        {
            var           delegateInfo = GetDelegateInfo(typeSymbol, semanticModel);
            string        delegateType = delegateInfo.JavaDelegateType;
            TypeReference returnType   = delegateInfo.ReturnType;

            bool isFunc = delegateInfo.IsFunc;

            var generatedParameters = new List <Var>();

            for (int i = 0; i < parameters.Count; i++)
            {
                var parameter = parameters[i];
                var typeArgumentForParameter = typeSymbol.TypeArguments[i];
                var typeReference            = TypeReferenceGenerator.GenerateTypeReference(typeArgumentForParameter, semanticModel, isInGenericContext: true);
                generatedParameters.Add(new Var
                {
                    Name = parameter.Identifier.ValueText,
                    Type = typeReference
                });
            }
            var statements = new List <string>();

            if (body is BlockSyntax)
            {
                foreach (var statement in (body as BlockSyntax).Statements)
                {
                    string generatedStatement = StatementGenerator.Generate(statement, semanticModel);
                    statements.Add(generatedStatement);
                }
            }
            else if (body is InvocationExpressionSyntax)
            {
                string generatedInvocationExpression = GenerateInvocationExpression(body as InvocationExpressionSyntax,
                                                                                    semanticModel);
                string statement = generatedInvocationExpression + ";";
                if (!Equals(returnType, JavaTypeReferences.Void))
                {
                    statement = "return " + statement;
                }
                statements.Add(statement);
            }
            else if (body is LiteralExpressionSyntax)
            {
                string statement = "return " + LiteralGenerator.Generate(body as LiteralExpressionSyntax, semanticModel) + ";";
                statements.Add(statement);
            }
            else if (body is BinaryExpressionSyntax)
            {
                string statement = "return " + GenerateExpression(body as BinaryExpressionSyntax, semanticModel) + ";";
                statements.Add(statement);
            }
            return(BuildLambdaExpression(delegateType, generatedParameters, returnType, statements, semanticModel));
        }
Ejemplo n.º 5
0
        private DelegateInfo GetDelegateInfo(INamedTypeSymbol typeSymbol, SemanticModel semanticModel)
        {
            string        delegateType = "";
            TypeReference returnType   = null;

            bool isFunc = typeSymbol.Name == "Func";

            if (isFunc)
            {
                delegateType = "Func";
            }
            else
            {
                delegateType = "Action";
            }

            var typeParameters = new List <TypeReference>();

            if (typeSymbol.IsGenericType)
            {
                for (int i = 0; i < typeSymbol.TypeArguments.Count(); i++)
                {
                    var typeArgument  = typeSymbol.TypeArguments[i];
                    var typeReference = TypeReferenceGenerator.GenerateTypeReference(typeArgument, semanticModel, isInGenericContext: true);
                    typeParameters.Add(typeReference);
                    if (!(isFunc && i == 0))
                    {
                        delegateType += "T";
                    }
                }
                delegateType = TypeReferenceBuilder.BuildTypeReference(new string[] { "by.besmart.cross.delegates", delegateType },
                                                                       typeParameters);
            }
            else
            {
                delegateType = TypeReferenceBuilder.BuildTypeReference(new string[] { "by.besmart.cross.delegates", delegateType },
                                                                       new List <TypeReference>());
            }

            returnType = isFunc ? typeParameters.Last() : JavaTypeReferences.Void;
            return(new DelegateInfo
            {
                ReturnType = returnType,
                JavaDelegateType = delegateType,
                TypeParameters = typeParameters,
                IsFunc = isFunc
            });
        }
Ejemplo n.º 6
0
        private SourceCode GetFields(SemanticModel semanticModel, HashSet <string> typeReferences,
                                     IEnumerable <FieldDeclarationSyntax> fieldsDeclarations)
        {
            var generatedFields = new SourceCode {
                MainPart = ""
            };

            foreach (var fieldDeclaration in fieldsDeclarations)
            {
                var variables = fieldDeclaration.Declaration.Variables;
                if (variables.Count != 1)
                {
                    throw new NotImplementedException();
                }
                var    variable      = variables.First();
                string identifier    = variable.Identifier.ValueText;
                var    fieldType     = fieldDeclaration.Declaration.Type;
                var    typeReference = TypeReferenceGenerator.GenerateTypeReference(fieldType, semanticModel);
                if (!typeReference.IsPredefined)
                {
                    typeReferences.Add(typeReference.Text);
                }

                bool   isStatic = HasStaticModifier(fieldDeclaration.Modifiers.ToList());
                string optionalStaticModifierText = isStatic ? "static " : "";

                var    fieldAccessModifier     = GetAccessModifier(fieldDeclaration.Modifiers.ToList());
                string generatedAccessModifier = fieldAccessModifier == AccessModifier.Public ? "public" : "private";

                string initializerText = "";
                if (variable.Initializer != null)
                {
                    string initializerValueText = ExpressionGenerator
                                                  .GenerateExpression(variable.Initializer.Value, semanticModel);
                    initializerText += " = " + initializerValueText;
                }

                string generatedField =
                    generatedAccessModifier + " " + optionalStaticModifierText + typeReference.Text + " "
                    + identifier + initializerText + ";\n";
                generatedFields.MainPart += "\n" + generatedField;
            }
            return(generatedFields);
        }
Ejemplo n.º 7
0
        private string GenerateLocalDeclaration(LocalDeclarationStatementSyntax localDeclarationStatementSyntax, SemanticModel semanticModel)
        {
            var    declaration              = localDeclarationStatementSyntax.Declaration;
            var    declarationType          = declaration.Type;
            string generatedDeclarationType = TypeReferenceGenerator.GenerateTypeReference(declarationType, semanticModel).Text;

            if (declaration.Variables.Count > 1)
            {
                throw new NotImplementedException();
            }
            var    declarationVariable = declaration.Variables[0];
            string variableName        = declarationVariable.Identifier.ValueText;

            string valueExpression      = ExpressionGenerator.GenerateExpression(declarationVariable.Initializer.Value, semanticModel);
            string generatedDeclaration = generatedDeclarationType + " " + variableName + " = " + valueExpression;

            if (!variableName.StartsWith("___"))
            {
                generatedDeclaration = "final " + generatedDeclaration;
            }
            return(generatedDeclaration);
        }
Ejemplo n.º 8
0
        private string GenerateMemberAccessExpression(MemberAccessExpressionSyntax memberAccessExpressionSyntax, SemanticModel semanticModel)
        {
            string memberOwnerExpression = GenerateExpression(memberAccessExpressionSyntax.Expression, semanticModel);

            var symbolInfo = ModelExtensions.GetSymbolInfo(semanticModel, memberAccessExpressionSyntax);

            if (symbolInfo.Symbol.Kind == SymbolKind.Property)
            {
                string propertyName = memberAccessExpressionSyntax.Name.Identifier.ValueText;
                var    type         = (INamedTypeSymbol)ModelExtensions.GetTypeInfo(semanticModel, memberAccessExpressionSyntax).Type;
                var    ownerType    = (INamedTypeSymbol)ModelExtensions.GetTypeInfo(semanticModel, memberAccessExpressionSyntax.Expression).Type;
                if (CustomPropertyAccessHelper.IsCustom(ownerType, propertyName))
                {
                    return(CustomPropertyAccessHelper.Generate(ownerType, memberOwnerExpression, propertyName));
                }
                else
                {
                    var    typeReference = TypeReferenceGenerator.GenerateTypeReference(type, semanticModel);
                    string methodName    = PropertyGenerator.GenerateGetterMethodName(typeReference, propertyName);
                    return(memberOwnerExpression + "." + GenerateMethodCallExpression(methodName, new List <string>()));
                }
            }
            throw new NotImplementedException();
        }
Ejemplo n.º 9
0
        private string GenerateIdentifierExpression(IdentifierNameSyntax identifierNameSyntax, SemanticModel semanticModel)
        {
            var symbolInfo = ModelExtensions.GetSymbolInfo(semanticModel, identifierNameSyntax);

            if (symbolInfo.Symbol.Kind == SymbolKind.Property)
            {
                string propertyName  = identifierNameSyntax.Identifier.ValueText;
                var    type          = (INamedTypeSymbol)ModelExtensions.GetTypeInfo(semanticModel, identifierNameSyntax).Type;
                var    typeReference = TypeReferenceGenerator.GenerateTypeReference(type, semanticModel);
                string methodName    = PropertyGenerator.GenerateGetterMethodName(typeReference, propertyName);
                return(GenerateMethodCallExpression(methodName, new List <string> {
                }));
            }
            if (symbolInfo.Symbol.Kind == SymbolKind.Field)
            {
                return(identifierNameSyntax.Identifier.ValueText);
            }
            if (symbolInfo.Symbol.Kind == SymbolKind.Parameter)
            {
                return(identifierNameSyntax.Identifier.ValueText);
            }
            if (symbolInfo.Symbol.Kind == SymbolKind.Local)
            {
                return(identifierNameSyntax.Identifier.ValueText);
            }
            if (symbolInfo.Symbol.Kind == SymbolKind.NamedType)
            {
                return(TypeReferenceGenerator.GenerateTypeReference((ITypeSymbol)symbolInfo.Symbol, semanticModel).Text);
            }
            if (symbolInfo.Symbol.Kind == SymbolKind.Method)
            {
                var methodSymbol           = symbolInfo.Symbol as IMethodSymbol;
                var typeSymbol             = ModelExtensions.GetTypeInfo(semanticModel, identifierNameSyntax).ConvertedType as INamedTypeSymbol;
                var delegateInfo           = GetDelegateInfo(typeSymbol, semanticModel);
                var delegateTypeParameters = delegateInfo.TypeParameters;

                var generatedParameters = new List <Var>();
                if (delegateInfo.IsFunc)
                {
                    delegateTypeParameters.RemoveAt(delegateTypeParameters.Count - 1);
                }
                for (int i = 0; i < delegateTypeParameters.Count; i++)
                {
                    generatedParameters.Add(new Var
                    {
                        Name = "arg" + i,
                        Type = delegateTypeParameters[i]
                    });
                }
                string statement = delegateInfo.IsFunc ? "return " : "";
                statement += methodSymbol.Name.ToLowerFirstChar() + "(";
                for (int i = 0; i < generatedParameters.Count - 1; i++)
                {
                    statement += generatedParameters[i].Name + ", ";
                }
                if (generatedParameters.Count > 0)
                {
                    statement += generatedParameters[generatedParameters.Count - 1].Name;
                }
                statement += ");";
                var statements = new List <string>
                {
                    statement
                };
                return(BuildLambdaExpression(delegateInfo.JavaDelegateType, generatedParameters, delegateInfo.ReturnType, statements, semanticModel));
            }
            throw new NotImplementedException();
        }
Ejemplo n.º 10
0
        private string GenerateInvocationExpression(InvocationExpressionSyntax invocationExpressionSyntax, SemanticModel semanticModel)
        {
            var parameterExpressions = new List <string>();

            foreach (var argument in invocationExpressionSyntax.ArgumentList.Arguments)
            {
                string parameterExpression = GenerateExpression(argument.Expression, semanticModel);
                parameterExpressions.Add(parameterExpression);
            }
            var expression = invocationExpressionSyntax.Expression;
            var symbolInfo = ModelExtensions.GetSymbolInfo(semanticModel, expression);

            if (expression is IdentifierNameSyntax)
            {
                var identifierNameExpression = expression as IdentifierNameSyntax;
                var namedTypeSymbol          = (INamedTypeSymbol)ModelExtensions.GetTypeInfo(semanticModel, expression).Type;
                if (namedTypeSymbol != null && TypeReferenceGenerator.IsDelegateType(namedTypeSymbol))
                {
                    return(identifierNameExpression.Identifier.ValueText + "." + GenerateMethodCallExpression("invoke", parameterExpressions));
                }
                string containingTypeFullName = SyntaxTreeHelper.GetFullyQualifiedName(symbolInfo.Symbol.ContainingType);
                string methodName             = invocationExpressionSyntax.Expression.GetText()
                                                .ToString().Trim();
                return(GenerateMethodCallExpression(methodName, parameterExpressions));
            }
            if (expression is MemberAccessExpressionSyntax)
            {
                var    memberAccessExpression = expression as MemberAccessExpressionSyntax;
                string memberName             = memberAccessExpression.Name.Identifier.ValueText;

                string ownerExpression = GenerateExpression(memberAccessExpression.Expression, semanticModel);
                if (symbolInfo.Symbol is IMethodSymbol && (symbolInfo.Symbol as IMethodSymbol).IsExtensionMethod)
                {
                    var    containingType          = (symbolInfo.Symbol as IMethodSymbol).ContainingType;
                    string containingTypeReference = TypeReferenceGenerator.GenerateTypeReference(containingType, semanticModel).Text;
                    parameterExpressions.Insert(0, ownerExpression);
                    return(containingTypeReference + "." + GenerateMethodCallExpression(memberName, parameterExpressions));
                }
                if (symbolInfo.Symbol.Kind == SymbolKind.Method)
                {
                    string containingTypeFullName = SyntaxTreeHelper.GetFullyQualifiedName(symbolInfo.Symbol.ContainingType);
                    string methodName             = memberName;
                    if (CustomMethodInvocationHelper.IsCustom(containingTypeFullName, methodName))
                    {
                        return(CustomMethodInvocationHelper.Generate(containingTypeFullName,
                                                                     ownerExpression, methodName, parameterExpressions));
                    }
                    else
                    {
                        return(ownerExpression + "." + GenerateMethodCallExpression(methodName, parameterExpressions));
                    }
                }
                if (symbolInfo.Symbol.Kind == SymbolKind.Property && symbolInfo.Symbol is IPropertySymbol)
                {
                    var propertyType = (symbolInfo.Symbol as IPropertySymbol).Type as INamedTypeSymbol;
                    if (TypeReferenceGenerator.IsDelegateType(propertyType))
                    {
                        string propertyName  = memberAccessExpression.Name.Identifier.ValueText;
                        var    type          = (INamedTypeSymbol)ModelExtensions.GetTypeInfo(semanticModel, memberAccessExpression).Type;
                        var    typeReference = TypeReferenceGenerator.GenerateTypeReference(type, semanticModel);
                        string methodName    = PropertyGenerator.GenerateGetterMethodName(typeReference, propertyName);
                        return(ownerExpression + "." + GenerateMethodCallExpression(methodName, new List <string>()) + "." +
                               GenerateMethodCallExpression("invoke", parameterExpressions));
                    }
                    throw new NotImplementedException();
                }
                throw new NotImplementedException();
            }
            throw new NotImplementedException();
        }
Ejemplo n.º 11
0
        private string GenerateCastExpression(CastExpressionSyntax castExpressionSyntax, SemanticModel semanticModel)
        {
            var typeReference = TypeReferenceGenerator.GenerateTypeReference(castExpressionSyntax.Type, semanticModel);

            return("(" + typeReference.Text + ") " + GenerateExpression(castExpressionSyntax.Expression, semanticModel));
        }
Ejemplo n.º 12
0
        private SourceCode GetProperties(SemanticModel semanticModel, HashSet <string> typeReferences,
                                         IEnumerable <PropertyDeclarationSyntax> propertyDeclarations, bool isFromInterface)
        {
            var generatedProperties = new SourceCode {
                MainPart = ""
            };

            foreach (var propertyDeclaration in propertyDeclarations)
            {
                string identifier    = propertyDeclaration.Identifier.ValueText;
                var    propertyType  = propertyDeclaration.Type;
                var    typeReference = TypeReferenceGenerator.GenerateTypeReference(propertyType, semanticModel);
                if (!typeReference.IsPredefined)
                {
                    typeReferences.Add(typeReference.Text);
                }

                bool isStatic  = HasStaticModifier(propertyDeclaration.Modifiers.ToList());
                bool isVirtual = isFromInterface || HasVirtualModifier(propertyDeclaration.Modifiers.ToList());

                var propertyAccessModifier = GetAccessModifier(propertyDeclaration.Modifiers.ToList());
                var accessors   = propertyDeclaration.AccessorList.Accessors;
                var getAccessor = accessors.FirstOrDefault(syntax => syntax.Keyword.Text == "get");
                var setAccessor = accessors.FirstOrDefault(syntax => syntax.Keyword.Text == "set");

                if (propertyDeclaration.AccessorList.Accessors.Any(syntax => syntax.Body != null))
                {
                    var complexPropertyDescription = new ComplexPropertyDescription
                    {
                        PropertyName      = identifier,
                        PropertyType      = typeReference,
                        GetAccessModifier = new Optional <AccessModifier>(),
                        SetAccessModifier = new Optional <AccessModifier>(),
                        IsStatic          = isStatic,
                        IsVirtual         = isVirtual
                    };
                    if (getAccessor != null)
                    {
                        var getAccessModifier = GetAccessModifier(getAccessor.Modifiers);
                        var getModifier       = MaxRestrictionAccessModifier(propertyAccessModifier, getAccessModifier);
                        complexPropertyDescription.GetAccessModifier = getModifier;
                        if (getAccessor.Body != null)
                        {
                            var statements = new List <string>();
                            foreach (var statement in getAccessor.Body.Statements)
                            {
                                string generatedStatement = StatementGenerator.Generate(statement, semanticModel);
                                statements.Add(generatedStatement);
                            }
                            complexPropertyDescription.GetStatements = statements;
                        }
                    }
                    if (setAccessor != null)
                    {
                        var setAccessModifier = GetAccessModifier(setAccessor.Modifiers);
                        var setModifier       = MaxRestrictionAccessModifier(propertyAccessModifier, setAccessModifier);
                        complexPropertyDescription.SetAccessModifier = setModifier;
                        if (setAccessor.Body != null)
                        {
                            var statements = new List <string>();
                            foreach (var statement in setAccessor.Body.Statements)
                            {
                                string generatedStatement = StatementGenerator.Generate(statement, semanticModel);
                                statements.Add(generatedStatement);
                            }
                            complexPropertyDescription.SetStatements = statements;
                        }
                    }

                    SourceCode generatedProperty = PropertyGenerator.GenerateComplexProperty(complexPropertyDescription, semanticModel);
                    generatedProperties.MainPart += "\n" + generatedProperty.MainPart;
                }
                else
                {
                    var simplePropertyDescription = new SimplePropertyDescription
                    {
                        PropertyName      = identifier,
                        PropertyType      = typeReference,
                        GetAccessModifier = new Optional <AccessModifier>(),
                        SetAccessModifier = new Optional <AccessModifier>(),
                        IsStatic          = isStatic,
                        IsVirtual         = isVirtual,
                        IsFromInterface   = isFromInterface
                    };
                    if (getAccessor != null)
                    {
                        var getAccessModifier = GetAccessModifier(getAccessor.Modifiers);
                        var getModifier       = MaxRestrictionAccessModifier(propertyAccessModifier, getAccessModifier);
                        simplePropertyDescription.GetAccessModifier = getModifier;
                    }
                    if (setAccessor != null)
                    {
                        var setAccessModifier = GetAccessModifier(setAccessor.Modifiers);
                        var setModifier       = MaxRestrictionAccessModifier(propertyAccessModifier, setAccessModifier);
                        simplePropertyDescription.SetAccessModifier = setModifier;
                    }

                    SourceCode generatedProperty = PropertyGenerator
                                                   .GenerateSimpleProperty(simplePropertyDescription, semanticModel, isFromInterface);
                    generatedProperties.MainPart += "\n" + generatedProperty.MainPart;
                }
            }
            return(generatedProperties);
        }
Ejemplo n.º 13
0
        private SourceCode GetMethods(SemanticModel semanticModel, HashSet <string> typeReferences, IEnumerable <MethodDeclarationSyntax> methodDeclarations)
        {
            var generatedMethods = new SourceCode {
                MainPart = ""
            };

            foreach (var methodDeclaration in methodDeclarations)
            {
                string identifier          = methodDeclaration.Identifier.ValueText;
                var    returnType          = methodDeclaration.ReturnType;
                var    returnTypeReference = TypeReferenceGenerator.GenerateTypeReference(returnType, semanticModel);
                if (!returnTypeReference.IsPredefined)
                {
                    typeReferences.Add(returnTypeReference.Text);
                }
                var typeParameters = new List <string>();
                if (methodDeclaration.TypeParameterList != null)
                {
                    foreach (var typeParameter in methodDeclaration.TypeParameterList.Parameters)
                    {
                        typeParameters.Add(typeParameter.Identifier.ValueText);
                    }
                }
                var parameters = new List <Var>();
                foreach (var parameter in methodDeclaration.ParameterList.Parameters)
                {
                    var typeReference = TypeReferenceGenerator.GenerateTypeReference(parameter.Type, semanticModel);
                    parameters.Add(new Var
                    {
                        Name = parameter.Identifier.ValueText,
                        Type = typeReference
                    });
                }
                var  accessModifier = GetAccessModifier(methodDeclaration.Modifiers.ToList());
                bool isStatic       = HasStaticModifier(methodDeclaration.Modifiers.ToList());
                Optional <List <string> > body;
                if (methodDeclaration.Body == null)
                {
                    body = new Optional <List <string> >();
                }
                else
                {
                    var statements = new List <string>();
                    foreach (var statement in methodDeclaration.Body.Statements)
                    {
                        string generatedStatement = StatementGenerator.Generate(statement, semanticModel);
                        statements.Add(generatedStatement);
                        new Optional <List <string> >();
                    }
                    body = new Optional <List <string> >(statements);
                }

                bool isVirtual = !body.HasValue || HasVirtualModifier(methodDeclaration.Modifiers.ToList());

                var generatedMethod = MethodGenerator.Generate(identifier,
                                                               returnTypeReference,
                                                               typeParameters,
                                                               accessModifier,
                                                               parameters,
                                                               body,
                                                               isStatic,
                                                               isVirtual,
                                                               semanticModel);
                generatedMethods.MainPart += "\n" + generatedMethod.MainPart;
            }
            return(generatedMethods);
        }