Exemplo n.º 1
0
        public virtual void GenerateCodeFromStatement(CodeStatement statement, TextWriter writer, CodeGeneratorOptions options)
        {
            ICodeGenerator cg = CreateGenerator();

            if (cg == null)
            {
                throw GetNotImplemented();
            }
            cg.GenerateCodeFromStatement(statement, writer, options);
        }
Exemplo n.º 2
0
        public void GenerateCodeFromStatement(CodeStatement e, TextWriter w, CodeGeneratorOptions o)
        {
            ICustomCodeDomObject co = e as ICustomCodeDomObject;

            if (co != null)
            {
                co.GenerateCode(GetLang());
            }

            _generator.GenerateCodeFromStatement(e, w, o);
        }
Exemplo n.º 3
0
        private static void PopulateNamespace(ICodeGenerator itfCG, TextWriter w)
        {
            // Add a code comment.
            CodeCommentStatement c = new CodeCommentStatement("This is the wicked cool Hello class");

            itfCG.GenerateCodeFromStatement(c, w, null);

            // Build root namespace.
            CodeNamespace cnamespace = new CodeNamespace("SimpleCodeDOMHelloClass");

            // Reference other namespaces.
            cnamespace.Imports.Add(new CodeNamespaceImport("System"));
            cnamespace.Imports.Add(new CodeNamespaceImport("System.Windows.Forms"));

            // Insert the HelloClass.
            CodeTypeDeclaration co = new CodeTypeDeclaration("HelloClass");

            co.IsClass = true;
            cnamespace.Types.Add(co);
            co.BaseTypes.Add(typeof(System.Object));
            co.TypeAttributes = TypeAttributes.Public;

            // Make a custom construcor.
            CodeConstructor ctor = new CodeConstructor();

            ctor.Attributes = MemberAttributes.Public;
            ctor.Parameters.Add(new CodeParameterDeclarationExpression
                                    (new CodeTypeReference(typeof(string)), "msg"));
            ctor.Statements.Add((new CodeAssignStatement(new CodeArgumentReferenceExpression("mMsg"),
                                                         new CodeArgumentReferenceExpression("msg"))));
            co.Members.Add(ctor);

            // Add the default construcor.
            ctor            = new CodeConstructor();
            ctor.Attributes = MemberAttributes.Public;
            co.Members.Add(ctor);

            // Insert a String field (mMsg).
            CodeMemberField cf = new CodeMemberField("System.String", "mMsg");

            cf.Comments.Add(new CodeCommentStatement("The state data..."));
            cf.Attributes = MemberAttributes.Private;
            co.Members.Add(cf);

            // Add the Message property.
            CodeMemberProperty cp = new CodeMemberProperty();

            cp.Name       = "Message";
            cp.Attributes = MemberAttributes.Public | MemberAttributes.Final;
            cp.Type       = new CodeTypeReference("System.String");
            cp.Comments.Add(new CodeCommentStatement("The Message property"));
            // Getter.
            cp.GetStatements.Add(new CodeMethodReturnStatement
                                     (new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), "mMsg")));
            // Setter.
            cp.SetStatements.Add(new CodeAssignStatement(new CodeArgumentReferenceExpression("mMsg"),
                                                         new CodeArgumentReferenceExpression("value")));
            co.Members.Add(cp);

            // Add the Display() message.
            CodeMemberMethod cm = new CodeMemberMethod();

            cm.Name       = "Display";
            cm.Attributes = MemberAttributes.Public | MemberAttributes.Final;
            cm.Comments.Add(new CodeCommentStatement("Show 'em what we got!"));
            cm.Statements.Add(new CodeMethodInvokeExpression
                                  (new CodeTypeReferenceExpression("MessageBox"), "Show",
                                  new CodeExpression []
                                  { new CodeArgumentReferenceExpression("mMsg") }));
            co.Members.Add(cm);

            // Generate the code!
            itfCG.GenerateCodeFromNamespace(cnamespace, w, null);
        }
 public override void GenerateCodeFromStatement(CodeStatement e, TextWriter w, CodeGeneratorOptions o)
 {
     generator.GenerateCodeFromStatement(e, w, o);
 }
