On Mon, 2002-06-03 at 13:21, Miguel de Icaza wrote:
> 
> Thanks for the good news.  I did not realize that we were so close to
> have CodeDOM complete, I should add a news item to the web page.

ok, demo. nonsensical example attached.

build this on windows against the ms runtime with mono's
CSharpCodegenerator pulled in statically, i.e as follows:

csc testcodedom4.cs `cygpath -w
<mono_root>/mcs/class/System/Microsoft.CSharp/CSharpCodeGenerator.cs`

on windows, it allows for switching between 
mono::csharpcodegenerator and
the original microsoft.csharp.* codegenerator implementation:
$ testcodedom4.cs [ms | mono]

i'm currently using this kind of stuff to spot differences.

works on linux, but of course won't make a difference there.

indentifying some of the bugs is left as an exercise :), but you get the
idea. so much to do, so little time...

regards,
dns

-- 
___________________________________________________________________________
 mailto:[EMAIL PROTECTED]
namespace Test {
        using System;
        using System.CodeDom;
        using System.CodeDom.Compiler;
        using System.Reflection;
        using Microsoft.CSharp;
        using Mono.CSharp;

        public class TestCodeDom3
        {
                static void PopulateImports( object sender, EventArgs args )
                {
                        CodeNamespace ns = (CodeNamespace)sender;
                        
                        CodeNamespaceImportCollection imports = ns.Imports;
                        
                        imports.Add( new CodeNamespaceImport( "System.Collections" ) );
                        imports.Add( new CodeNamespaceImport( 
"System.Collections.Specialized" ) );
                }

                static void AddArrayTypes( CodeMemberMethod method )
                {
                        CodeTypeReference type;
                        type = new CodeTypeReference( new CodeTypeReference( 
"System.Int32", 3 ), 1 );
                        CodeArrayCreateExpression create = new 
CodeArrayCreateExpression( type );
                        create.Size = 42;
                        create.Initializers.Add( new CodePrimitiveExpression( 1 ) );
                        method.Statements.Add( new CodeVariableDeclarationStatement( 
type, "array1", create ) );

                        type = new CodeTypeReference( "System.Int32", 1 );
                        create = new CodeArrayCreateExpression( type );
                        method.Statements.Add( new CodeVariableDeclarationStatement( 
type, "array2", create ) );
                        
                        CodeTypeReference arrayType;
                        arrayType = new CodeTypeReference( "System.Int32", 2 );
                        type = new CodeTypeReference( arrayType, 1 );
                        create = new CodeArrayCreateExpression( type, 
                                                                new CodeExpression[] { 
                                                                        new 
CodeArrayCreateExpression( arrayType,
                                                                                       
                new CodeExpression[] { 
                                                                                       
                        new CodePrimitiveExpression( 1 )
                                                                                       
                } ),
                                                                        new 
CodeArrayCreateExpression( arrayType,
                                                                                       
                new CodeExpression[] { 
                                                                                       
                        new CodePrimitiveExpression( 2 )
                                                                                       
                } ),
                                                                        new 
CodeArrayCreateExpression( arrayType,
                                                                                       
                new CodeExpression[] { 
                                                                                       
                        new CodePrimitiveExpression( 3 )
                                                                                       
                } ) 
                                                                } );
                        create.Size = 3;
                        method.Statements.Add( new CodeVariableDeclarationStatement( 
type, "array3", create ) );

                        arrayType = new CodeTypeReference( "System.Int32", 2 );
                        type = new CodeTypeReference( arrayType, 1 );
                        create = new CodeArrayCreateExpression( type, 2 );
                        method.Statements.Add( new CodeVariableDeclarationStatement( 
type, "array4", create ) );
                }

