/**
         * start a new procedure/function
         */
        private static MethodDeclarationSyntax StartFunction([NotNull] FunctionDeclaration functionDeclaration)
        {
            var method =
                SyntaxFactory.MethodDeclaration(GetTypeName(functionDeclaration.ReturnType), functionDeclaration.Name);

            if (!functionDeclaration.Block.Declarations.Any(x => x is ProcedureParameterDeclaration))
            {
                return(method);
            }

            var  list  = new SyntaxNodeOrTokenList();
            bool first = true;

            foreach (var declaration in functionDeclaration.Block.Declarations.OfType <ProcedureParameterDeclaration>())
            {
                if (!first)
                {
                    list = list.Add(SyntaxFactory.Token(SyntaxKind.CommaToken));
                }

                first = false;
                var param = SyntaxFactory.Parameter(MapIdentifier(declaration.Name))
                            .WithType(AddTypeSyntaxSpecification(declaration));
                if (declaration.IsVar)
                {
                    param = param.WithModifiers(SyntaxFactory.TokenList(
                                                    SyntaxFactory.Token(SyntaxKind.RefKeyword)));
                }

                list = list.Add(param);
            }

            if (list.Any())
            {
                method = method.WithParameterList(SyntaxFactory.ParameterList(
                                                      SyntaxFactory.SeparatedList <ParameterSyntax>(list)));
            }

            return(method);
        }