public void GenerateCodeFromType(CodeTypeDeclaration e, System.IO.TextWriter w, CodeGeneratorOptions o)
 {
     using (InternalCodeGenerator gen = new InternalCodeGenerator(w))
         gen.Generate(e);
 }
 public void GenerateCodeFromStatement(CodeStatement e, System.IO.TextWriter w, CodeGeneratorOptions o)
 {
     using (InternalCodeGenerator gen = new InternalCodeGenerator(w))
         gen.Generate(e);
 }
 public void GenerateCodeFromExpression(CodeExpression e, System.IO.TextWriter w, CodeGeneratorOptions o)
 {
     using (InternalCodeGenerator gen = new InternalCodeGenerator(w))
         gen.Generate(e);
 }
 public void GenerateCodeFromNamespace(CodeNamespace e, System.IO.TextWriter w, CodeGeneratorOptions o)
 {
     using (InternalCodeGenerator gen = new InternalCodeGenerator(w))
         gen.Generate(e);
 }
        public void GenerateCodeFromCompileUnit(CodeCompileUnit e, System.IO.TextWriter w, CodeGeneratorOptions o)
        {
            string text = (string) e.UserData["text"];

            CodeTypeDeclaration FormClass = e.Namespaces[0].Types[0];

            Dictionary<string, YYLTYPE> fields = (Dictionary<string, YYLTYPE>)FormClass.UserData["fields"];
            Dictionary<string, YYLTYPE> methods = (Dictionary<string, YYLTYPE>)FormClass.UserData["methods"];

            List<CodeMemberField> renamed_fields = new List<CodeMemberField>();
            List<CodeMemberField> new_fields = new List<CodeMemberField>();

            List<CodeMemberMethod> renamed_methods = new List<CodeMemberMethod>();
            List<CodeMemberMethod> new_methods = new List<CodeMemberMethod>();

            Dictionary<string, YYLTYPE> removed_fields = (Dictionary<string, YYLTYPE>)FormClass.UserData["fields"];
            Dictionary<string, YYLTYPE> removed_methods = (Dictionary<string, YYLTYPE>)FormClass.UserData["methods"];

            CodeMemberMethod InitializeComponent = null;
            foreach (CodeTypeMember member in FormClass.Members)
            {
                if (member is CodeMemberField)
                {
                    CodeMemberField field = (CodeMemberField)member;
                    if (field.UserData.Contains("original_name"))
                    {
                        string original_name = (string)field.UserData["original_name"];
                        removed_fields.Remove(original_name);
                        
                        if (original_name != field.Name)
                            renamed_fields.Add(field);
                    }
                    else
                        new_fields.Add(field);
                }
                else if (member is CodeMemberMethod)
                {
                    CodeMemberMethod method = (CodeMemberMethod)member;
                    if (method.Name == "InitializeComponent")
                        InitializeComponent = method;

                    if (method.UserData.Contains("original_name"))
                    {
                        string original_name = (string)method.UserData["original_name"];
                        removed_methods.Remove(original_name);

                        if (original_name != method.Name)
                            renamed_methods.Add(method);
                    }
                    else
                        new_methods.Add(method);
                }
                else
                    throw new System.NotSupportedException(member.GetType().ToString());
            }

            string[] lines = text.Split(new string[] { "\r\n" }, StringSplitOptions.None);

            bool[] removed = new bool[lines.Length+1];
            for (int i=0; i<removed.Length; i++)
                removed[i] = false;

            foreach (YYLTYPE location in removed_fields.Values)
                for (int i=location.first_line; i <= location.last_line; i++)
                    removed[i] = true;

            foreach (YYLTYPE location in removed_methods.Values)
                for (int i=location.first_line; i <= location.last_line; i++)
                    removed[i] = true;

            CodeTypeMember[] renamed = new CodeTypeMember[lines.Length+1];
            for (int i=0; i<renamed.Length; i++)
                renamed[i] = null;

            foreach (CodeMemberField field in renamed_fields)
            {
                YYLTYPE location = (YYLTYPE)field.UserData["name_location"];
                renamed[location.first_line] = field;
            }
            foreach (CodeMemberMethod method in renamed_methods)
            {
                YYLTYPE location = (YYLTYPE)method.UserData["name_location"];
                renamed[location.first_line] = method;
            }

            Ruby.Compiler.YYLTYPE InitializeComponentLocation = (YYLTYPE)InitializeComponent.UserData["location"];

            // if InitializeComponent didn't previously exist
            if (InitializeComponentLocation == null)
            {
                // create empty range at start of class
                InitializeComponentLocation = (YYLTYPE)FormClass.UserData["body_location"];
                InitializeComponentLocation.last_line = InitializeComponentLocation.first_line - 1;
            }

            for (int i = 1; i <= lines.Length; i++)
            {
                string line = lines[i-1];

                if (i == InitializeComponentLocation.first_line)
                    using (InternalCodeGenerator gen = new InternalCodeGenerator(w))
                    {
                        gen.Indent++;
                        gen.WriteLine();

                        // insert new fields
                        foreach (CodeMemberField field in new_fields)
                            gen.GenerateMemberField(field);

                        gen.WriteLine();

                        // insert new InitializeComponent method
                        gen.GenerateMemberMethod(InitializeComponent);

                        // insert new methods
                        foreach (CodeMemberMethod method in new_methods)
                        {
                            gen.WriteLine();
                            gen.GenerateMemberMethod(method);
                        }

                        gen.Indent--;
                    }
                else if (i < InitializeComponentLocation.first_line || i > InitializeComponentLocation.last_line)
                {
                    if (renamed[i] != null)
                    {
                        YYLTYPE location = (YYLTYPE)renamed[i].UserData["name_location"];
                        string original = (string)renamed[i].UserData["original_name"];
                        line = line.Substring(0, location.first_column) + renamed[i].Name + line.Substring(location.first_column+original.Length);
                    }
                    if (!removed[i])
                        w.WriteLine(line);
                }
            }
        }