private static void ProcessStmt(IEnumerable stmts, LinqToCodedom.CodeDomGenerator.Language language)
 {
     foreach (CodeStatement stmt in stmts)
     {
         ProcessStmt(stmt, language);
     }
 }
 private static void ProcessExpr(IEnumerable codeExpressions, LinqToCodedom.CodeDomGenerator.Language language)
 {
     foreach (CodeExpression exp in codeExpressions)
     {
         ProcessExpr(exp, language);
     }
 }
        public IEnumerable <System.CodeDom.CodeCompileUnit> CreateCompileUnits(WXMLModel model)
        {
            WXMLCodeDomGeneratorSettings settings = new WXML.CodeDom.WXMLCodeDomGeneratorSettings();

            CodeCompileUnit modificationTracketUnit = GenerateModificationTracker(model, settings);

            LinqCodeDomGenerator gen = new LinqCodeDomGenerator(model, settings);

            LinqToCodedom.CodeDomGenerator.Language lang = LinqToCodedom.CodeDomGenerator.Language.CSharp;

            return(new CodeCompileUnit[] { gen.GetCompileUnit(lang), modificationTracketUnit });
        }
        private static CodeTypeMember ProcessMember(CodeTypeMember m, LinqToCodedom.CodeDomGenerator.Language language)
        {
            foreach (CodeDirective directive in m.StartDirectives)
            {
                ProcessDirective(directive, language);
            }

            foreach (CodeDirective directive in m.EndDirectives)
            {
                ProcessDirective(directive, language);
            }

            if (typeof(CodeMemberMethod).IsAssignableFrom(m.GetType()))
            {
                foreach (CodeStatement stmt in ((CodeMemberMethod)m).Statements)
                {
                    ProcessStmt(stmt, language);
                }
            }
            else if (typeof(CodeMemberProperty).IsAssignableFrom(m.GetType()))
            {
                foreach (CodeStatement stmt in ((CodeMemberProperty)m).GetStatements)
                {
                    ProcessStmt(stmt, language);
                }

                foreach (CodeStatement stmt in ((CodeMemberProperty)m).SetStatements)
                {
                    ProcessStmt(stmt, language);
                }
            }
            else if (typeof(CodeConstructor).IsAssignableFrom(m.GetType()))
            {
                ProcessExpr(((CodeConstructor)m).BaseConstructorArgs, language);
                ProcessExpr(((CodeConstructor)m).ChainedConstructorArgs, language);
                ProcessStmt(((CodeConstructor)m).Statements, language);
            }
            else if (typeof(CodeMemberField).IsAssignableFrom(m.GetType()))
            {
                ProcessExpr(((CodeMemberField)m).InitExpression, language);
            }
            else if (typeof(CodeTypeDeclaration).IsAssignableFrom(m.GetType()))
            {
                CodeTypeDeclaration td = (CodeTypeDeclaration)m;
                ProcessTypeDeclaration(td, language);
                foreach (CodeTypeMember ms in td.Members)
                {
                    ProcessMember(ms, language);
                }
            }

            ICustomCodeDomObject co = m as ICustomCodeDomObject;

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

            if (typeof(CodeMemberMethod).IsAssignableFrom(m.GetType()))
            {
                return(ProcessMethod(m as CodeMemberMethod, language));
            }

            return(m);
        }
        private static CodeMemberMethod ProcessMethod(CodeMemberMethod method, LinqToCodedom.CodeDomGenerator.Language language)
        {
            if (method.TypeParameters.Count > 0)
            {
                foreach (CodeTypeParameter genericParam in method.TypeParameters)
                {
                    for (int i = 0; i < genericParam.Constraints.Count; i++)
                    {
                        if (genericParam.Constraints[i].BaseType == typeof(object).ToString())
                        {
                            if (language == LinqToCodedom.CodeDomGenerator.Language.CSharp)
                            {
                                genericParam.Constraints[i] = new CodeTypeReference(" class");
                            }
                            else if (language == LinqToCodedom.CodeDomGenerator.Language.VB)
                            {
                                genericParam.Constraints[i] = new CodeTypeReference(" Class");
                            }
                        }
                        else if (genericParam.Constraints[i].BaseType == typeof(ValueType).ToString())
                        {
                            if (language == LinqToCodedom.CodeDomGenerator.Language.CSharp)
                            {
                                genericParam.Constraints[i] = new CodeTypeReference(" struct");
                            }
                            else if (language == LinqToCodedom.CodeDomGenerator.Language.VB)
                            {
                                genericParam.Constraints[i] = new CodeTypeReference(" Structure");
                            }
                        }
                    }
                }
            }

            if (language == LinqToCodedom.CodeDomGenerator.Language.VB)
            {
                if (method.PrivateImplementationType != null)
                {
                    CodeMemberMethod newMethod = method.Clone() as CodeMemberMethod;
                    newMethod.ImplementationTypes.Add(method.PrivateImplementationType);
                    newMethod.PrivateImplementationType = null;
                    return(newMethod);
                }
            }

            //object o = method.UserData["linq2codedom:partial"];
            //if (o != null)
            //{
            //    bool partial = (bool)o;

            //if (partial)
            //{
            //    string typeStr = null;

            //    switch (language)
            //    {
            //        case CodeDomGenerator.Language.CSharp:
            //            using (Microsoft.CSharp.CSharpCodeProvider provider = new Microsoft.CSharp.CSharpCodeProvider())
            //            {
            //                System.CodeDom.Compiler.CodeGeneratorOptions opts = new System.CodeDom.Compiler.CodeGeneratorOptions();
            //                using (System.CodeDom.Compiler.IndentedTextWriter tw = new System.CodeDom.Compiler.IndentedTextWriter(new StringWriter(), opts.IndentString))
            //                {
            //                    provider.(method.ReturnType, tw, opts);
            //                    typeStr = tw.InnerWriter.ToString();
            //                }
            //            }
            //            break;
            //        case CodeDomGenerator.Language.VB:
            //            using (Microsoft.VisualBasic.VBCodeProvider provider = new Microsoft.VisualBasic.VBCodeProvider())
            //            {
            //                System.CodeDom.Compiler.CodeGeneratorOptions opts = new System.CodeDom.Compiler.CodeGeneratorOptions();
            //                using (System.CodeDom.Compiler.IndentedTextWriter tw = new System.CodeDom.Compiler.IndentedTextWriter(new StringWriter(), opts.IndentString))
            //                {
            //                    tw.Write("(");
            //                    provider.GenerateCodeFromExpression(Left, tw, opts);
            //                    tw.Write(" Xor ");
            //                    provider.GenerateCodeFromExpression(Right, tw, opts);
            //                    tw.Write(")");
            //                    Value = tw.InnerWriter.ToString();
            //                }
            //            }
            //            break;
            //        default:
            //            throw new NotImplementedException(language.ToString());
            //    }
            //}
            //}
            return(method);
        }
        private static void ProcessStmt(CodeStatement stmt, LinqToCodedom.CodeDomGenerator.Language language)
        {
            if (stmt == null)
            {
                return;
            }

            foreach (CodeDirective directive in stmt.StartDirectives)
            {
                ProcessDirective(directive, language);
            }

            foreach (CodeDirective directive in stmt.EndDirectives)
            {
                ProcessDirective(directive, language);
            }

            if (typeof(CodeAssignStatement).IsAssignableFrom(stmt.GetType()))
            {
                ProcessExpr(((CodeAssignStatement)stmt).Left, language);
                ProcessExpr(((CodeAssignStatement)stmt).Right, language);
            }
            else if (typeof(CodeAttachEventStatement).IsAssignableFrom(stmt.GetType()))
            {
                ProcessExpr(((CodeAttachEventStatement)stmt).Listener, language);
            }
            else if (typeof(CodeCommentStatement).IsAssignableFrom(stmt.GetType()))
            {
            }
            else if (typeof(CodeConditionStatement).IsAssignableFrom(stmt.GetType()))
            {
                ProcessExpr(((CodeConditionStatement)stmt).Condition, language);
                ProcessStmt(((CodeConditionStatement)stmt).TrueStatements, language);
                ProcessStmt(((CodeConditionStatement)stmt).FalseStatements, language);
            }
            else if (typeof(CodeExpressionStatement).IsAssignableFrom(stmt.GetType()))
            {
                ProcessExpr(((CodeExpressionStatement)stmt).Expression, language);
            }
            else if (typeof(CodeGotoStatement).IsAssignableFrom(stmt.GetType()))
            {
            }
            else if (typeof(CodeIterationStatement).IsAssignableFrom(stmt.GetType()))
            {
                ProcessStmt(((CodeIterationStatement)stmt).IncrementStatement, language);
                ProcessStmt(((CodeIterationStatement)stmt).InitStatement, language);
                ProcessStmt(((CodeIterationStatement)stmt).Statements, language);
                ProcessExpr(((CodeIterationStatement)stmt).TestExpression, language);
            }
            else if (typeof(CodeLabeledStatement).IsAssignableFrom(stmt.GetType()))
            {
                ProcessStmt(((CodeLabeledStatement)stmt).Statement, language);
            }
            else if (typeof(CodeMethodReturnStatement).IsAssignableFrom(stmt.GetType()))
            {
                ProcessExpr(((CodeMethodReturnStatement)stmt).Expression, language);
            }
            else if (typeof(CodeRemoveEventStatement).IsAssignableFrom(stmt.GetType()))
            {
                ProcessExpr(((CodeRemoveEventStatement)stmt).Listener, language);
            }
            else if (typeof(CodeThrowExceptionStatement).IsAssignableFrom(stmt.GetType()))
            {
                ProcessExpr(((CodeThrowExceptionStatement)stmt).ToThrow, language);
            }
            else if (typeof(CodeTryCatchFinallyStatement).IsAssignableFrom(stmt.GetType()))
            {
                ProcessStmt(((CodeTryCatchFinallyStatement)stmt).FinallyStatements, language);
                ProcessStmt(((CodeTryCatchFinallyStatement)stmt).TryStatements, language);
                foreach (CodeCatchClause c in ((CodeTryCatchFinallyStatement)stmt).CatchClauses)
                {
                    ProcessStmt(c.Statements, language);
                }
            }
            else if (typeof(CodeVariableDeclarationStatement).IsAssignableFrom(stmt.GetType()))
            {
                ProcessExpr(((CodeVariableDeclarationStatement)stmt).InitExpression, language);
            }
            else if (typeof(CodeUsingStatement).IsAssignableFrom(stmt.GetType()))
            {
                ProcessStmt(((CodeUsingStatement)stmt).Statements, language);
                ProcessExpr(((CodeUsingStatement)stmt).UsingExpression, language);
            }
            else if (typeof(CodeForeachStatement).IsAssignableFrom(stmt.GetType()))
            {
                ProcessStmt(((CodeForeachStatement)stmt).Statements, language);
                ProcessExpr(((CodeForeachStatement)stmt).IterExpression, language);
            }
            else if (typeof(CodeDoStatement).IsAssignableFrom(stmt.GetType()))
            {
                ProcessStmt(((CodeDoStatement)stmt).Statements, language);
                ProcessExpr(((CodeDoStatement)stmt).TestExpression, language);
            }
            else if (typeof(CodeWhileStatement).IsAssignableFrom(stmt.GetType()))
            {
                ProcessStmt(((CodeWhileStatement)stmt).Statements, language);
                ProcessExpr(((CodeWhileStatement)stmt).TestExpression, language);
            }
            else if (typeof(CodeSwitchStatement).IsAssignableFrom(stmt.GetType()))
            {
                ProcessExpr(((CodeSwitchStatement)stmt).SwitchExpression, language);
                foreach (CodeSwitchStatement.CaseBlock cb in ((CodeSwitchStatement)stmt).Cases)
                {
                    ProcessExpr(cb.CaseExpression, language);
                    ProcessStmt(cb.Statements, language);
                }
            }
            else if (typeof(CodeLockStatement).IsAssignableFrom(stmt.GetType()))
            {
                ProcessExpr(((CodeLockStatement)stmt).LockExpression, language);
                ProcessStmt(((CodeLockStatement)stmt).Statements, language);
            }

            ICustomCodeDomObject co = stmt as ICustomCodeDomObject;

            if (co != null)
            {
                co.GenerateCode(language);
            }
        }
        internal static CodeTypeMember ProcessMember(CodeTypeMember m, LinqToCodedom.CodeDomGenerator.Language language)
        {
            foreach (CodeDirective directive in m.StartDirectives)
            {
                ProcessDirective(directive, language);
            }

            foreach (CodeDirective directive in m.EndDirectives)
            {
                ProcessDirective(directive, language);
            }

            if (typeof(CodeMemberMethod).IsAssignableFrom(m.GetType()))
            {
                foreach (CodeStatement stmt in ((CodeMemberMethod)m).Statements)
                {
                    ProcessStmt(stmt, language);
                }
            }
            else if (typeof(CodeMemberProperty).IsAssignableFrom(m.GetType()))
            {
                foreach (CodeStatement stmt in ((CodeMemberProperty)m).GetStatements)
                {
                    ProcessStmt(stmt, language);
                }

                foreach (CodeStatement stmt in ((CodeMemberProperty)m).SetStatements)
                {
                    ProcessStmt(stmt, language);
                }
            }
            else if (typeof(CodeConstructor).IsAssignableFrom(m.GetType()))
            {
                ProcessExpr(((CodeConstructor)m).BaseConstructorArgs, language);
                ProcessExpr(((CodeConstructor)m).ChainedConstructorArgs, language);
                ProcessStmt(((CodeConstructor)m).Statements, language);
            }
            else if (typeof(CodeMemberField).IsAssignableFrom(m.GetType()))
            {
                ProcessExpr(((CodeMemberField)m).InitExpression, language);
            }
            else if (typeof(CodeTypeDeclaration).IsAssignableFrom(m.GetType()))
            {
                CodeTypeDeclaration td = (CodeTypeDeclaration)m;
                ProcessTypeDeclaration(td, language);
                foreach (CodeTypeMember ms in td.Members)
                {
                    ProcessMember(ms, language);
                }
            }
            else if (typeof(CodeDefaultProperty).IsAssignableFrom(m.GetType()))
            {
                ProcessMember((m as CodeDefaultProperty).Property, language);
                foreach (CodeExpression p in (m as CodeDefaultProperty).Parameters)
                {
                    ProcessExpr(p, language);
                }
            }
            else if (typeof(CodeReadOnlyField).IsAssignableFrom(m.GetType()))
            {
                ProcessMember((m as CodeReadOnlyField).Field, language);
            }
            else if (typeof(CodePropertyImplementsInterface).IsAssignableFrom(m.GetType()))
            {
                ProcessMember((m as CodePropertyImplementsInterface).Property, language);
            }
            else if (typeof(CodePartialMethod).IsAssignableFrom(m.GetType()))
            {
                ProcessMember((m as CodePartialMethod).Method, language);
            }
            else if (typeof(CodeMemberOperatorOverride).IsAssignableFrom(m.GetType()))
            {
                foreach (CodeExpression p in (m as CodeMemberOperatorOverride).Parameters)
                {
                    ProcessExpr(p, language);
                }
            }
            else if (typeof(CodeCustomEvent).IsAssignableFrom(m.GetType()))
            {
                var ce = m as CodeCustomEvent;
                ProcessMember(ce.Event, language);
                ProcessMember(ce.AddMethod, language);
                ProcessMember(ce.RemoveMethod, language);
                ProcessMember(ce.RaiseMethod, language);
            }

            ICustomCodeDomObject co = m as ICustomCodeDomObject;

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

            if (typeof(CodeMemberMethod).IsAssignableFrom(m.GetType()))
            {
                return(ProcessMethod(m as CodeMemberMethod, language));
            }

            return(m);
        }