public CodeWriter GenerateOpenGLFunction( Function function, IList<TypeMap> typeMapList, IList<CSTypeMap> csTypeMapList, IList<EnumData> enumDatas )
        {
            var writer = new CodeWriter();

            writer.Indent = 0;
            writer.Append( "[DllImport( \"opengl32.dll\", EntryPoint=\"gl" );
            writer.AppendText( function.Name );
            writer.Indent = 0;
            writer.AppendLine( "\" )]" );
            writer.Append( "public static extern " );
            if (function.IsUnsafeMethod(typeMapList, csTypeMapList)){
            writer.Indent = 0;
            writer.Append( "unsafe " );
            }
            writer.AppendText( function.Return.GetCSName( typeMapList, csTypeMapList, enumDatas ) );
            writer.Indent = 0;
            writer.Append( " " );
            writer.AppendText( function.Name );
            writer.Indent = 0;
            writer.Append( "( " );
            {
                var list = new List<CodeWriter>();
                CodeWriter temp;

                foreach (var item in function.ParamList)
                {
                    temp = this.Invoke( "GenerateParam", item, typeMapList, csTypeMapList, enumDatas );
                    list.Add( temp );
                }

                writer.AppendType = AppendType.EmptyLastLine;
                for (var listI = 0; listI < list.Count; listI++)
                {
                    var codeWriter = list[listI];
                    writer.Append( codeWriter );
                    if (listI < list.Count - 1)
                        writer.AppendText( ", " );
                }
                writer.AppendType = AppendType.EmptyLastLine;
            }
            writer.Indent = 0;
            writer.Append( " ); // " );
            if (function.Contains( "extension" )){
            writer.Indent = 0;
            writer.Append( " extension method" );
            }
            writer.Indent = 0;
            writer.AppendLine();
            writer.Indent = 1;

            return writer;
        }
        public CodeWriter GenerateDelegateFunction( Function function, IList<TypeMap> typeMapList, IList<CSTypeMap> csTypeMapList, IList<EnumData> enumDatas )
        {
            var writer = new CodeWriter();

            writer.Indent = 0;
            writer.Append( "public " );
            if (function.IsUnsafeMethod(typeMapList, csTypeMapList)){
            writer.Indent = 0;
            writer.Append( "unsafe " );
            }
            writer.Indent = 0;
            writer.Append( "delegate " );
            writer.AppendText( function.Return.GetCSName( typeMapList, csTypeMapList, enumDatas ) );
            writer.Indent = 0;
            writer.Append( " " );
            writer.AppendText( function.Name );
            writer.Indent = 0;
            writer.Append( "Delegate( " );
            {
                var list = new List<CodeWriter>();
                CodeWriter temp;

                foreach (var item in function.ParamList)
                {
                    temp = this.Invoke( "GenerateParam", item, typeMapList, csTypeMapList, enumDatas );
                    list.Add( temp );
                }

                writer.AppendType = AppendType.EmptyLastLine;
                for (var listI = 0; listI < list.Count; listI++)
                {
                    var codeWriter = list[listI];
                    writer.Append( codeWriter );
                    if (listI < list.Count - 1)
                        writer.AppendText( ", " );
                }
                writer.AppendType = AppendType.EmptyLastLine;
            }
            writer.Indent = 0;
            writer.Append( " ); // " );
            if (function.Contains( "extension" )){
            writer.Indent = 0;
            writer.Append( " extension method" );
            }
            writer.Indent = 0;
            writer.AppendLine();
            writer.AppendLine();
            writer.Append( "private static " );
            writer.AppendText( function.Name );
            writer.Indent = 0;
            writer.Append( "Delegate _" );
            writer.AppendText( function.Name );
            writer.Indent = 0;
            writer.AppendLine( ";" );
            writer.AppendLine();
            writer.Append( "public static " );
            if (function.IsUnsafeMethod(typeMapList, csTypeMapList)){
            writer.Indent = 0;
            writer.Append( "unsafe " );
            }
            writer.Indent = 0;
            writer.Append( " " );
            writer.AppendText( function.Return.GetCSName( typeMapList, csTypeMapList, enumDatas ) );
            writer.Indent = 0;
            writer.Append( " " );
            writer.AppendText( function.Name );
            writer.Indent = 0;
            writer.Append( "( " );
            {
                var list = new List<CodeWriter>();
                CodeWriter temp;

                foreach (var item in function.ParamList)
                {
                    temp = this.Invoke( "GenerateParam", item, typeMapList, csTypeMapList, enumDatas );
                    list.Add( temp );
                }

                writer.AppendType = AppendType.EmptyLastLine;
                for (var listI = 0; listI < list.Count; listI++)
                {
                    var codeWriter = list[listI];
                    writer.Append( codeWriter );
                    if (listI < list.Count - 1)
                        writer.AppendText( ", " );
                }
                writer.AppendType = AppendType.EmptyLastLine;
            }
            writer.Indent = 0;
            writer.AppendLine( " )" );
            writer.AppendLine( "{" );
            writer.Indent = 1;
            writer.Append( "if (_" );
            writer.AppendText( function.Name );
            writer.Indent = 0;
            writer.Append( " == null) throw new Exception( \"Extension method " );
            writer.AppendText( function.Name );
            writer.Indent = 0;
            writer.AppendLine( " not found\" );" );
            writer.Indent = 1;
            if (function.Return.ReturnType != "void"){
            writer.Indent = 0;
            writer.Append( "return " );
            }
            writer.Indent = 0;
            writer.Append( " _" );
            writer.AppendText( function.Name );
            writer.Indent = 0;
            writer.Append( "( " );
            {
                var list = new List<CodeWriter>();
                CodeWriter temp;

                foreach (var item in function.ParamList)
                {
                    temp = this.Invoke( "GenerateParamName", item, typeMapList, csTypeMapList, enumDatas );
                    list.Add( temp );
                }

                writer.AppendType = AppendType.EmptyLastLine;
                for (var listI = 0; listI < list.Count; listI++)
                {
                    var codeWriter = list[listI];
                    writer.Append( codeWriter );
                    if (listI < list.Count - 1)
                        writer.AppendText( ", " );
                }
                writer.AppendType = AppendType.EmptyLastLine;
            }
            writer.Indent = 0;
            writer.AppendLine( " );" );
            writer.Append( "}" );

            return writer;
        }