                static void AddTryCatch( CodeMemberMethod method )
                {
                        method.Statements.Add( new CodeTryCatchFinallyStatement( new 
CodeStatement[] {
                                        new CodeAssignStatement( new 
CodeFieldReferenceExpression( new CodeThisReferenceExpression(), "member" ),
                                                new CodeBinaryOperatorExpression( new 
CodeCastExpression( "System.Int64", new CodeVariableReferenceExpression( "param" ) ),
                                                                                   
CodeBinaryOperatorType.Add,
                                                                                   new 
CodePrimitiveExpression( 1 ) ) )
                                },
                                new CodeCatchClause[] {
                                        new CodeCatchClause( "e",
                                                new CodeTypeReference( "Exception" ),
                                                             new 
CodeExpressionStatement( 
                                                                        new 
CodeMethodInvokeExpression( 
                                                                                       
 new CodeTypeReferenceExpression(new CodeTypeReference(typeof(System.Console))),
                                                                                       
 "WriteLine", 
                                                                                       
 new CodePrimitiveExpression("an \"error\" occurred.") ) ) )
                                },
                                new CodeStatement[] {
                                        new CodeCommentStatement( "give up" ) 
                                } ) );
                }

                static void PopulateStatements( object sender, EventArgs args )
                {
                        CodeMemberMethod method = (CodeMemberMethod)sender;

                        AddArrayTypes( method );
                        AddTryCatch( method );
                        
                        method.Statements.Add( new CodeExpressionStatement( new 
CodeArrayIndexerExpression( new CodeBaseReferenceExpression(),
                                                                                       
                     new CodeExpression[] {
                                                                                       
                             new CodePrimitiveExpression( 10 ),
                                                                                       
                             new CodeFieldReferenceExpression( new 
CodeThisReferenceExpression(), "arrayindexer" )
                                                                                       
                     } ) ) );

                        method.Statements.Add( new CodeExpressionStatement( new 
CodeIndexerExpression( new CodeBaseReferenceExpression(),
                                                                                       
                new CodeExpression[] {
                                                                                       
                        new CodePrimitiveExpression( 10 ),
                                                                                       
                        new CodeFieldReferenceExpression( new 
CodeThisReferenceExpression(), "indexer" )
                                                                                       
                } ) ) );
                        method.Statements.Add( new CodeExpressionStatement( new 
CodeSnippetExpression( "this" ) ) );
                        method.Statements.Add( new CodeExpressionStatement( new 
CodeSnippetExpression( "\"this\"" ) ) );
                }

                static void PopulateTypes( object sender, EventArgs args )
                {
                        CodeNamespace ns = (CodeNamespace)sender;
                        
                        CodeTypeDeclaration test = new CodeTypeDeclaration( "Test" );
#if false
                        test.TypeAttributes = 
                                TypeAttributes.Public | 
                                TypeAttributes.Sealed |
                                TypeAttributes.Abstract;
#endif
                        test.IsClass = true;

                        test.BaseTypes.Add( new CodeTypeReference( 
typeof(System.Array) ) );
                        test.BaseTypes.Add( new CodeTypeReference( 
typeof(System.Collections.ICollection) ) );
                        test.BaseTypes.Add( new CodeTypeReference( 
"System.Collections.IEnumerable" ) );

                        CodeMemberMethod method = new CodeMemberMethod();

                        method.Name = "GetEnumerator";
                        method.Parameters.Add( new CodeParameterDeclarationExpression( 
new CodeTypeReference( typeof(System.Collections.ICollection) ), "collection" ) );
                        method.Parameters.Add( new CodeParameterDeclarationExpression( 
"System.Int32", "value" ) );
                        CodeArrayCreateExpression array = new 
CodeArrayCreateExpression( new CodeTypeReference( "System.Int32", 2 ) );
#if false
                        array.Initializers.Add( new CodePrimitiveExpression( 1 ) );
                        array.Initializers.Add( new CodePrimitiveExpression( 2 ) );
                        array.Initializers.Add( new CodePrimitiveExpression( 3 ) );
#endif
                        method.Statements.Add( array );
                        method.Statements.Add( new CodeConditionStatement( new 
CodePrimitiveExpression( true ),
                                                                           new 
CodeStatement[] { new CodeAssignStatement( new CodeVariableReferenceExpression( "a" ), 
new CodePrimitiveExpression( 10 ) ) },
                                                                           new 
CodeStatement[] { new CodeAssignStatement( new CodeVariableReferenceExpression( "b" ), 
new CodePrimitiveExpression( "hello" ) ) } ) );
                        method.PrivateImplementationType = new CodeTypeReference( 
"IEnumerable" );

                        method.Attributes = MemberAttributes.Final | 
MemberAttributes.Static | MemberAttributes.Public;

                        method.CustomAttributes.Add( new CodeAttributeDeclaration( 
"Flags" ) );
                        method.CustomAttributes.Add( new CodeAttributeDeclaration( 
"Serializable" ) );
                        method.CustomAttributes.Add( new CodeAttributeDeclaration( 
"SomeOtherAttribute", 
                                                                                   new 
CodeAttributeArgument( "name", 
                                                                                       
                       new CodeSnippetExpression( "value" ) ) ) );
                        test.Members.Add( method );

                        method = new CodeMemberMethod();
                        method.PopulateStatements += new EventHandler( 
PopulateStatements );
                        method.Name = "MoveNext";
                        method.Attributes = MemberAttributes.Family;
                        method.CustomAttributes.Add( new CodeAttributeDeclaration( 
"System.ComponentModel.ReadOnly", new CodeAttributeArgument( new 
CodeSnippetExpression( "true" ) ) ) );
                        test.Members.Add( method );

                        ns.Types.Add( test );
                }
                