Exemplo n.º 5
0
    } //Main()

    public static void SpitList(TextWriter w, string typeName, ICodeGenerator baseCompiler, string ns)
    {
        CodeCommentStatement c = new CodeCommentStatement(string.Format("List of {0}", typeName));

        baseCompiler.GenerateCodeFromStatement(c, w, null);

        CodeNamespace cnamespace = new CodeNamespace("Microsoft.Samples");

        cnamespace.Imports.Add(new CodeNamespaceImport("System"));
        cnamespace.Imports.Add(new CodeNamespaceImport("System.Collections"));
        if (ns != null && ns != "")
        {
            cnamespace.Imports.Add(new CodeNamespaceImport(ns));
        }
        CodeTypeDeclaration co = new CodeTypeDeclaration(typeName + "List");

        co.IsClass = true;
        cnamespace.Types.Add(co);
        co.BaseTypes.Add(typeof(CollectionBase));
        co.TypeAttributes = TypeAttributes.Public;


//Generates: public <TYPE> this[int index] {
        //      get {
        //         return ((<TYPE>)List[index]);
        //      }
        //      set {
        //          List[index] = value;
        //      }
        //  }
        CodeMemberProperty cp = new CodeMemberProperty();

        cp.Name       = "Item";
        cp.Attributes = MemberAttributes.Public | MemberAttributes.Final;
        cp.Type       = new CodeTypeReference(typeName);
        cp.Parameters.Add(new CodeParameterDeclarationExpression(new CodeTypeReference(typeof(int)), "index"));
        cp.GetStatements.Add(new CodeMethodReturnStatement(new CodeCastExpression(typeName, new CodeIndexerExpression(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), "List"), new CodeArgumentReferenceExpression("index")))));
        cp.SetStatements.Add(new CodeAssignStatement(new CodeIndexerExpression(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), "List"), new CodeArgumentReferenceExpression("index")), new CodeArgumentReferenceExpression("value")));
        co.Members.Add(cp);


        //Gen: public int Add(<TYPE> value) {
        //        return List.Add(value);
        //      }
        CodeMemberMethod cm = new CodeMemberMethod();

        cm.Name       = "Add";
        cm.ReturnType = new CodeTypeReference(typeof(int));
        cm.Parameters.Add(new CodeParameterDeclarationExpression(typeName, "value"));
        cm.Attributes = MemberAttributes.Public | MemberAttributes.Final;
        cm.Statements.Add(new CodeMethodReturnStatement(new CodeMethodInvokeExpression(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), "List"), "Add",
                                                                                       new CodeArgumentReferenceExpression("value"))));
        co.Members.Add(cm);

        //Gen: public void Insert(int index, <TYPE> value)
        //    {
        //         List.Insert(index, info);
        //     }
        cm            = new CodeMemberMethod();
        cm.Name       = "Insert";
        cm.ReturnType = new CodeTypeReference(typeof(void));
        cm.Parameters.Add(new CodeParameterDeclarationExpression(new CodeTypeReference(typeof(int)), "index"));
        cm.Parameters.Add(new CodeParameterDeclarationExpression(typeName, "value"));
        cm.Attributes = MemberAttributes.Public | MemberAttributes.Final;
        cm.Statements.Add(new CodeMethodInvokeExpression(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), "List"), "Insert",
                                                         new CodeArgumentReferenceExpression("index"), new CodeArgumentReferenceExpression("value")));
        co.Members.Add(cm);


        //Gen: public int IndexOf(<TYPE> value)
        //      {
        //        return List.IndexOf(value);
        //      }
        cm            = new CodeMemberMethod();
        cm.Name       = "IndexOf";
        cm.ReturnType = new CodeTypeReference(typeof(int));
        cm.Parameters.Add(new CodeParameterDeclarationExpression(typeName, "value"));
        cm.Attributes = MemberAttributes.Public | MemberAttributes.Final;
        cm.Statements.Add(new CodeMethodReturnStatement(new CodeMethodInvokeExpression(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), "List"), "IndexOf", new CodeExpression []
                                                                                       { new CodeArgumentReferenceExpression("value") })));
        co.Members.Add(cm);

        //Gen: public bool Contains(<TYPE> value)
        //      {
        //        return List.Contains(value);
        //      }
        cm            = new CodeMemberMethod();
        cm.Name       = "Contains";
        cm.ReturnType = new CodeTypeReference(typeof(bool));
        cm.Parameters.Add(new CodeParameterDeclarationExpression(typeName, "value"));
        cm.Attributes = MemberAttributes.Public | MemberAttributes.Final;
        cm.Statements.Add(new CodeMethodReturnStatement(new CodeMethodInvokeExpression(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), "List"), "Contains", new CodeExpression []
                                                                                       { new CodeArgumentReferenceExpression("value") })));
        co.Members.Add(cm);

        //Gen: public void Remove(<TYPE> value)
        //      {
        //       List.Remove(value);
        //      }
        cm      = new CodeMemberMethod();
        cm.Name = "Remove";
        cm.Parameters.Add(new CodeParameterDeclarationExpression(typeName, "value"));
        cm.Attributes = MemberAttributes.Public | MemberAttributes.Final;
        cm.Statements.Add(new CodeMethodInvokeExpression(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), "List"), "Remove", new CodeExpression []
                                                         { new CodeArgumentReferenceExpression("value") }));
        co.Members.Add(cm);

        //Gen: public void CopyTo(<Type>[] array, int index)
        //     {
        //         List.CopyTo(array, index);
        //     }
        cm      = new CodeMemberMethod();
        cm.Name = "CopyTo";
        cm.Parameters.Add(new CodeParameterDeclarationExpression(new CodeTypeReference(typeName, 1), "array"));
        cm.Parameters.Add(new CodeParameterDeclarationExpression(new CodeTypeReference(typeof(int)), "index"));
        cm.Attributes = MemberAttributes.Public | MemberAttributes.Final;
        cm.Statements.Add(new CodeMethodInvokeExpression(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), "List"), "CopyTo", new CodeExpression []
                                                         { new CodeArgumentReferenceExpression("array"), new CodeArgumentReferenceExpression("index") }));
        co.Members.Add(cm);

        baseCompiler.GenerateCodeFromNamespace(cnamespace, w, null);
    } //SpitList()
