public virtual void GenerateCodeFromStatement(CodeStatement statement, TextWriter writer, CodeGeneratorOptions options) { ICodeGenerator cg = CreateGenerator(); if (cg == null) { throw GetNotImplemented(); } cg.GenerateCodeFromStatement(statement, writer, options); }
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); }
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); }
} //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()
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); }
} //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"); }