                static ICodeGenerator GetCodeGenerator( string argv0 )
                {
                        CSharpCodeProvider provider;
                        ICodeGenerator codegen = null;
                        switch ( argv0 ) {
                        case "ms":
                                provider = new Microsoft.CSharp.CSharpCodeProvider();
                                codegen = provider.CreateGenerator();
                                break;
                        case "mono":
                                codegen = new Mono.CSharp.CSharpCodeGenerator();
                                break;
                        default:
                                Console.WriteLine( "either 'ms' or 'mono'" );
                                break;
                        }
                        
                        return codegen;
                }

                static void GenCode( CodeCompileUnit unit, string argv0 )
                {
                        ICodeGenerator codegen = GetCodeGenerator( argv0 );
                        CodeGeneratorOptions options = new CodeGeneratorOptions();
                        options.BlankLinesBetweenMembers = true;
                        options.ElseOnClosing = true;
                        options.BracingStyle = "C";
                        codegen.GenerateCodeFromCompileUnit( unit, Console.Out, 
options );
                }

                static void Main( string[] argv )
                {
                        CodeCompileUnit unit = new CodeCompileUnit();

                        unit.AssemblyCustomAttributes.Add( new 
CodeAttributeDeclaration( "AssemblyAttribute", 
                                                                                       
  new CodeAttributeArgument[] {
                                                                                       
          new CodeAttributeArgument( "name", new CodePrimitiveExpression( "value" ) )
                                                                                       
  } ) );
                        unit.ReferencedAssemblies.Add( "XXXXXXXXXXXXXXXXXXXXXXXXX" );

                        CodeNamespaceCollection namespaces = unit.Namespaces;

                        CodeNamespace ns;
                        ns = new CodeNamespace( "System" );
                        namespaces.Add( ns );
                        ns.PopulateImports += new EventHandler( PopulateImports );

                        ns = new CodeNamespace( "CodeDom.Test" );
                        namespaces.Add( ns );
                        ns.Comments.Add( new CodeCommentStatement( "This program is 
complete rubbish and only used for Testing System.CodeDom " +
                                                                   "and 
System.CodeDom.Compiler implementatations.", true ) );
                        ns.PopulateImports += new EventHandler( PopulateImports );
                        ns.PopulateTypes += new EventHandler( PopulateTypes );
                        
                        GenCode( unit, argv[0] );
                }
        }
}

Reply via email to