Exemplo n.º 6
0
        private static void PopulateNamespace(ICodeGenerator itfCG, TextWriter w)
        {
            // Add a code comment.
            CodeCommentStatement c = new CodeCommentStatement("This is the wicked cool Hello class");
            itfCG.GenerateCodeFromStatement(c, w, null);

            // Build root namespace.
            CodeNamespace cnamespace = new CodeNamespace("SimpleCodeDOMHelloClass");

            // Reference other namespaces.
            cnamespace.Imports.Add(new CodeNamespaceImport ("System") );
            cnamespace.Imports.Add(new CodeNamespaceImport ("System.Windows.Forms") );

            // Insert the HelloClass.
            CodeTypeDeclaration co = new CodeTypeDeclaration ("HelloClass");
            co.IsClass = true;
            cnamespace.Types.Add(co);
            co.BaseTypes.Add (typeof (System.Object) );
            co.TypeAttributes  = TypeAttributes.Public;

            // Make a custom construcor.
            CodeConstructor ctor = new CodeConstructor();
            ctor.Attributes = MemberAttributes.Public;
            ctor.Parameters.Add(new CodeParameterDeclarationExpression
                (new CodeTypeReference(typeof(string)), "msg"));
            ctor.Statements.Add((new CodeAssignStatement(new CodeArgumentReferenceExpression("mMsg"),
                new CodeArgumentReferenceExpression("msg"))));
            co.Members.Add(ctor);

            // Add the default construcor.
            ctor = new CodeConstructor();
            ctor.Attributes = MemberAttributes.Public;
            co.Members.Add(ctor);

            // Insert a String field (mMsg).
            CodeMemberField cf = new CodeMemberField("System.String", "mMsg");
            cf.Comments.Add(new CodeCommentStatement("The state data..."));
            cf.Attributes = MemberAttributes.Private;
            co.Members.Add(cf);

            // Add the Message property.
            CodeMemberProperty  cp = new CodeMemberProperty();
            cp.Name = "Message";
            cp.Attributes = MemberAttributes.Public | MemberAttributes.Final ;
            cp.Type = new CodeTypeReference("System.String");
            cp.Comments.Add(new CodeCommentStatement("The Message property"));
            // Getter.
            cp.GetStatements.Add(new CodeMethodReturnStatement
                (new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), "mMsg")));
            // Setter.
            cp.SetStatements.Add(new CodeAssignStatement(new CodeArgumentReferenceExpression("mMsg"),
                new CodeArgumentReferenceExpression("value")));
            co.Members.Add (cp);

            // Add the Display() message.
            CodeMemberMethod cm = new CodeMemberMethod();
            cm.Name = "Display";
            cm.Attributes = MemberAttributes.Public | MemberAttributes.Final ;
            cm.Comments.Add(new CodeCommentStatement("Show 'em what we got!"));
            cm.Statements.Add (new CodeMethodInvokeExpression
                (new CodeTypeReferenceExpression("MessageBox"), "Show",
                new CodeExpression []
                {new CodeArgumentReferenceExpression  ("mMsg")}));
            co.Members.Add(cm);

            // Generate the code!
            itfCG.GenerateCodeFromNamespace (cnamespace, w, null);
        }
Exemplo n.º 7
0
  } //Main()

  public  static void SpitList (TextWriter w, string typeName, ICodeGenerator  baseCompiler, string ns) 
  {

    CodeCommentStatement c = new CodeCommentStatement  (string.Format ("List of {0}", typeName));
    baseCompiler.GenerateCodeFromStatement (c, w, null);

    CodeNamespace cnamespace = new CodeNamespace("Microsoft.Samples");
    cnamespace.Imports.Add (new CodeNamespaceImport ("System") );
    cnamespace.Imports.Add (new CodeNamespaceImport ("System.Collections") );
    if (ns != null &&  ns != "") cnamespace.Imports.Add (new CodeNamespaceImport (ns) );
    CodeTypeDeclaration co = new CodeTypeDeclaration (typeName +"List");
    co.IsClass = true;
    cnamespace.Types.Add (co);
    co.BaseTypes.Add (typeof (CollectionBase) );
    co.TypeAttributes  = TypeAttributes.Public;


//Generates: public <TYPE> this[int index] {
    //      get {
    //         return ((<TYPE>)List[index]);
    //      }
    //      set {
    //          List[index] = value;
    //      }
    //  }
    CodeMemberProperty  cp = new CodeMemberProperty ();
    cp.Name = "Item";
    cp.Attributes = MemberAttributes.Public | MemberAttributes.Final ;
    cp.Type = new CodeTypeReference(typeName);
    cp.Parameters.Add (new CodeParameterDeclarationExpression (new CodeTypeReference(typeof(int)), "index"));
    cp.GetStatements.Add (new CodeMethodReturnStatement (new CodeCastExpression (typeName, new CodeIndexerExpression (new CodeFieldReferenceExpression  (new CodeThisReferenceExpression(), "List"), new CodeArgumentReferenceExpression   ("index")))));
    cp.SetStatements.Add (new CodeAssignStatement (new CodeIndexerExpression (new CodeFieldReferenceExpression  (new CodeThisReferenceExpression(),"List"), new CodeArgumentReferenceExpression   ("index")), new CodeArgumentReferenceExpression  ("value")));
    co.Members.Add (cp);


    //Gen: public int Add(<TYPE> value) {
    //        return List.Add(value);
    //      }
    CodeMemberMethod cm = new CodeMemberMethod ();
    cm.Name = "Add";
    cm.ReturnType = new CodeTypeReference(typeof(int));
    cm.Parameters.Add (new CodeParameterDeclarationExpression (typeName, "value"));
    cm.Attributes = MemberAttributes.Public | MemberAttributes.Final ;
    cm.Statements.Add (new CodeMethodReturnStatement (new CodeMethodInvokeExpression (new CodeFieldReferenceExpression  (new CodeThisReferenceExpression(),"List"), "Add", 
      new CodeArgumentReferenceExpression  ("value"))));
    co.Members.Add (cm);

    //Gen: public void Insert(int index, <TYPE> value)
    //    {
    //         List.Insert(index, info);
    //     }
    cm = new CodeMemberMethod ();
    cm.Name = "Insert";
    cm.ReturnType = new CodeTypeReference(typeof(void));
    cm.Parameters.Add (new CodeParameterDeclarationExpression (new CodeTypeReference(typeof(int)), "index"));
    cm.Parameters.Add (new CodeParameterDeclarationExpression (typeName, "value"));
    cm.Attributes = MemberAttributes.Public | MemberAttributes.Final ;
    cm.Statements.Add (new CodeMethodInvokeExpression (new CodeFieldReferenceExpression  (new CodeThisReferenceExpression(),"List"), "Insert", 
      new CodeArgumentReferenceExpression  ("index"), new CodeArgumentReferenceExpression  ("value")));
    co.Members.Add (cm);


    //Gen: public int IndexOf(<TYPE> value) 
    //      {
    //        return List.IndexOf(value);
    //      }
    cm = new CodeMemberMethod ();
    cm.Name = "IndexOf";
    cm.ReturnType = new CodeTypeReference(typeof(int));
    cm.Parameters.Add (new CodeParameterDeclarationExpression (typeName, "value"));
    cm.Attributes = MemberAttributes.Public | MemberAttributes.Final ;
    cm.Statements.Add (new CodeMethodReturnStatement (new CodeMethodInvokeExpression (new CodeFieldReferenceExpression  (new CodeThisReferenceExpression(),"List"), "IndexOf", new CodeExpression []
                {new CodeArgumentReferenceExpression  ("value")})));
    co.Members.Add (cm);

    //Gen: public bool Contains(<TYPE> value) 
    //      {
    //        return List.Contains(value);
    //      }
    cm = new CodeMemberMethod ();
    cm.Name = "Contains";
    cm.ReturnType = new CodeTypeReference(typeof(bool));
    cm.Parameters.Add (new CodeParameterDeclarationExpression (typeName, "value"));
    cm.Attributes = MemberAttributes.Public | MemberAttributes.Final ;
    cm.Statements.Add (new CodeMethodReturnStatement (new CodeMethodInvokeExpression (new CodeFieldReferenceExpression  (new CodeThisReferenceExpression(),"List"), "Contains", new CodeExpression []
                {new CodeArgumentReferenceExpression  ("value")})));
    co.Members.Add (cm);

    //Gen: public void Remove(<TYPE> value) 
    //      {
    //       List.Remove(value);
    //      }
    cm = new CodeMemberMethod ();
    cm.Name = "Remove";
    cm.Parameters.Add (new CodeParameterDeclarationExpression (typeName, "value"));
    cm.Attributes = MemberAttributes.Public | MemberAttributes.Final ;
    cm.Statements.Add (new CodeMethodInvokeExpression (new CodeFieldReferenceExpression  (new CodeThisReferenceExpression(),"List"), "Remove", new CodeExpression []
                {new CodeArgumentReferenceExpression  ("value")}));
    co.Members.Add (cm);

    //Gen: public void CopyTo(<Type>[] array, int index) 
    //     {
    //         List.CopyTo(array, index);
    //     }
    cm = new CodeMemberMethod ();
    cm.Name = "CopyTo";
    cm.Parameters.Add (new CodeParameterDeclarationExpression (new CodeTypeReference(typeName, 1), "array"));
    cm.Parameters.Add (new CodeParameterDeclarationExpression (new CodeTypeReference(typeof(int)), "index"));
    cm.Attributes = MemberAttributes.Public | MemberAttributes.Final ;
    cm.Statements.Add (new CodeMethodInvokeExpression (new CodeFieldReferenceExpression  (new CodeThisReferenceExpression(),"List"), "CopyTo", new CodeExpression []
                {new CodeArgumentReferenceExpression  ("array"), new CodeArgumentReferenceExpression ("index")}));
    co.Members.Add (cm);

    baseCompiler.GenerateCodeFromNamespace (cnamespace, w, null);
  } //SpitList()
        void WriteCode()
        {
            string timeString = polyNumber.ToString();

            polyNumber++;

            string       filename = "PSCD_" + timeString;
            Stream       s        = File.Open(filename + ".cs", FileMode.Create);
            StreamWriter t        = new StreamWriter(s);

            // Generate code in C#
            CSharpCodeProvider   provider = new CSharpCodeProvider();
            ICodeGenerator       cg       = provider.CreateGenerator(t);
            CodeGeneratorOptions op       = new CodeGeneratorOptions();

            // Generate the comments at the beginning of the function
            CodeCommentStatement comment = new CodeCommentStatement("Polynomial evaluator");

            cg.GenerateCodeFromStatement(comment, t, op);

            string[] terms = new string[coefficients.Length];
            terms[0] = coefficients[0].ToString();

            for (int i = 1; i < coefficients.Length; i++)
            {
                terms[i] = String.Format("{0} X^{1}", coefficients[i], i);
            }

            comment = new CodeCommentStatement("Evaluating Y = " + String.Join(" + ", terms));
            cg.GenerateCodeFromStatement(comment, t, op);

            // The class is named with a unique name
            string className = "Poly_" + timeString;
            CodeTypeDeclaration polyClass = new CodeTypeDeclaration(className);

            // The class implements IPolynomial
            polyClass.BaseTypes.Add("PolyInterface.IPolynomial");

            // Set up the Eval function
            CodeParameterDeclarationExpression param1 =
                new CodeParameterDeclarationExpression("double", "x");
            CodeMemberMethod eval = new CodeMemberMethod();

            eval.Name = "Eval";
            eval.Parameters.Add(param1);

            // workaround for bug below...
            eval.ReturnType = new CodeTypeReference("public double");
            // BUG: This doesn't generate "public", it just leaves
            // the attribute off of the member...
            eval.Attributes |= MemberAttributes.Public;

            // Create the expression to do the evaluation of the
            // polynomail. To do this, we chain together binary
            // operators to get the desired expression
            // a0 + x * (a1 + x * (a2 + x * (a3)));
            //
            // This is very much like building a parse tree for
            // an expression.

            CodeBinaryOperatorExpression plus = new CodeBinaryOperatorExpression();

            plus.Left     = new CodePrimitiveExpression(coefficients[0]);
            plus.Operator = CodeBinaryOperatorType.Add;

            CodeBinaryOperatorExpression current = plus;

            for (int i = 1; i < coefficients.Length; i++)
            {
                CodeBinaryOperatorExpression multiply = new CodeBinaryOperatorExpression();
                current.Right     = multiply;
                multiply.Left     = new CodeSnippetExpression("x");
                multiply.Operator = CodeBinaryOperatorType.Multiply;

                CodeBinaryOperatorExpression add = new CodeBinaryOperatorExpression();
                multiply.Right = add;
                add.Operator   = CodeBinaryOperatorType.Add;
                add.Left       = new CodePrimitiveExpression(coefficients[i]);
                current        = add;
            }
            current.Right = new CodePrimitiveExpression(0.0);

            // return the expression...
            eval.Statements.Add(new CodeMethodReturnStatement(plus));
            polyClass.Members.Add(eval);
            cg.GenerateCodeFromType(polyClass, t, op);

            t.Close();
            s.Close();

            // Build the file
            ProcessStartInfo psi = new ProcessStartInfo();

            psi.FileName    = "cmd.exe";
            psi.Arguments   = String.Format("/c csc /optimize+ /r:polynomial.exe /target:library {0}.cs > compile.out", filename);
            psi.WindowStyle = ProcessWindowStyle.Minimized;

            Process proc = Process.Start(psi);

            proc.WaitForExit();

            // Open the file, create the instance, and cast it
            // to the assembly
            Assembly a = Assembly.LoadFrom(filename + ".dll");

            polynomial = (IPolynomial)a.CreateInstance(className);

            //File.Delete(filename + ".cs");
        }