Exemple #1
0
        private static Rule Rule_get_state_WITHOUT_AlwaysTrue_property_for_reevaluation()
        {
            CodeBinaryOperatorExpression ruleStateTest = new CodeBinaryOperatorExpression
            {
                Left     = new CodeMethodInvokeExpression(new CodeTypeReferenceExpression("SampleFlow.StaticClass"), "GetState", new CodeExpression[] { new CodeThisReferenceExpression() }),
                Operator = CodeBinaryOperatorType.ValueEquality,
                Right    = new CodePrimitiveExpression("OR")
            };

            CodeMethodInvokeExpression setDiscount = new CodeMethodInvokeExpression(new CodeTypeReferenceExpression("SampleFlow.StaticClass"), "SetDiscount", new CodeExpression[] { new CodeThisReferenceExpression(), new CodePrimitiveExpression(102m) });

            Rule rule15 = new Rule("Rule15")
            {
                Condition = new RuleExpressionCondition(ruleStateTest),
                Priority  = 100
            };

            rule15.ThenActions.Add(new RuleStatementAction(setDiscount));

            return(rule15);
        }
Exemple #2
0
        private static CodeStatement CreateCompareRevisionStatement(CodeTypeDeclaration classType, CodeGenerationInfo generationInfo)
        {
            var ccs = new CodeConditionStatement();

            var left1  = new CodeVariableReferenceExpression("verifyRevision");
            var right1 = new CodePrimitiveExpression(true);
            var left   = new CodeBinaryOperatorExpression(left1, CodeBinaryOperatorType.IdentityEquality, right1);

            var left2  = new CodeCastExpression(typeof(int), new CodePrimitiveExpression(generationInfo.Revision));
            var right2 = new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("dataSet"), "revision");
            var right  = new CodeBinaryOperatorExpression(left2, CodeBinaryOperatorType.IdentityInequality, right2);

            ccs.Condition = new CodeBinaryOperatorExpression(left, CodeBinaryOperatorType.BooleanAnd, right);

            var message   = string.Format("데이터의 리비전 코드 리비전({0})과 다릅니다.", generationInfo.Revision);
            var exception = new CodeObjectCreateExpression("Error", new CodePrimitiveExpression(message));

            ccs.TrueStatements.Add(new CodeThrowExceptionStatement(exception));

            return(ccs);
        }
Exemple #3
0
        private static CodeStatement AddCommitDataMethodFinalHelper(DataFieldDescriptor dataFieldDescriptor, IEnumerable <CodeStatement> statements)
        {
            // CODEGEN:
            // if (this._isSet_email && this._emailNullable != null) {
            //     [statements]
            //     _isSet_email = false;
            // }

            string fieldName = CreateNullableFieldName(dataFieldDescriptor);

            // this._isSet_email
            var fieldIsSetFieldReference =
                new CodeFieldReferenceExpression(
                    new CodeThisReferenceExpression(),
                    IsSetFieldName(dataFieldDescriptor)
                    );

            // this._emailNullable != null
            var expression2 = new CodeBinaryOperatorExpression(
                new CodeFieldReferenceExpression(
                    new CodeThisReferenceExpression(),
                    fieldName
                    ),
                CodeBinaryOperatorType.IdentityInequality,
                new CodePrimitiveExpression(null)
                );

            return(new CodeConditionStatement(
                       new CodeBinaryOperatorExpression(
                           fieldIsSetFieldReference, CodeBinaryOperatorType.BooleanAnd, expression2),
                       statements.Concat(new [] {
                // CODEGEN:
                // this._isSetEmail = false;
                new CodeAssignStatement(
                    fieldIsSetFieldReference,
                    new CodePrimitiveExpression(false)
                    )
            }).ToArray()
                       ));
        }
Exemple #4
0
        public override object Serialize(IDesignerSerializationManager manager, object value)
        {
            if (manager == null)
            {
                throw new ArgumentNullException("manager");
            }
            if (value == null)
            {
                throw new ArgumentNullException("value");
            }

            Enum[]        enums     = null;
            TypeConverter converter = TypeDescriptor.GetConverter(value);

            if (converter.CanConvertTo(typeof(Enum[])))
            {
                enums = (Enum[])converter.ConvertTo(value, typeof(Enum[]));
            }
            else
            {
                enums = new Enum[] { (Enum)value }
            };
            CodeExpression left  = null;
            CodeExpression right = null;

            foreach (Enum e in enums)
            {
                right = GetEnumExpression(e);
                if (left == null) // just the first time
                {
                    left = right;
                }
                else
                {
                    left = new CodeBinaryOperatorExpression(left, CodeBinaryOperatorType.BitwiseOr, right);
                }
            }

            return(left);
        }
        private void CheckOccurrence(CodeStatementCollection getStatements)
        {
            string str;

            Debug.Assert(!this.IsList);
            CodeStatement returnStatement = null;

            if (!(!this.IsNullable ? true : this.DefaultValue != null))
            {
                if (this.typeRef.IsValueType)
                {
                    returnStatement = new CodeMethodReturnStatement(new CodePrimitiveExpression(null));
                }
            }
            else if (this.VerifyRequired)
            {
                Debug.Assert(this.occursInSchema == Occurs.One);
                if (this.propertyOrigin == SchemaOrigin.Element)
                {
                    str = "Element";
                }
                else if (this.propertyOrigin == SchemaOrigin.Attribute)
                {
                    str = "Attribute";
                }
                else
                {
                    str = null;
                }
                string           origin = str;
                CodeExpression[] codePrimitiveExpression = new CodeExpression[] { new CodePrimitiveExpression(string.Concat("Missing required ", origin)) };
                returnStatement = new CodeThrowExceptionStatement(new CodeObjectCreateExpression("LinqToXsdException", codePrimitiveExpression));
            }
            if (returnStatement != null)
            {
                CodeBinaryOperatorExpression codeBinaryOperatorExpression = new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("x"), CodeBinaryOperatorType.IdentityEquality, new CodePrimitiveExpression(null));
                CodeStatement[] codeStatementArray = new CodeStatement[] { returnStatement };
                getStatements.Add(new CodeConditionStatement(codeBinaryOperatorExpression, codeStatementArray));
            }
        }
Exemple #6
0
        /// <summary>
        /// charType == SourceCodeCharType.Letter|| charType == SourceCodeCharType.UnderLine
        /// <para>获取类似如上的代码</para>
        /// </summary>
        /// <returns></returns>
        public CodeExpression GetCondition()
        {
            // charType == SourceCodeCharType.Letter
            //    || charType == SourceCodeCharType.UnderLine
            var first = new CodeBinaryOperatorExpression(
                new CodeVariableReferenceExpression("charType"),
                CodeBinaryOperatorType.IdentityEquality,
                new CodeSnippetExpression("SourceCodeCharType." + this.charTypeList[0]));

            for (int i = 1; i < this.charTypeList.Count; i++)
            {
                var expression = new CodeBinaryOperatorExpression(
                    first, CodeBinaryOperatorType.BooleanOr,
                    new CodeBinaryOperatorExpression(
                        new CodeVariableReferenceExpression("charType"),
                        CodeBinaryOperatorType.IdentityEquality,
                        new CodeSnippetExpression("SourceCodeCharType." + this.charTypeList[i])));
                first = expression;
            }

            return(first);
        }
Exemple #7
0
        private static BinaryOperatorType CreateInstanceForType(Type l, CodeBinaryOperatorExpression code, object right, object left)
        {
            if (l == typeof(Int32))
            {
                return(new BinaryOperatorTypeInt32(code, right, left));
            }

            if (l == typeof(Int16))
            {
                return(new BinaryOperatorTypeInt16(code, right, left));
            }

            if (l == typeof(Int64))
            {
                return(new BinaryOperatorTypeInt64(code, right, left));
            }

            if (l == typeof(sbyte))
            {
                return(new BinaryOperatorTypeSbyte(code, right, left));
            }

            if (l == typeof(float))
            {
                return(new BinaryOperatorTypeFloat(code, right, left));
            }

            if (l == typeof(char))
            {
                return(new BinaryOperatorTypeChar(code, right, left));
            }

            if (l == typeof(byte))
            {
                return(new BinaryOperatorTypeByte(code, right, left));
            }

            throw new InvalidOperationException("Type not suported as binary operator");
        }
        private static Rule Rule_set_state_WITH_update_action_set_targeting_AlwaysTrue_property()
        {
            CodeBinaryOperatorExpression ruleDiscountTest = new CodeBinaryOperatorExpression
            {
                Left     = new CodeMethodInvokeExpression(new CodeTypeReferenceExpression("SampleFlow.StaticClass"), "GetDiscount", new CodeExpression[] { new CodeThisReferenceExpression() }),
                Operator = CodeBinaryOperatorType.ValueEquality,
                Right    = new CodePrimitiveExpression(103m)
            };

            CodeMethodInvokeExpression setState = new CodeMethodInvokeExpression(new CodeTypeReferenceExpression("SampleFlow.StaticClass"), "SetState", new CodeExpression[] { new CodeThisReferenceExpression(), new CodePrimitiveExpression("WA") });

            Rule rule16 = new Rule("Rule16")
            {
                Condition = new RuleExpressionCondition(ruleDiscountTest),
                Priority  = 0
            };

            rule16.ThenActions.Add(new RuleStatementAction(setState));
            rule16.ThenActions.Add(new RuleUpdateAction("this/AlwaysTrue"));

            return(rule16);
        }
        private static Rule Rule_with_list_initialization()
        {
            // define first predicate: this.State == "SC"
            CodeBinaryOperatorExpression ruleStateTest = new CodeBinaryOperatorExpression
            {
                Left     = new CodePropertyReferenceExpression(new CodeThisReferenceExpression(), "State"),
                Operator = CodeBinaryOperatorType.ValueEquality,
                Right    = new CodePrimitiveExpression("SC")
            };

            //this.SetCollection(new System.Collections.ObjectModel.Collection<object>(new object[] { "AValue", "BValue"}))
            CodeMethodInvokeExpression methodInvokeSetCollection = new CodeMethodInvokeExpression
                                                                   (
                new CodeThisReferenceExpression(),
                "SetCollection",
                new CodeObjectCreateExpression
                (
                    new CodeTypeReference
                    (
                        "System.Collections.ObjectModel.Collection",
                        new CodeTypeReference[] { new CodeTypeReference("System.Object") }
                    ),
                    new CodeArrayCreateExpression
                    (
                        "System.Object",
                        new CodeExpression[] { new CodePrimitiveExpression("AValue"), new CodePrimitiveExpression("BValue") }
                    )
                )
                                                                   );

            Rule rule9 = new Rule("Rule9")
            {
                Condition = new RuleExpressionCondition(ruleStateTest)
            };

            rule9.ThenActions.Add(new RuleStatementAction(methodInvokeSetCollection));

            return(rule9);
        }
Exemple #10
0
        public override CodeExpression ExportCode(IMethodCompile method)
        {
            MathNode.Trace("{0}.ExportCode", this.GetType().Name);
            CodeVariableReferenceExpression sum = new CodeVariableReferenceExpression(((IVariable)this[4]).CodeVariableName);

            this[2].AssignCodeExp(this.GetParameterCode(method, 0), ((MathNodeVariable)this[3]).CodeVariableName);
            CodeExpression fa = this.GetParameterCode(method, 2);

            this[2].AssignCodeExp(this.GetParameterCode(method, 1), ((MathNodeVariable)this[3]).CodeVariableName);
            CodeExpression fb = this.GetParameterCode(method, 2);

            this[2].AssignCodeExp(null, ((MathNodeVariable)this[3]).CodeVariableName);
            CodeExpression f2 = new CodeBinaryOperatorExpression(
                new CodeBinaryOperatorExpression(fa, CodeBinaryOperatorType.Add, fb), CodeBinaryOperatorType.Divide,
                new CodePrimitiveExpression(2.0));
            CodeExpression f  = new CodeBinaryOperatorExpression(f2, CodeBinaryOperatorType.Add, sum);
            CodeExpression ba = new CodeBinaryOperatorExpression(
                new CodeBinaryOperatorExpression(this.GetParameterCode(method, 1), CodeBinaryOperatorType.Subtract, this.GetParameterCode(method, 0)),
                CodeBinaryOperatorType.Divide, new CodePrimitiveExpression(_intervals));

            return(new CodeBinaryOperatorExpression(ba, CodeBinaryOperatorType.Multiply, f));
        }
Exemple #11
0
        private static string ConvertNodesToStringExpression(FilterExpressionNodeCollection nodes)
        {
            FilterExpressionNodeCollection newNodes = EliminateEmptyNodes(nodes);

            // If not nodes found return null
            if (newNodes.Count == 0)
            {
                return(null);
            }

            // If only one node, return it as an expression
            if (newNodes.Count == 1)
            {
                return(ConvertNodeToStringExpression(newNodes[0]));
            }

            // Start processing more than 1 node
            string masterExpression = String.Empty;

            foreach (FilterExpressionNode node in newNodes)
            {
                CodeBinaryOperatorExpression currentExpression = new CodeBinaryOperatorExpression();
                if (node.NodeType == FilterExpressionNodeType.Element)
                {
                    masterExpression = AddStringExpression(masterExpression, "&&", ConvertNodeToStringExpression(node));
                }
                else if (node.NodeType == FilterExpressionNodeType.AndBlock)
                {
                    masterExpression = AddStringExpression(masterExpression, "&&", ConvertNodesToStringExpression(node.ChildNodes));
                }
                else if (node.NodeType == FilterExpressionNodeType.OrBlock)
                {
                    masterExpression = AddStringExpression(masterExpression, "||", ConvertNodesToStringExpression(node.ChildNodes));
                }
            }

            return(masterExpression);
        }
Exemple #12
0
        protected virtual void CreateConstructor(CodeStatementCollection localVars,
                                                 CodeStatementCollection trueStmt)
        {
            CodeConstructor ctor = new CodeConstructor();

            ctor.Attributes = MemberAttributes.Public;
            mainClass.Members.Add(ctor);

            if (localVars != null)
            {
                ctor.Statements.AddRange(localVars);
            }

            AssignAppRelativeVirtualPath(ctor);

            CodeFieldReferenceExpression initialized = GetMainClassFieldReferenceExpression("__initialized");

            CodeBinaryOperatorExpression bin;

            bin = new CodeBinaryOperatorExpression(initialized,
                                                   CodeBinaryOperatorType.ValueEquality,
                                                   new CodePrimitiveExpression(false));

            CodeAssignStatement assign = new CodeAssignStatement(initialized,
                                                                 new CodePrimitiveExpression(true));

            CodeConditionStatement cond = new CodeConditionStatement();

            cond.Condition = bin;

            if (trueStmt != null)
            {
                cond.TrueStatements.AddRange(trueStmt);
            }
            cond.TrueStatements.Add(assign);
            ctor.Statements.Add(cond);
            AddStatementsToConstructor(ctor);
        }
        public static CodeMemberMethod CreateXRootMethod(string returnType, string methodName, string[][] paramList)
        {
            CodeTypeReference xRootType    = new CodeTypeReference(returnType);
            CodeMemberMethod  staticMethod = new CodeMemberMethod()
            {
                Name       = methodName,
                Attributes = MemberAttributes.Abstract | MemberAttributes.Final | MemberAttributes.Static | MemberAttributes.FamilyAndAssembly | MemberAttributes.FamilyOrAssembly | MemberAttributes.Public,
                ReturnType = xRootType
            };

            CodeExpression[] parameterExp = new CodeExpression[(int)paramList.Length];
            for (int i = 0; i < (int)paramList.Length; i++)
            {
                string[] paramRef = paramList[i];
                staticMethod.Parameters.Add(CodeDomHelper.CreateParameter(paramRef[1], paramRef[0]));
                parameterExp[i] = new CodeVariableReferenceExpression(paramRef[1]);
            }
            CodeExpression rootExp = new CodeVariableReferenceExpression("root");
            CodeExpression doc     = new CodeFieldReferenceExpression(rootExp, "doc");

            staticMethod.Statements.Add(new CodeVariableDeclarationStatement(xRootType, "root", new CodeObjectCreateExpression(xRootType, new CodeExpression[0])));
            staticMethod.Statements.Add(new CodeAssignStatement(doc, CodeDomHelper.CreateMethodCall(new CodeTypeReferenceExpression("XDocument"), methodName, parameterExp)));
            CodeStatementCollection     statements = staticMethod.Statements;
            CodeTypeReferenceExpression codeTypeReferenceExpression = new CodeTypeReferenceExpression("XTypedServices");

            CodeExpression[] codePropertyReferenceExpression = new CodeExpression[] { new CodePropertyReferenceExpression(doc, "Root"), CodeDomHelper.SingletonTypeManager() };
            statements.Add(new CodeVariableDeclarationStatement("XTypedElement", "typedRoot", CodeDomHelper.CreateMethodCall(codeTypeReferenceExpression, "ToXTypedElement", codePropertyReferenceExpression)));
            CodeStatementCollection      codeStatementCollection      = staticMethod.Statements;
            CodeBinaryOperatorExpression codeBinaryOperatorExpression = new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("typedRoot"), CodeBinaryOperatorType.IdentityEquality, new CodePrimitiveExpression(null));

            CodeStatement[] codeThrowExceptionStatement = new CodeStatement[1];
            codePropertyReferenceExpression = new CodeExpression[] { new CodePrimitiveExpression("Invalid root element in xml document.") };
            codeThrowExceptionStatement[0]  = new CodeThrowExceptionStatement(new CodeObjectCreateExpression("LinqToXsdException", codePropertyReferenceExpression));
            codeStatementCollection.Add(new CodeConditionStatement(codeBinaryOperatorExpression, codeThrowExceptionStatement));
            staticMethod.Statements.Add(new CodeAssignStatement(new CodeFieldReferenceExpression(rootExp, "rootObject"), new CodeVariableReferenceExpression("typedRoot")));
            staticMethod.Statements.Add(new CodeMethodReturnStatement(rootExp));
            return(staticMethod);
        }
        private static Rule Rule_with_child_and_granchild_reference()
        {
            // define first predicate: this.State == "GA"
            CodeBinaryOperatorExpression ruleStateTest = new CodeBinaryOperatorExpression
            {
                Left     = new CodePropertyReferenceExpression(new CodeThisReferenceExpression(), "State"),
                Operator = CodeBinaryOperatorType.ValueEquality,
                Right    = new CodePrimitiveExpression("GA")
            };

            //this.FirstClass.SecondClass.Property1 = "This Value"
            CodeAssignStatement setProperty1Action = new CodeAssignStatement
                                                     (
                new CodePropertyReferenceExpression
                (
                    new CodePropertyReferenceExpression
                    (
                        new CodePropertyReferenceExpression
                        (
                            new CodeThisReferenceExpression(),
                            "FirstClass"
                        ),
                        "SecondClass"
                    ),
                    "Property1"
                ),
                new CodePrimitiveExpression("This Value")
                                                     );

            Rule rule10 = new Rule("Rule10")
            {
                Condition = new RuleExpressionCondition(ruleStateTest)
            };

            rule10.ThenActions.Add(new RuleStatementAction(setProperty1Action));

            return(rule10);
        }
        private static Rule Rule_with_generic_object_initialization()
        {
            // define first predicate: this.State == "TN"
            CodeBinaryOperatorExpression ruleStateTest = new CodeBinaryOperatorExpression
            {
                Left     = new CodePropertyReferenceExpression(new CodeThisReferenceExpression(), "State"),
                Operator = CodeBinaryOperatorType.ValueEquality,
                Right    = new CodePrimitiveExpression("TN")
            };

            //this.SetGenericObject(new SampleFlow.GenericClass<string>(7, "VName", "Stay", "ObjectData")
            CodeMethodInvokeExpression methodInvokeSetGenericObject = new CodeMethodInvokeExpression
                                                                      (
                new CodeThisReferenceExpression(),
                "SetGenericObject",
                new CodeObjectCreateExpression
                (
                    new CodeTypeReference
                    (
                        "SampleFlow.GenericClass",
                        new CodeTypeReference[] { new CodeTypeReference("System.String") }
                    ),
                    new CodePrimitiveExpression(7),
                    new CodePrimitiveExpression("VName"),
                    new CodePrimitiveExpression("Stay"),
                    new CodePrimitiveExpression("ObjectData")
                )
                                                                      );

            Rule rule11 = new Rule("Rule11")
            {
                Condition = new RuleExpressionCondition(ruleStateTest)
            };

            rule11.ThenActions.Add(new RuleStatementAction(methodInvokeSetGenericObject));

            return(rule11);
        }
Exemple #16
0
        private void ImplementIXmlSerializable()
        {
            string           interfaceName        = "IXmlSerializable";
            string           typeManagerName      = NameGenerator.GetServicesClassName();
            string           methodName           = string.Concat(this.clrTypeInfo.clrtypeName, "SchemaProvider");
            CodeMemberMethod schemaProviderMethod = CodeDomHelper.CreateMethod(methodName, MemberAttributes.Abstract | MemberAttributes.Final | MemberAttributes.Static | MemberAttributes.FamilyAndAssembly | MemberAttributes.FamilyOrAssembly | MemberAttributes.Public, null);

            schemaProviderMethod.Parameters.Add(new CodeParameterDeclarationExpression("XmlSchemaSet", "schemas"));
            CodeStatementCollection     statements = schemaProviderMethod.Statements;
            CodeTypeReferenceExpression codeTypeReferenceExpression = new CodeTypeReferenceExpression(typeManagerName);

            CodeExpression[] codeVariableReferenceExpression = new CodeExpression[] { new CodeVariableReferenceExpression("schemas") };
            statements.Add(CodeDomHelper.CreateMethodCall(codeTypeReferenceExpression, "AddSchemas", codeVariableReferenceExpression));
            codeVariableReferenceExpression = new CodeExpression[] { new CodePrimitiveExpression(this.clrTypeInfo.schemaName), new CodePrimitiveExpression(this.clrTypeInfo.schemaNs) };
            CodeExpression qNameExp = new CodeObjectCreateExpression("XmlQualifiedName", codeVariableReferenceExpression);

            if (this.clrTypeInfo.typeOrigin != SchemaOrigin.Element)
            {
                schemaProviderMethod.ReturnType = new CodeTypeReference("XmlQualifiedName");
                schemaProviderMethod.Statements.Add(new CodeMethodReturnStatement(qNameExp));
            }
            else
            {
                CodeStatementCollection         codeStatementCollection         = schemaProviderMethod.Statements;
                CodePropertyReferenceExpression codePropertyReferenceExpression = new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("schemas"), "GlobalElements");
                codeVariableReferenceExpression = new CodeExpression[] { qNameExp };
                codeStatementCollection.Add(new CodeVariableDeclarationStatement("XmlSchemaElement", "element", new CodeCastExpression("XmlSchemaElement", new CodeIndexerExpression(codePropertyReferenceExpression, codeVariableReferenceExpression))));
                CodeStatementCollection      statements1 = schemaProviderMethod.Statements;
                CodeBinaryOperatorExpression codeBinaryOperatorExpression = new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("element"), CodeBinaryOperatorType.IdentityInequality, new CodePrimitiveExpression(null));
                CodeStatement[] codeMethodReturnStatement = new CodeStatement[] { new CodeMethodReturnStatement(new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("element"), "ElementSchemaType")) };
                statements1.Add(new CodeConditionStatement(codeBinaryOperatorExpression, codeMethodReturnStatement));
                schemaProviderMethod.Statements.Add(new CodeMethodReturnStatement(new CodePrimitiveExpression(null)));
                schemaProviderMethod.ReturnType = new CodeTypeReference("XmlSchemaType");
            }
            this.decl.CustomAttributes.Add(CodeDomHelper.SchemaProviderAttribute(this.clrTypeInfo.clrtypeName));
            this.decl.BaseTypes.Add(interfaceName);
            this.decl.Members.Add(schemaProviderMethod);
        }
        /// <summary>
        /// Converts the nodes to expression.
        /// </summary>
        /// <param name="nodes">The nodes.</param>
        /// <returns></returns>
        protected virtual CodeBinaryOperatorExpression ConvertNodesToExpression(FilterExpressionNodeCollection nodes)
        {
            FilterExpressionNodeCollection newNodes = EliminateEmptyNodes(nodes);

            // If not nodes found return null
            if (newNodes.Count == 0)
            {
                return(null);
            }

            // If only one node, return it as an expression
            if (newNodes.Count == 1)
            {
                return(ConvertNodeToExpression(newNodes[0]));
            }

            // Start processing more than 1 node
            CodeBinaryOperatorExpression masterExpression = null;

            foreach (FilterExpressionNode node in newNodes)
            {
                CodeBinaryOperatorExpression currentExpression = new CodeBinaryOperatorExpression();
                if (node.NodeType == FilterExpressionNodeType.Element)
                {
                    masterExpression = AddExpression(masterExpression, CodeBinaryOperatorType.BooleanAnd, ConvertNodeToExpression(node));
                }
                else if (node.NodeType == FilterExpressionNodeType.AndBlock)
                {
                    masterExpression = AddExpression(masterExpression, CodeBinaryOperatorType.BooleanAnd, ConvertNodesToExpression(node.ChildNodes));
                }
                else if (node.NodeType == FilterExpressionNodeType.OrBlock)
                {
                    masterExpression = AddExpression(masterExpression, CodeBinaryOperatorType.BooleanOr, ConvertNodesToExpression(node.ChildNodes));
                }
            }

            return(masterExpression);
        }
        private CodeMemberProperty CreateUntypedProperty(CodeFieldReferenceExpression fieldRef)
        {
            CodeMemberProperty xElementProperty = CodeDomHelper.CreateProperty(new CodeTypeReference("XElement"), true);

            xElementProperty.Name       = "Untyped";
            xElementProperty.Attributes = MemberAttributes.Override | MemberAttributes.FamilyAndAssembly | MemberAttributes.FamilyOrAssembly | MemberAttributes.Public;
            CodePropertyReferenceExpression baseUntyped = new CodePropertyReferenceExpression(new CodeBaseReferenceExpression(), "Untyped");

            xElementProperty.GetStatements.Add(new CodeMethodReturnStatement(baseUntyped));
            xElementProperty.SetStatements.Add(new CodeAssignStatement(baseUntyped, CodeDomHelper.SetValue()));
            if (!this.clrTypeInfo.IsSubstitutionHead)
            {
                xElementProperty.SetStatements.Add(new CodeAssignStatement(new CodePropertyReferenceExpression(fieldRef, "Untyped"), CodeDomHelper.SetValue()));
            }
            else
            {
                CodeStatementCollection      setStatements = xElementProperty.SetStatements;
                CodeBinaryOperatorExpression codeBinaryOperatorExpression = new CodeBinaryOperatorExpression(fieldRef, CodeBinaryOperatorType.IdentityInequality, new CodePrimitiveExpression(null));
                CodeStatement[] codeAssignStatement = new CodeStatement[] { new CodeAssignStatement(new CodePropertyReferenceExpression(fieldRef, "Untyped"), CodeDomHelper.SetValue()) };
                setStatements.Add(new CodeConditionStatement(codeBinaryOperatorExpression, codeAssignStatement));
            }
            return(xElementProperty);
        }
        public void Visit(WhenLiteralStatement statement)
        {
            CodeStatementCollection collection = new CodeStatementCollection();
            var arg = VisitChild(statement.Literal);

            var condition = new CodeConditionStatement();

            if (arg.Tag != null) //this is a null literal
            {
                condition.Condition = new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("var"), CodeBinaryOperatorType.IdentityEquality, new CodePrimitiveExpression(null));
            }
            else
            {
                var preCondition = new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("var"), CodeBinaryOperatorType.IdentityInequality, new CodePrimitiveExpression(null));
                condition.Condition = new CodeBinaryOperatorExpression(preCondition, CodeBinaryOperatorType.BooleanAnd, new CodeMethodInvokeExpression(new CodeVariableReferenceExpression("var"), "Equals", arg.CodeExpression));
            }

            var then = VisitChild(statement.Then);

            condition.TrueStatements.Add(new CodeMethodReturnStatement(then.CodeExpression));
            _codeStack.Peek().Tag = then.Tag;
            _codeStack.Peek().ParentStatements.Add(condition);
        }
Exemple #20
0
        public override void AddBind(IShaderDom shader, Action <CodeStatement, string> add)
        {
            //call the preshaders

            if (vertexPreShader != null)
            {
                CodeExpression call      = new CodeMethodInvokeExpression(shader.Instance, "vspre");
                CodeExpression condition = new CodeBinaryOperatorExpression(new CodeFieldReferenceExpression(shader.VertexPreShaderRegistersRef, "change"), CodeBinaryOperatorType.IdentityEquality, new CodePrimitiveExpression(true));
                CodeStatement  invoke    = new CodeConditionStatement(condition, shader.ETS(call));

                add(invoke, "run the vertex preshader");
            }

            //pixel
            if (pixelPreShader != null)
            {
                CodeExpression call      = new CodeMethodInvokeExpression(shader.Instance, "pspre");
                CodeExpression condition = new CodeBinaryOperatorExpression(new CodeFieldReferenceExpression(shader.PixelPreShaderRegistersRef, "change"), CodeBinaryOperatorType.IdentityEquality, new CodePrimitiveExpression(true));
                CodeStatement  invoke    = new CodeConditionStatement(condition, shader.ETS(call));

                add(invoke, "run the pixel preshader");
            }
        }
        private static Rule Rule_with_multiple_conditions()
        {
            // define first predicate: this.State == "MD"
            CodeBinaryOperatorExpression ruleStateTest = new CodeBinaryOperatorExpression
            {
                Left     = new CodePropertyReferenceExpression(new CodeThisReferenceExpression(), "State"),
                Operator = CodeBinaryOperatorType.ValueEquality,
                Right    = new CodePrimitiveExpression("MD")
            };

            //this.boolMethod()
            CodeMethodInvokeExpression boolMethodInvoke = new CodeMethodInvokeExpression(new CodeThisReferenceExpression(), "BoolMethod", new CodeExpression[] { });

            //combine both expressions this.state == "MD" && this.boolMethod()
            CodeBinaryOperatorExpression codeBothExpression = new CodeBinaryOperatorExpression
            {
                Left     = ruleStateTest,
                Operator = CodeBinaryOperatorType.BooleanAnd,
                Right    = boolMethodInvoke
            };

            //discount action this.Discount = 400
            CodeAssignStatement discountAction = new CodeAssignStatement
                                                 (
                new CodePropertyReferenceExpression(new CodeThisReferenceExpression(), "Discount"),
                new CodePrimitiveExpression(400)
                                                 );

            Rule rule4 = new Rule("Rule4")
            {
                Condition = new RuleExpressionCondition(codeBothExpression)
            };

            rule4.ThenActions.Add(new RuleStatementAction(discountAction));

            return(rule4);
        }
Exemple #22
0
        public static CodeTypeDeclaration EncapsulateField(this CodeTypeDeclaration typeDeclaration,
                                                           CodeMemberField field, string name, CodeExpression lazyValue, CodeExpression lazyCondition = null)
        {
            var p = new CodeMemberProperty
            {
                Name       = name,
                Type       = field.Type,
                HasGet     = true,
                Attributes = MemberAttributes.Public
            };

            typeDeclaration.Members.Add(p);

            var            r = new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), field.Name);
            var            lazyConditionStatement = new CodeConditionStatement();
            CodeExpression finalLazyCondition     = lazyCondition;

            if (finalLazyCondition == null)
            {
                var defaultConditionStatement =
                    new CodeBinaryOperatorExpression(
                        r,
                        CodeBinaryOperatorType.ValueEquality, new CodeSnippetExpression("null"));

                finalLazyCondition = defaultConditionStatement;
            }

            lazyConditionStatement.Condition = finalLazyCondition;
            lazyConditionStatement.TrueStatements.Add(new CodeAssignStatement(r, lazyValue));

            p.GetStatements.Add(lazyConditionStatement);
            p.GetStatements.Add(
                new CodeMethodReturnStatement(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(),
                                                                               field.Name)));

            return(typeDeclaration);
        }
Exemple #23
0
        public void Test_Rule_method_invocation_missing_required_parameter_throws_InvalidOperationException()
        {
            //Arrange
            RuleSet ruleSet = new RuleSet {
                Name = "MyRuleSet", ChainingBehavior = RuleChainingBehavior.Full
            };

            ruleSet.Rules.Add(BuildRule());

            //Act
            Assert.Throws <InvalidOperationException>(() => CreateRuleEngine(ruleSet));

            Rule BuildRule()
            {
                // define first predicate: this.State == "MA"
                CodeBinaryOperatorExpression ruleStateTest = new CodeBinaryOperatorExpression
                {
                    Left     = new CodePropertyReferenceExpression(new CodeThisReferenceExpression(), "State"),
                    Operator = CodeBinaryOperatorType.ValueEquality,
                    Right    = new CodePrimitiveExpression("MA")
                };

                //action SampleFlow.FlowEntity.SetDefaultState("NH")
                CodeMethodInvokeExpression methodInvoke = new CodeMethodInvokeExpression
                                                          (
                    new CodeThisReferenceExpression(),
                    "SetValues",
                    new CodeExpression[] { new CodePrimitiveExpression("AAA") }
                                                          );

                return(new Rule("Rule1")
                {
                    Condition = new RuleExpressionCondition(ruleStateTest),
                    ThenActions = { new RuleStatementAction(methodInvoke) }
                });
            }
        }
Exemple #24
0
        public void TypeReferenceExpressionTest()
        {
            StringBuilder sb = new StringBuilder();

            using (StringWriter sw = new StringWriter(sb))
            {
                CodeThisReferenceExpression  thisRef     = new CodeThisReferenceExpression();
                CodeFieldReferenceExpression parentField = new CodeFieldReferenceExpression();
                parentField.TargetObject = thisRef;
                parentField.FieldName    = "Parent";

                CodeBinaryOperatorExpression expression = new CodeBinaryOperatorExpression(
                    parentField,
                    CodeBinaryOperatorType.IdentityInequality,
                    new CodePrimitiveExpression(null));

                Assert.AreEqual("(Not (Me.Parent) Is Nothing)", Generate(expression, sw), "#1");
                sw.Close();
            }

            sb = new StringBuilder();
            using (StringWriter sw = new StringWriter(sb))
            {
                CodeThisReferenceExpression  thisRef     = new CodeThisReferenceExpression();
                CodeFieldReferenceExpression parentField = new CodeFieldReferenceExpression();
                parentField.TargetObject = thisRef;
                parentField.FieldName    = "Parent";

                CodeBinaryOperatorExpression expression = new CodeBinaryOperatorExpression(
                    new CodePrimitiveExpression(null),
                    CodeBinaryOperatorType.IdentityInequality,
                    parentField);

                Assert.AreEqual("(Not (Me.Parent) Is Nothing)", Generate(expression, sw), "#2");
                sw.Close();
            }
        }
        internal static CodeMemberMethod AddAsyncMethod(CodeTypeDeclaration codeClass, string methodName,
                                                        string[] parameterTypeNames, string[] parameterNames, string callbackMember, string callbackName, string userState)
        {
            CodeMemberMethod asyncCodeMethod = WebCodeGenerator.AddMethod(codeClass, methodName,
                                                                          new CodeFlags[parameterNames.Length], parameterTypeNames, parameterNames, typeof(void).FullName, null, CodeFlags.IsPublic);

            asyncCodeMethod.Comments.Add(new CodeCommentStatement(Res.GetString(Res.CodeRemarks), true));
            CodeMethodInvokeExpression invoke = new CodeMethodInvokeExpression(new CodeThisReferenceExpression(), methodName);

            for (int i = 0; i < parameterNames.Length; i++)
            {
                invoke.Parameters.Add(new CodeArgumentReferenceExpression(parameterNames[i]));
            }
            invoke.Parameters.Add(new CodePrimitiveExpression(null));
            asyncCodeMethod.Statements.Add(invoke);

            asyncCodeMethod = WebCodeGenerator.AddMethod(codeClass, methodName,
                                                         new CodeFlags[parameterNames.Length], parameterTypeNames, parameterNames, typeof(void).FullName, null, CodeFlags.IsPublic);

            asyncCodeMethod.Comments.Add(new CodeCommentStatement(Res.GetString(Res.CodeRemarks), true));

            asyncCodeMethod.Parameters.Add(new CodeParameterDeclarationExpression(typeof(object), userState));

            CodeFieldReferenceExpression member         = new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), callbackMember);
            CodeBinaryOperatorExpression checkIfNull    = new CodeBinaryOperatorExpression(member, CodeBinaryOperatorType.IdentityEquality, new CodePrimitiveExpression(null));
            CodeDelegateCreateExpression createDelegate = new CodeDelegateCreateExpression();

            createDelegate.DelegateType = new CodeTypeReference(typeof(SendOrPostCallback));
            createDelegate.TargetObject = new CodeThisReferenceExpression();
            createDelegate.MethodName   = callbackName;

            CodeStatement[] trueStatements = new CodeStatement[] { new CodeAssignStatement(member, createDelegate) };
            asyncCodeMethod.Statements.Add(new CodeConditionStatement(checkIfNull, trueStatements, new CodeStatement[0]));

            return(asyncCodeMethod);
        }
Exemple #26
0
            /// <summary>
            /// Generates the generic Equals method implementing Equals
            /// </summary>
            /// <param name="input">The NMeta data type</param>
            /// <param name="context">The transformation context</param>
            protected virtual CodeMemberMethod CreateGenericEquals(IDataType input, CodeTypeDeclaration output, ITransformationContext context)
            {
                var thisTypeRef = output.GetReferenceForType();
                var equals      = new CodeMemberMethod()
                {
                    Name       = "Equals",
                    ReturnType = new CodeTypeReference(typeof(bool)),
                    Attributes = MemberAttributes.Public | MemberAttributes.Final
                };

                equals.Parameters.Add(new CodeParameterDeclarationExpression(thisTypeRef, "other"));

                equals.WriteDocumentation("Determines whether this structure and the given struct should be treated as equivalent",
                                          "True, if this structure and the given other object are equivalent", new Dictionary <string, string>()
                {
                    { "other", "The other object" }
                });

                var argRef      = new CodeArgumentReferenceExpression("other");
                var expressions = input.Attributes.Select(prop =>
                {
                    var propName = prop.Name.ToPascalCase();
                    var thisRef  = new CodePropertyReferenceExpression(new CodeThisReferenceExpression(), propName);
                    var otherRef = new CodePropertyReferenceExpression(new CodeArgumentReferenceExpression("other"), propName);
                    return(new CodeBinaryOperatorExpression(thisRef, CodeBinaryOperatorType.IdentityEquality, otherRef));
                }).ToArray();

                var exp = expressions[0];

                for (int i = 0; i < expressions.Length; i++)
                {
                    exp = new CodeBinaryOperatorExpression(exp, CodeBinaryOperatorType.BooleanAnd, expressions[i]);
                }
                equals.Statements.Add(new CodeMethodReturnStatement(exp));
                return(equals);
            }
Exemple #27
0
        private void GenerateBitVectorPropertySet(CodeMemberProperty prop, string fieldName, uint mask, int offset, NativeBitVector bitVector)
        {
            prop.HasSet = true;

            // Shift it
            CodeExpression exprShift = default(CodeExpression);

            if (offset != 0)
            {
                exprShift = new CodeBinaryOperatorExpression(new CodePropertySetValueReferenceExpression(), CodeBinaryOperatorType.Multiply, new CodePrimitiveExpression(Math.Pow(2, offset)));
            }
            else
            {
                exprShift = new CodePropertySetValueReferenceExpression();
            }

            // Or it with the current
            CodeBinaryOperatorExpression exprOr = new CodeBinaryOperatorExpression(exprShift, CodeBinaryOperatorType.BitwiseOr, new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), fieldName));

            // Assign it to the field
            CodeAssignStatement asg = new CodeAssignStatement(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), fieldName), new CodeCastExpression(new CodeTypeReference(typeof(uint)), exprOr));

            prop.SetStatements.Add(asg);
        }
        private static Rule Rule_call_method_in_static_generic_class()
        {
            CodeBinaryOperatorExpression ruleStateTest = new CodeBinaryOperatorExpression
            {
                Left     = new CodePropertyReferenceExpression(new CodeThisReferenceExpression(), "State"),
                Operator = CodeBinaryOperatorType.ValueEquality,
                Right    = new CodePrimitiveExpression("AZ")
            };

            CodePropertyReferenceExpression myArrayRef = new CodePropertyReferenceExpression(new CodeThisReferenceExpression(), "MyArray");
            CodePropertyReferenceExpression myListRef  = new CodePropertyReferenceExpression(new CodeThisReferenceExpression(), "MyList");

            CodeAssignStatement convertListToArray = new CodeAssignStatement
                                                     (
                myArrayRef,
                new CodeMethodInvokeExpression
                (
                    new CodeTypeReferenceExpression
                    (
                        new CodeTypeReference("SampleFlow.ListConverter",
                                              new CodeTypeReference[] { new CodeTypeReference("System.String") })
                    ),
                    "StaticMethod",
                    myListRef
                )
                                                     );

            Rule rule13 = new Rule("Rule13")
            {
                Condition = new RuleExpressionCondition(ruleStateTest)
            };

            rule13.ThenActions.Add(new RuleStatementAction(convertListToArray));

            return(rule13);
        }
Exemple #29
0
 private void ValidateBinaryOperatorExpression(CodeBinaryOperatorExpression e)
 {
     ValidateExpression(e.Left);
     ValidateExpression(e.Right);
 }
Exemple #30
0
        protected virtual void GenerateBinaryOperatorExpression(CodeBinaryOperatorExpression e)
        {
            bool indentedExpression = false;
            Output.Write('(');

            GenerateExpression(e.Left);
            Output.Write(' ');

            if (e.Left is CodeBinaryOperatorExpression || e.Right is CodeBinaryOperatorExpression)
            {
                // In case the line gets too long with nested binary operators, we need to output them on
                // different lines. However we want to indent them to maintain readability, but this needs
                // to be done only once;
                if (!_inNestedBinary)
                {
                    indentedExpression = true;
                    _inNestedBinary = true;
                    Indent += 3;
                }
                ContinueOnNewLine("");
            }

            OutputOperator(e.Operator);

            Output.Write(' ');
            GenerateExpression(e.Right);

            Output.Write(')');
            if (indentedExpression)
            {
                Indent -= 3;
                _inNestedBinary = false;
            }
        }
    public override void BuildTree (CodeDomProvider provider, CodeCompileUnit cu) {

        CodeNamespace nspace = new CodeNamespace ("NSPC");
        nspace.Imports.Add (new CodeNamespaceImport ("System"));
        cu.Namespaces.Add (nspace);


        // declare class with fields

        // GENERATES (C#):
        //    public class ClassWithFields {
        //        // only if provider supports GeneratorSupport.PublicStaticMembers
        //        public static string Microsoft = "hi";
        //        public static int StaticPublicField = 5;
        //        // ---
        //
        //        public int NonStaticPublicField = 6;
        //        private int PrivateField = 7;
        //        public int UsePrivateField(int i) {
        //            this.PrivateField = i;
        //            return this.PrivateField;
        //        }
        //    }
        CodeTypeDeclaration cd = new CodeTypeDeclaration ("ClassWithFields");
        cd.IsClass = true;
        nspace.Types.Add (cd);

        CodeMemberField field;
        if (Supports (provider, GeneratorSupport.PublicStaticMembers)) {

            field = new CodeMemberField ("System.String", "Microsoft");
            field.Attributes = MemberAttributes.Public | MemberAttributes.Static;
            field.InitExpression = new CodePrimitiveExpression ("hi");
            cd.Members.Add (field);

            field = new CodeMemberField ();
            field.Name = "StaticPublicField";
            field.Attributes = MemberAttributes.Public | MemberAttributes.Static;
            field.Type = new CodeTypeReference (typeof (int));
            field.InitExpression = new CodePrimitiveExpression (5);
            cd.Members.Add (field);
        }

        field = new CodeMemberField ();
        field.Name = "NonStaticPublicField";
        field.Attributes = MemberAttributes.Public | MemberAttributes.Final;
        field.Type = new CodeTypeReference (typeof (int));
        field.InitExpression = new CodePrimitiveExpression (6);
        cd.Members.Add (field);

        field = new CodeMemberField ();
        field.Name = "PrivateField";
        field.Attributes = MemberAttributes.Private | MemberAttributes.Final;
        field.Type = new CodeTypeReference (typeof (int));
        field.InitExpression = new CodePrimitiveExpression (7);
        cd.Members.Add (field);

        // create a method to test access to private field
        CodeMemberMethod cmm = new CodeMemberMethod ();
        cmm.Name = "UsePrivateField";
        cmm.Attributes = MemberAttributes.Public | MemberAttributes.Final;
        cmm.ReturnType = new CodeTypeReference (typeof (int));
        cmm.Parameters.Add (new CodeParameterDeclarationExpression (new CodeTypeReference (typeof (int)), "i"));
        cmm.Statements.Add (new CodeAssignStatement (new CodeFieldReferenceExpression (new CodeThisReferenceExpression (), "PrivateField"), new CodeArgumentReferenceExpression ("i")));
        cmm.Statements.Add (new CodeMethodReturnStatement (new CodeFieldReferenceExpression (new CodeThisReferenceExpression (), "PrivateField")));
        cd.Members.Add (cmm);

        // GENERATES (C#):
        //    public class TestFields {
        //        public static int UseFields(int i) {
        //            ClassWithFields number = new ClassWithFields();
        //            return ((number.NonStaticPublicField + number.UsePrivateField(i)) 
        //                        + ClassWithFields.StaticPublicField); // <-- only if supported
        //        }
        //    }
        cd = new CodeTypeDeclaration ("TestFields");
        cd.IsClass = true;
        nspace.Types.Add (cd);

        AddScenario ("CheckUseFields");
        cmm = new CodeMemberMethod ();
        cmm.Name = "UseFields";
        cmm.Attributes = MemberAttributes.Public | MemberAttributes.Static;
        cmm.ReturnType = new CodeTypeReference (typeof (int));
        cmm.Parameters.Add (new CodeParameterDeclarationExpression (new CodeTypeReference (typeof (int)), "i"));
        cmm.Statements.Add (new CodeVariableDeclarationStatement (new CodeTypeReference ("ClassWithFields"), "number", new CodeObjectCreateExpression ("ClassWithFields")));
        CodeBinaryOperatorExpression binaryOpExpression = new CodeBinaryOperatorExpression (new CodeFieldReferenceExpression
            (new CodeVariableReferenceExpression ("number"), "NonStaticPublicField"), CodeBinaryOperatorType.Add,
            new CodeMethodInvokeExpression (
            new CodeVariableReferenceExpression ("number"), "UsePrivateField", new CodeArgumentReferenceExpression ("i")));

        if (Supports (provider, GeneratorSupport.PublicStaticMembers))
            binaryOpExpression = new CodeBinaryOperatorExpression (binaryOpExpression,
                    CodeBinaryOperatorType.Add, new CodeFieldReferenceExpression (
                        new CodeTypeReferenceExpression ("ClassWithFields"), "StaticPublicField"));

        cmm.Statements.Add (new CodeMethodReturnStatement (binaryOpExpression));
        cd.Members.Add (cmm);


    }
	// Generate code for a binary operator expression.
	protected virtual void GenerateBinaryOperatorExpression
				(CodeBinaryOperatorExpression e)
			{
				Output.Write("(");
				GenerateExpression(e.Left);
				Output.Write(" ");
				OutputOperator(e.Operator);
				Output.Write(" ");
				GenerateExpression(e.Right);
				Output.Write(")");
			}
    public override void BuildTree (CodeDomProvider provider, CodeCompileUnit cu) {
        // create a namespace
        CodeNamespace ns = new CodeNamespace ("NS");
        ns.Imports.Add (new CodeNamespaceImport ("System"));
        cu.Namespaces.Add (ns);

        // create a class
        CodeTypeDeclaration class1 = new CodeTypeDeclaration ();
        class1.Name = "Test";
        class1.IsClass = true;
        ns.Types.Add (class1);

        if (Supports (provider, GeneratorSupport.TryCatchStatements)) {

            // try catch statement with just finally
            // GENERATE (C#):
            //       public static int FirstScenario(int a) {
            //            try {
            //            }
            //            finally {
            //                a = (a + 5);
            //            }
            //            return a;
            //        }
            AddScenario ("CheckFirstScenario");
            CodeMemberMethod cmm = new CodeMemberMethod ();
            cmm.Name = "FirstScenario";
            cmm.ReturnType = new CodeTypeReference (typeof (int));
            cmm.Attributes = MemberAttributes.Public | MemberAttributes.Static;
            CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (typeof (int), "a");
            cmm.Parameters.Add (param);

            CodeTryCatchFinallyStatement tcfstmt = new CodeTryCatchFinallyStatement ();
            tcfstmt.FinallyStatements.Add (new CodeAssignStatement (new CodeArgumentReferenceExpression ("a"), new
                CodeBinaryOperatorExpression (new CodeArgumentReferenceExpression ("a"), CodeBinaryOperatorType.Add,
                new CodePrimitiveExpression (5))));
            cmm.Statements.Add (tcfstmt);
            cmm.Statements.Add (new CodeMethodReturnStatement (new CodeArgumentReferenceExpression ("a")));
            class1.Members.Add (cmm);

            // in VB (a = a/a) generates an warning if a is integer. Cast the expression just for VB language. 
            CodeBinaryOperatorExpression cboExpression   = new CodeBinaryOperatorExpression (new CodeArgumentReferenceExpression ("a"), CodeBinaryOperatorType.Divide, new CodeArgumentReferenceExpression ("a"));
            CodeAssignStatement          assignStatement = null;
            if (provider is Microsoft.VisualBasic.VBCodeProvider)
                assignStatement = new CodeAssignStatement (new CodeArgumentReferenceExpression ("a"), new CodeCastExpression (typeof (int), cboExpression));
            else
                assignStatement = new CodeAssignStatement (new CodeArgumentReferenceExpression ("a"), cboExpression);

            // try catch statement with just catch
            // GENERATE (C#):
            //        public static int SecondScenario(int a, string exceptionMessage) {
            //            try {
            //                a = (a / a);
            //            }
            //            catch (System.Exception e) {
            //                a = 3;
            //                exceptionMessage = e.ToString();
            //            }
            //            finally {
            //                a = (a + 1);
            //            }
            //            return a;
            //        }
            AddScenario ("CheckSecondScenario");
            cmm = new CodeMemberMethod ();
            cmm.Name = "SecondScenario";
            cmm.ReturnType = new CodeTypeReference (typeof (int));
            cmm.Attributes = MemberAttributes.Public | MemberAttributes.Static;
            param = new CodeParameterDeclarationExpression (typeof (int), "a");
            cmm.Parameters.Add (param);
            cmm.Parameters.Add (new CodeParameterDeclarationExpression (typeof (String), "exceptionMessage"));

            tcfstmt = new CodeTryCatchFinallyStatement ();
            CodeCatchClause catchClause = new CodeCatchClause ("e");
            tcfstmt.TryStatements.Add (assignStatement);
            catchClause.Statements.Add (new CodeAssignStatement (new CodeArgumentReferenceExpression ("a"),
                new CodePrimitiveExpression (3)));
            catchClause.Statements.Add (new CodeAssignStatement (new CodeArgumentReferenceExpression ("exceptionMessage"),
                new CodeMethodInvokeExpression (new CodeVariableReferenceExpression ("e"), "ToString")));
            tcfstmt.CatchClauses.Add (catchClause);
            tcfstmt.FinallyStatements.Add (CDHelper.CreateIncrementByStatement (new CodeArgumentReferenceExpression ("a"), 1));

            cmm.Statements.Add (tcfstmt);
            cmm.Statements.Add (new CodeMethodReturnStatement (new CodeArgumentReferenceExpression ("a")));

            class1.Members.Add (cmm);

            // try catch statement with multiple catches
            // GENERATE (C#):
            //        public static int ThirdScenario(int a, string exceptionMessage) {
            //            try {
            //                a = (a / a);
            //            }
            //            catch (System.ArgumentNullException e) {
            //                a = 10;
            //                exceptionMessage = e.ToString();
            //            }
            //            catch (System.DivideByZeroException f) {
            //                exceptionMessage = f.ToString();
            //                a = 9;
            //            }
            //            return a;
            //        }
            AddScenario ("CheckThirdScenario");
            cmm = new CodeMemberMethod ();
            cmm.Name = "ThirdScenario";
            cmm.ReturnType = new CodeTypeReference (typeof (int));
            cmm.Attributes = MemberAttributes.Public | MemberAttributes.Static;
            param = new CodeParameterDeclarationExpression (typeof (int), "a");
            cmm.Parameters.Add (param);
            cmm.Parameters.Add (new CodeParameterDeclarationExpression (typeof (String), "exceptionMessage"));

            tcfstmt = new CodeTryCatchFinallyStatement ();
            catchClause = new CodeCatchClause ("e", new CodeTypeReference (typeof (ArgumentNullException)));
            tcfstmt.TryStatements.Add (assignStatement);
            catchClause.Statements.Add (new CodeAssignStatement (new CodeArgumentReferenceExpression ("a"),
                new CodePrimitiveExpression (9)));
            catchClause.Statements.Add (new CodeAssignStatement (new CodeArgumentReferenceExpression ("exceptionMessage"),
                new CodeMethodInvokeExpression (new CodeVariableReferenceExpression ("e"), "ToString")));
            tcfstmt.CatchClauses.Add (catchClause);

            // add a second catch clause
            catchClause = new CodeCatchClause ("f", new CodeTypeReference (typeof (Exception)));
            catchClause.Statements.Add (new CodeAssignStatement (new CodeArgumentReferenceExpression ("exceptionMessage"),
                new CodeMethodInvokeExpression (new CodeVariableReferenceExpression ("f"), "ToString")));
            catchClause.Statements.Add (new CodeAssignStatement (new CodeArgumentReferenceExpression ("a"),
                new CodePrimitiveExpression (9)));
            tcfstmt.CatchClauses.Add (catchClause);

            cmm.Statements.Add (tcfstmt);
            cmm.Statements.Add (new CodeMethodReturnStatement (new CodeArgumentReferenceExpression ("a")));
            class1.Members.Add (cmm);

            // catch throws exception
            // GENERATE (C#):
            //        public static int FourthScenario(int a) {
            //            try {
            //                a = (a / a);
            //            }
            //            catch (System.Exception e) {
            //                // Error handling
            //                throw e;
            //            }
            //            return a;
            //        }
            AddScenario ("CheckFourthScenario");
            cmm = new CodeMemberMethod ();
            cmm.Name = "FourthScenario";
            cmm.ReturnType = new CodeTypeReference (typeof (int));
            cmm.Attributes = MemberAttributes.Public | MemberAttributes.Static;
            param = new CodeParameterDeclarationExpression (typeof (int), "a");
            cmm.Parameters.Add (param);

            tcfstmt = new CodeTryCatchFinallyStatement ();
            catchClause = new CodeCatchClause ("e");
            tcfstmt.TryStatements.Add (assignStatement);
            catchClause.Statements.Add (new CodeCommentStatement ("Error handling"));
            catchClause.Statements.Add (new CodeThrowExceptionStatement (new CodeArgumentReferenceExpression ("e")));
            tcfstmt.CatchClauses.Add (catchClause);
            cmm.Statements.Add (tcfstmt);
            cmm.Statements.Add (new CodeMethodReturnStatement (new CodeArgumentReferenceExpression ("a")));
            class1.Members.Add (cmm);
        }
    }
        //ParallelRunning parallelRunning = context.ParallelRunning;
        //context.ContextParallel = parallelRunning;
        //parallelRunning.ActiveState = 2;
        //parallelRunning.CallBase01ContextAlice.EnterInitialState();
        //parallelRunning.CallBase01ContextBob.EnterInitialState();

        private void WriteOnEntryParallel(CodeMemberMethod method, StateType state)
        {
            if (state.parallel == null)
            {
                return;
            }
            string parallelClassName         = GetParallelClassName(state);
            string parallelLocalVariableName = GetParallelLocalVariableName(state);

            // ParallelRunning parallelRunning = context.ParallelRunning;

            method.Statements.Add(new CodeVariableDeclarationStatement(parallelClassName, parallelLocalVariableName));
            method.Statements.Add(new CodeAssignStatement(
                                      new CodeVariableReferenceExpression(parallelLocalVariableName),
                                      new CodeFieldReferenceExpression(
                                          new CodeVariableReferenceExpression(Model.settings.context.instance), parallelClassName)));

            // context.ContextParallel
            var contextDotObserver = new CodeFieldReferenceExpression(
                new CodeVariableReferenceExpression(Model.settings.context.instance),
                "ContextParallel");

            //context.ContextParallel = parallelRunning;
            method.Statements.Add(new CodeAssignStatement(contextDotObserver,
                                                          new CodeVariableReferenceExpression(parallelLocalVariableName)));

            // parallelRunning.ActiveState;
            var parallelRunningDotActiveState = new CodeFieldReferenceExpression(
                new CodeVariableReferenceExpression(parallelLocalVariableName),
                "ActiveState");
            //parallelRunning.ActiveState == 0
            CodeBinaryOperatorExpression condition = new CodeBinaryOperatorExpression(
                parallelRunningDotActiveState,
                CodeBinaryOperatorType.IdentityEquality,
                new CodePrimitiveExpression(0));

            CodeConditionStatement conditionalStatement = new CodeConditionStatement(condition);



            // parallelRunning.ActiveState = 2;
            CodeStatement parallelRunningActiveStateSet = new CodeAssignStatement(parallelRunningDotActiveState,
                                                                                  new CodePrimitiveExpression(state.parallel.state.Length));

            if (state.HasParentStateHistory( ))
            {
                method.Statements.Add(conditionalStatement);
                conditionalStatement.TrueStatements.Add(parallelRunningActiveStateSet);
            }
            else
            {
                method.Statements.Add(parallelRunningActiveStateSet);
            }

            //parallelRunning.CallBase01ContextAlice.EnterInitialState();
            //parallelRunning.CallBase01ContextBob.EnterInitialState();

            foreach (StateType stateOrthogonal in state.parallel.state)
            {
                string contextOrthogonalClassName = GetContextClassName(stateOrthogonal);
                string stateOrthogonalClassName   = GetStateClassName(stateOrthogonal);

                // parallelRunning.CallBase01ContextAlice
                var parallelStateNameDotContextOrthogonal = new CodeFieldReferenceExpression(
                    new CodeVariableReferenceExpression(parallelLocalVariableName),
                    contextOrthogonalClassName);

                //parallelRunning.CallBase01ContextAlice.EnterInitialState();
                var enterInitialStateInvoke = new CodeMethodInvokeExpression(
                    parallelStateNameDotContextOrthogonal,
                    "EnterInitialState");

                //parallelRunning.CallBase01ContextAlice.EnterHistoryState();
                var enterInitialHistoryStateInvoke = new CodeMethodInvokeExpression(
                    parallelStateNameDotContextOrthogonal,
                    "EnterHistoryState");
                if (state.HasParentStateHistory( ))
                {
                    conditionalStatement.TrueStatements.Add(enterInitialStateInvoke);
                    conditionalStatement.FalseStatements.Add(enterInitialHistoryStateInvoke);
                }
                else
                {
                    method.Statements.Add(enterInitialStateInvoke);
                }
            }
        }
        public void ProviderSupports()
        {
            CodeDomProvider provider = GetProvider();

            CodeCompileUnit cu = new CodeCompileUnit();
            CodeNamespace nspace = new CodeNamespace("NSPC");
            nspace.Imports.Add(new CodeNamespaceImport("System"));
            nspace.Imports.Add(new CodeNamespaceImport("System.Drawing"));
            nspace.Imports.Add(new CodeNamespaceImport("System.Windows.Forms"));
            nspace.Imports.Add(new CodeNamespaceImport("System.ComponentModel"));
            cu.Namespaces.Add(nspace);

            CodeTypeDeclaration cd = new CodeTypeDeclaration("TEST");
            cd.IsClass = true;
            nspace.Types.Add(cd);

            // Arrays of Arrays
            CodeMemberMethod cmm = new CodeMemberMethod();
            cmm.Name = "ArraysOfArrays";
            cmm.ReturnType = new CodeTypeReference(typeof(int));
            cmm.Attributes = MemberAttributes.Final | MemberAttributes.Public;
            if (provider.Supports(GeneratorSupport.ArraysOfArrays))
            {
                cmm.Statements.Add(new CodeVariableDeclarationStatement(new CodeTypeReference(typeof(int[][])),
                    "arrayOfArrays", new CodeArrayCreateExpression(typeof(int[][]),
                    new CodeArrayCreateExpression(typeof(int[]), new CodePrimitiveExpression(3), new CodePrimitiveExpression(4)),
                    new CodeArrayCreateExpression(typeof(int[]), new CodeExpression[] { new CodePrimitiveExpression(1) }))));
                cmm.Statements.Add(new CodeMethodReturnStatement(new CodeArrayIndexerExpression(
                    new CodeArrayIndexerExpression(new CodeVariableReferenceExpression("arrayOfArrays"), new CodePrimitiveExpression(0))
                    , new CodePrimitiveExpression(1))));
            }
            else
            {
                throw new Exception("not supported");
            }
            cd.Members.Add(cmm);

            // assembly attributes
            if (provider.Supports(GeneratorSupport.AssemblyAttributes))
            {
                CodeAttributeDeclarationCollection attrs = cu.AssemblyCustomAttributes;
                attrs.Add(new CodeAttributeDeclaration("System.Reflection.AssemblyTitle", new
                    CodeAttributeArgument(new CodePrimitiveExpression("MyAssembly"))));
                attrs.Add(new CodeAttributeDeclaration("System.Reflection.AssemblyVersion", new
                    CodeAttributeArgument(new CodePrimitiveExpression("1.0.6.2"))));
            }

            CodeTypeDeclaration class1 = new CodeTypeDeclaration();
            if (provider.Supports(GeneratorSupport.ChainedConstructorArguments))
            {
                class1.Name = "Test2";
                class1.IsClass = true;
                nspace.Types.Add(class1);

                class1.Members.Add(new CodeMemberField(new CodeTypeReference(typeof(String)), "stringField"));
                CodeMemberProperty prop = new CodeMemberProperty();
                prop.Name = "accessStringField";
                prop.Attributes = MemberAttributes.Public | MemberAttributes.Final;
                prop.Type = new CodeTypeReference(typeof(String));
                prop.GetStatements.Add(new CodeMethodReturnStatement(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(),
                    "stringField")));
                prop.SetStatements.Add(new CodeAssignStatement(new CodeFieldReferenceExpression(new
                    CodeThisReferenceExpression(), "stringField"),
                    new CodePropertySetValueReferenceExpression()));
                class1.Members.Add(prop);

                CodeConstructor cctor = new CodeConstructor();
                cctor.Attributes = MemberAttributes.Public;
                cctor.ChainedConstructorArgs.Add(new CodePrimitiveExpression("testingString"));
                cctor.ChainedConstructorArgs.Add(new CodePrimitiveExpression(null));
                cctor.ChainedConstructorArgs.Add(new CodePrimitiveExpression(null));
                class1.Members.Add(cctor);

                CodeConstructor cc = new CodeConstructor();
                cc.Attributes = MemberAttributes.Public | MemberAttributes.Overloaded;
                cc.Parameters.Add(new CodeParameterDeclarationExpression(typeof(string), "p1"));
                cc.Parameters.Add(new CodeParameterDeclarationExpression(typeof(string), "p2"));
                cc.Parameters.Add(new CodeParameterDeclarationExpression(typeof(string), "p3"));
                cc.Statements.Add(new CodeAssignStatement(new CodeFieldReferenceExpression(new CodeThisReferenceExpression()
                    , "stringField"), new CodeVariableReferenceExpression("p1")));
                class1.Members.Add(cc);
                // verify chained constructors work
                cmm = new CodeMemberMethod();
                cmm.Name = "ChainedConstructorUse";
                cmm.Attributes = MemberAttributes.Public | MemberAttributes.Static;
                cmm.ReturnType = new CodeTypeReference(typeof(String));
                // utilize constructor
                cmm.Statements.Add(new CodeVariableDeclarationStatement("Test2", "t", new CodeObjectCreateExpression("Test2")));
                cmm.Statements.Add(new CodeMethodReturnStatement(new CodeMethodReferenceExpression(
                    new CodeVariableReferenceExpression("t"), "accessStringField")));
                cd.Members.Add(cmm);
            }

            // complex expressions
            if (provider.Supports(GeneratorSupport.ComplexExpressions))
            {
                cmm = new CodeMemberMethod();
                cmm.Name = "ComplexExpressions";
                cmm.ReturnType = new CodeTypeReference(typeof(int));
                cmm.Attributes = MemberAttributes.Final | MemberAttributes.Public;
                cmm.Parameters.Add(new CodeParameterDeclarationExpression(new CodeTypeReference(typeof(int)), "i"));
                cmm.Statements.Add(new CodeAssignStatement(new CodeVariableReferenceExpression("i"),
                    new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("i"), CodeBinaryOperatorType.Multiply,
                    new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("i"), CodeBinaryOperatorType.Add,
                    new CodePrimitiveExpression(3)))));
                cmm.Statements.Add(new CodeMethodReturnStatement(new CodeVariableReferenceExpression("i")));
                cd.Members.Add(cmm);
            }

            if (provider.Supports(GeneratorSupport.DeclareEnums))
            {
                CodeTypeDeclaration ce = new CodeTypeDeclaration("DecimalEnum");
                ce.IsEnum = true;
                nspace.Types.Add(ce);

                // things to enumerate
                for (int k = 0; k < 5; k++)
                {
                    CodeMemberField Field = new CodeMemberField("System.Int32", "Num" + (k).ToString());
                    Field.InitExpression = new CodePrimitiveExpression(k);
                    ce.Members.Add(Field);
                }
                cmm = new CodeMemberMethod();
                cmm.Name = "OutputDecimalEnumVal";
                cmm.Attributes = MemberAttributes.Public | MemberAttributes.Static;
                CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression(typeof(int), "i");
                cmm.Parameters.Add(param);
                CodeBinaryOperatorExpression eq = new CodeBinaryOperatorExpression(
                    new CodeVariableReferenceExpression("i"), CodeBinaryOperatorType.ValueEquality,
                    new CodePrimitiveExpression(3));
                CodeMethodReturnStatement truestmt = new CodeMethodReturnStatement(
                    new CodeCastExpression(typeof(int),
                    new CodeFieldReferenceExpression(new CodeTypeReferenceExpression("DecimalEnum"), "Num3")));
                CodeConditionStatement condstmt = new CodeConditionStatement(eq, truestmt);
                cmm.Statements.Add(condstmt);

                eq = new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("i"),
                    CodeBinaryOperatorType.ValueEquality, new CodePrimitiveExpression(4));
                truestmt = new CodeMethodReturnStatement(new CodeCastExpression(typeof(int),
                    new CodeFieldReferenceExpression(new CodeTypeReferenceExpression("DecimalEnum"), "Num4")));
                condstmt = new CodeConditionStatement(eq, truestmt);
                cmm.Statements.Add(condstmt);
                eq = new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("i"),
                    CodeBinaryOperatorType.ValueEquality, new CodePrimitiveExpression(2));
                truestmt = new CodeMethodReturnStatement(new CodeCastExpression(typeof(int),
                    new CodeFieldReferenceExpression(new CodeTypeReferenceExpression("DecimalEnum"), "Num2")));
                condstmt = new CodeConditionStatement(eq, truestmt);
                cmm.Statements.Add(condstmt);

                eq = new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("i"),
                    CodeBinaryOperatorType.ValueEquality, new CodePrimitiveExpression(1));
                truestmt = new CodeMethodReturnStatement(new CodeCastExpression(typeof(int),
                    new CodeFieldReferenceExpression(new CodeTypeReferenceExpression("DecimalEnum"), "Num1")));
                condstmt = new CodeConditionStatement(eq, truestmt);
                cmm.Statements.Add(condstmt);

                eq = new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("i"),
                    CodeBinaryOperatorType.ValueEquality, new CodePrimitiveExpression(0));
                truestmt = new CodeMethodReturnStatement(new CodeCastExpression(typeof(int),
                    new CodeFieldReferenceExpression(new CodeTypeReferenceExpression("DecimalEnum"), "Num0")));
                condstmt = new CodeConditionStatement(eq, truestmt);
                cmm.Statements.Add(condstmt);

                cmm.ReturnType = new CodeTypeReference("System.int32");

                cmm.Statements.Add(new CodeMethodReturnStatement(new CodeBinaryOperatorExpression(
                    new CodeVariableReferenceExpression("i"), CodeBinaryOperatorType.Add, new CodePrimitiveExpression(10))));
                cd.Members.Add(cmm);
            }

            if (provider.Supports(GeneratorSupport.DeclareInterfaces))
            {
                cmm = new CodeMemberMethod();
                cmm.Name = "TestSingleInterface";
                cmm.ReturnType = new CodeTypeReference(typeof(int));
                cmm.Parameters.Add(new CodeParameterDeclarationExpression(typeof(int), "i"));
                cmm.Attributes = MemberAttributes.Public | MemberAttributes.Static;
                cmm.Statements.Add(new CodeVariableDeclarationStatement("TestSingleInterfaceImp", "t", new CodeObjectCreateExpression("TestSingleInterfaceImp")));
                CodeMethodInvokeExpression methodinvoke = new CodeMethodInvokeExpression(new CodeVariableReferenceExpression("t")
                    , "InterfaceMethod");
                methodinvoke.Parameters.Add(new CodeVariableReferenceExpression("i"));
                cmm.Statements.Add(new CodeMethodReturnStatement(methodinvoke));
                cd.Members.Add(cmm);

                class1 = new CodeTypeDeclaration("InterfaceA");
                class1.IsInterface = true;
                nspace.Types.Add(class1);
                cmm = new CodeMemberMethod();
                cmm.Attributes = MemberAttributes.Public;
                cmm.Name = "InterfaceMethod";
                cmm.ReturnType = new CodeTypeReference(typeof(int));
                cmm.Parameters.Add(new CodeParameterDeclarationExpression(typeof(int), "a"));
                class1.Members.Add(cmm);

                if (provider.Supports(GeneratorSupport.MultipleInterfaceMembers))
                {
                    CodeTypeDeclaration classDecl = new CodeTypeDeclaration("InterfaceB");
                    classDecl.IsInterface = true;
                    nspace.Types.Add(classDecl);
                    cmm = new CodeMemberMethod();
                    cmm.Name = "InterfaceMethod";
                    cmm.Attributes = MemberAttributes.Public;
                    cmm.ReturnType = new CodeTypeReference(typeof(int));
                    cmm.Parameters.Add(new CodeParameterDeclarationExpression(typeof(int), "a"));
                    classDecl.Members.Add(cmm);

                    CodeTypeDeclaration class2 = new CodeTypeDeclaration("TestMultipleInterfaceImp");
                    class2.BaseTypes.Add(new CodeTypeReference("System.Object"));
                    class2.BaseTypes.Add(new CodeTypeReference("InterfaceB"));
                    class2.BaseTypes.Add(new CodeTypeReference("InterfaceA"));
                    class2.IsClass = true;
                    nspace.Types.Add(class2);
                    cmm = new CodeMemberMethod();
                    cmm.ImplementationTypes.Add(new CodeTypeReference("InterfaceA"));
                    cmm.ImplementationTypes.Add(new CodeTypeReference("InterfaceB"));
                    cmm.Name = "InterfaceMethod";
                    cmm.ReturnType = new CodeTypeReference(typeof(int));
                    cmm.Parameters.Add(new CodeParameterDeclarationExpression(typeof(int), "a"));
                    cmm.Attributes = MemberAttributes.Public | MemberAttributes.Final;
                    cmm.Statements.Add(new CodeMethodReturnStatement(new CodeVariableReferenceExpression("a")));
                    class2.Members.Add(cmm);

                    cmm = new CodeMemberMethod();
                    cmm.Name = "TestMultipleInterfaces";
                    cmm.ReturnType = new CodeTypeReference(typeof(int));
                    cmm.Parameters.Add(new CodeParameterDeclarationExpression(typeof(int), "i"));
                    cmm.Attributes = MemberAttributes.Public | MemberAttributes.Static;
                    cmm.Statements.Add(new CodeVariableDeclarationStatement("TestMultipleInterfaceImp", "t", new CodeObjectCreateExpression("TestMultipleInterfaceImp")));
                    cmm.Statements.Add(new CodeVariableDeclarationStatement("InterfaceA", "interfaceAobject", new CodeCastExpression("InterfaceA",
                        new CodeVariableReferenceExpression("t"))));
                    cmm.Statements.Add(new CodeVariableDeclarationStatement("InterfaceB", "interfaceBobject", new CodeCastExpression("InterfaceB",
                        new CodeVariableReferenceExpression("t"))));
                    methodinvoke = new CodeMethodInvokeExpression(new CodeVariableReferenceExpression("interfaceAobject")
                        , "InterfaceMethod");
                    methodinvoke.Parameters.Add(new CodeVariableReferenceExpression("i"));
                    CodeMethodInvokeExpression methodinvoke2 = new CodeMethodInvokeExpression(new CodeVariableReferenceExpression("interfaceBobject")
                        , "InterfaceMethod");
                    methodinvoke2.Parameters.Add(new CodeVariableReferenceExpression("i"));
                    cmm.Statements.Add(new CodeMethodReturnStatement(new CodeBinaryOperatorExpression(
                        methodinvoke,
                        CodeBinaryOperatorType.Subtract, methodinvoke2)));
                    cd.Members.Add(cmm);
                }

                class1 = new CodeTypeDeclaration("TestSingleInterfaceImp");
                class1.BaseTypes.Add(new CodeTypeReference("System.Object"));
                class1.BaseTypes.Add(new CodeTypeReference("InterfaceA"));
                class1.IsClass = true;
                nspace.Types.Add(class1);
                cmm = new CodeMemberMethod();
                cmm.ImplementationTypes.Add(new CodeTypeReference("InterfaceA"));
                cmm.Name = "InterfaceMethod";
                cmm.ReturnType = new CodeTypeReference(typeof(int));
                cmm.Parameters.Add(new CodeParameterDeclarationExpression(typeof(int), "a"));
                cmm.Attributes = MemberAttributes.Public;
                cmm.Statements.Add(new CodeMethodReturnStatement(new CodeVariableReferenceExpression("a")));
                class1.Members.Add(cmm);
            }

            if (provider.Supports(GeneratorSupport.DeclareValueTypes))
            {
                CodeTypeDeclaration structA = new CodeTypeDeclaration("structA");
                structA.IsStruct = true;

                CodeTypeDeclaration structB = new CodeTypeDeclaration("structB");
                structB.Attributes = MemberAttributes.Public;
                structB.IsStruct = true;

                CodeMemberField firstInt = new CodeMemberField(typeof(int), "int1");
                firstInt.Attributes = MemberAttributes.Public;
                structB.Members.Add(firstInt);

                CodeMemberField innerStruct = new CodeMemberField("structB", "innerStruct");
                innerStruct.Attributes = MemberAttributes.Public;

                structA.Members.Add(structB);
                structA.Members.Add(innerStruct);
                nspace.Types.Add(structA);

                CodeMemberMethod nestedStructMethod = new CodeMemberMethod();
                nestedStructMethod.Name = "NestedStructMethod";
                nestedStructMethod.ReturnType = new CodeTypeReference(typeof(int));
                nestedStructMethod.Attributes = MemberAttributes.Public | MemberAttributes.Static;
                CodeVariableDeclarationStatement varStructA = new CodeVariableDeclarationStatement("structA", "varStructA");
                nestedStructMethod.Statements.Add(varStructA);
                nestedStructMethod.Statements.Add
                    (
                    new CodeAssignStatement
                    (
                    /* Expression1 */ new CodeFieldReferenceExpression(new CodeFieldReferenceExpression(new CodeVariableReferenceExpression("varStructA"), "innerStruct"), "int1"),
                    /* Expression1 */ new CodePrimitiveExpression(3)
                    )
                    );
                nestedStructMethod.Statements.Add(new CodeMethodReturnStatement(new CodeFieldReferenceExpression(new CodeFieldReferenceExpression(new CodeVariableReferenceExpression("varStructA"), "innerStruct"), "int1")));
                cd.Members.Add(nestedStructMethod);
            }

            if (provider.Supports(GeneratorSupport.EntryPointMethod))
            {
                CodeEntryPointMethod cep = new CodeEntryPointMethod();
                cd.Members.Add(cep);
            }

            // goto statements
            if (provider.Supports(GeneratorSupport.GotoStatements))
            {
                cmm = new CodeMemberMethod();
                cmm.Name = "GoToMethod";
                cmm.ReturnType = new CodeTypeReference(typeof(int));
                cmm.Attributes = MemberAttributes.Public | MemberAttributes.Final;
                CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression(typeof(int), "i");
                cmm.Parameters.Add(param);
                CodeConditionStatement condstmt = new CodeConditionStatement(new CodeBinaryOperatorExpression(
                    new CodeVariableReferenceExpression("i"), CodeBinaryOperatorType.LessThan, new CodePrimitiveExpression(1)),
                    new CodeGotoStatement("comehere"));
                cmm.Statements.Add(condstmt);
                cmm.Statements.Add(new CodeMethodReturnStatement(new CodePrimitiveExpression(6)));
                cmm.Statements.Add(new CodeLabeledStatement("comehere",
                    new CodeMethodReturnStatement(new CodePrimitiveExpression(7))));
                cd.Members.Add(cmm);
            }

            if (provider.Supports(GeneratorSupport.NestedTypes))
            {
                cmm = new CodeMemberMethod();
                cmm.Name = "CallingPublicNestedScenario";
                cmm.Parameters.Add(new CodeParameterDeclarationExpression(typeof(int), "i"));
                cmm.ReturnType = new CodeTypeReference(typeof(int));
                cmm.Attributes = MemberAttributes.Public | MemberAttributes.Static;
                cmm.Statements.Add(new CodeVariableDeclarationStatement(new CodeTypeReference
                    ("PublicNestedClassA+PublicNestedClassB2+PublicNestedClassC"), "t",
                    new CodeObjectCreateExpression(new CodeTypeReference
                    ("PublicNestedClassA+PublicNestedClassB2+PublicNestedClassC"))));
                cmm.Statements.Add(new CodeMethodReturnStatement(new CodeMethodInvokeExpression(new CodeVariableReferenceExpression("t"),
                    "publicNestedClassesMethod",
                    new CodeVariableReferenceExpression("i"))));
                cd.Members.Add(cmm);

                class1 = new CodeTypeDeclaration("PublicNestedClassA");
                class1.IsClass = true;
                nspace.Types.Add(class1);
                CodeTypeDeclaration nestedClass = new CodeTypeDeclaration("PublicNestedClassB1");
                nestedClass.IsClass = true;
                nestedClass.TypeAttributes = TypeAttributes.NestedPublic;
                class1.Members.Add(nestedClass);
                nestedClass = new CodeTypeDeclaration("PublicNestedClassB2");
                nestedClass.TypeAttributes = TypeAttributes.NestedPublic;
                nestedClass.IsClass = true;
                class1.Members.Add(nestedClass);
                CodeTypeDeclaration innerNestedClass = new CodeTypeDeclaration("PublicNestedClassC");
                innerNestedClass.TypeAttributes = TypeAttributes.NestedPublic;
                innerNestedClass.IsClass = true;
                nestedClass.Members.Add(innerNestedClass);
                cmm = new CodeMemberMethod();
                cmm.Name = "publicNestedClassesMethod";
                cmm.ReturnType = new CodeTypeReference(typeof(int));
                cmm.Parameters.Add(new CodeParameterDeclarationExpression(typeof(int), "a"));
                cmm.Attributes = MemberAttributes.Public | MemberAttributes.Final;
                cmm.Statements.Add(new CodeMethodReturnStatement(new CodeVariableReferenceExpression("a")));
                innerNestedClass.Members.Add(cmm);
            }

            // Parameter Attributes
            if (provider.Supports(GeneratorSupport.ParameterAttributes))
            {
                CodeMemberMethod method1 = new CodeMemberMethod();
                method1.Name = "MyMethod";
                method1.Attributes = MemberAttributes.Public | MemberAttributes.Final;
                CodeParameterDeclarationExpression param1 = new CodeParameterDeclarationExpression(typeof(string), "blah");
                param1.CustomAttributes.Add(
                    new CodeAttributeDeclaration(
                    "System.Xml.Serialization.XmlElementAttribute",
                    new CodeAttributeArgument(
                    "Form",
                    new CodeFieldReferenceExpression(new CodeTypeReferenceExpression("System.Xml.Schema.XmlSchemaForm"), "Unqualified")),
                    new CodeAttributeArgument(
                    "IsNullable",
                    new CodePrimitiveExpression(false))));
                method1.Parameters.Add(param1);
                cd.Members.Add(method1);
            }

            // public static members
            if (provider.Supports(GeneratorSupport.PublicStaticMembers))
            {
                cmm = new CodeMemberMethod();
                cmm.Name = "PublicStaticMethod";
                cmm.ReturnType = new CodeTypeReference(typeof(int));
                cmm.Attributes = MemberAttributes.Public | MemberAttributes.Static;
                cmm.Statements.Add(new CodeMethodReturnStatement(new CodePrimitiveExpression(16)));
                cd.Members.Add(cmm);
            }

            // reference parameters
            if (provider.Supports(GeneratorSupport.ReferenceParameters))
            {
                cmm = new CodeMemberMethod();
                cmm.Name = "Work";
                cmm.ReturnType = new CodeTypeReference("System.void");
                cmm.Attributes = MemberAttributes.Static;
                // add parameter with ref direction
                CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression(typeof(int), "i");
                param.Direction = FieldDirection.Ref;
                cmm.Parameters.Add(param);
                // add parameter with out direction
                param = new CodeParameterDeclarationExpression(typeof(int), "j");
                param.Direction = FieldDirection.Out;
                cmm.Parameters.Add(param);
                cmm.Statements.Add(new CodeAssignStatement(new CodeArgumentReferenceExpression("i"),
                    new CodeBinaryOperatorExpression(new CodeArgumentReferenceExpression("i"),
                    CodeBinaryOperatorType.Add, new CodePrimitiveExpression(4))));
                cmm.Statements.Add(new CodeAssignStatement(new CodeArgumentReferenceExpression("j"),
                    new CodePrimitiveExpression(5)));
                cd.Members.Add(cmm);

                cmm = new CodeMemberMethod();
                cmm.Name = "CallingWork";
                cmm.Attributes = MemberAttributes.Public | MemberAttributes.Static;
                CodeParameterDeclarationExpression parames = new CodeParameterDeclarationExpression(typeof(int), "a");
                cmm.Parameters.Add(parames);
                cmm.ReturnType = new CodeTypeReference("System.int32");
                cmm.Statements.Add(new CodeAssignStatement(new CodeVariableReferenceExpression("a"),
                    new CodePrimitiveExpression(10)));
                cmm.Statements.Add(new CodeVariableDeclarationStatement(typeof(int), "b"));
                // invoke the method called "work"
                CodeMethodInvokeExpression methodinvoked = new CodeMethodInvokeExpression(new CodeMethodReferenceExpression
                    (new CodeTypeReferenceExpression("TEST"), "Work"));
                // add parameter with ref direction
                CodeDirectionExpression parameter = new CodeDirectionExpression(FieldDirection.Ref,
                    new CodeVariableReferenceExpression("a"));
                methodinvoked.Parameters.Add(parameter);
                // add parameter with out direction
                parameter = new CodeDirectionExpression(FieldDirection.Out, new CodeVariableReferenceExpression("b"));
                methodinvoked.Parameters.Add(parameter);
                cmm.Statements.Add(methodinvoked);
                cmm.Statements.Add(new CodeMethodReturnStatement(new CodeBinaryOperatorExpression
                    (new CodeVariableReferenceExpression("a"), CodeBinaryOperatorType.Add, new CodeVariableReferenceExpression("b"))));
                cd.Members.Add(cmm);
            }

            if (provider.Supports(GeneratorSupport.ReturnTypeAttributes))
            {
                CodeMemberMethod function1 = new CodeMemberMethod();
                function1.Name = "MyFunction";
                function1.ReturnType = new CodeTypeReference(typeof(string));
                function1.Attributes = MemberAttributes.Public | MemberAttributes.Final;
                function1.ReturnTypeCustomAttributes.Add(new
                    CodeAttributeDeclaration("System.Xml.Serialization.XmlIgnoreAttribute"));
                function1.ReturnTypeCustomAttributes.Add(new CodeAttributeDeclaration("System.Xml.Serialization.XmlRootAttribute", new
                    CodeAttributeArgument("Namespace", new CodePrimitiveExpression("Namespace Value")), new
                    CodeAttributeArgument("ElementName", new CodePrimitiveExpression("Root, hehehe"))));
                function1.Statements.Add(new CodeMethodReturnStatement(new CodePrimitiveExpression("Return")));
                cd.Members.Add(function1);
            }

            if (provider.Supports(GeneratorSupport.StaticConstructors))
            {
                cmm = new CodeMemberMethod();
                cmm.Name = "TestStaticConstructor";
                cmm.Attributes = MemberAttributes.Public | MemberAttributes.Static;
                cmm.ReturnType = new CodeTypeReference(typeof(int));
                CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression(typeof(int), "a");
                cmm.Parameters.Add(param);
                // utilize constructor
                cmm.Statements.Add(new CodeVariableDeclarationStatement("Test4", "t", new CodeObjectCreateExpression("Test4")));
                // set then get number
                cmm.Statements.Add(new CodeAssignStatement(new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("t"), "i")
                    , new CodeVariableReferenceExpression("a")));
                cmm.Statements.Add(new CodeMethodReturnStatement(new CodeMethodReferenceExpression(
                    new CodeVariableReferenceExpression("t"), "i")));
                cd.Members.Add(cmm);

                class1 = new CodeTypeDeclaration();
                class1.Name = "Test4";
                class1.IsClass = true;
                nspace.Types.Add(class1);

                class1.Members.Add(new CodeMemberField(new CodeTypeReference(typeof(int)), "number"));
                CodeMemberProperty prop = new CodeMemberProperty();
                prop.Name = "i";
                prop.Attributes = MemberAttributes.Public | MemberAttributes.Final;
                prop.Type = new CodeTypeReference(typeof(int));
                prop.GetStatements.Add(new CodeMethodReturnStatement(new CodeVariableReferenceExpression("number")));
                prop.SetStatements.Add(new CodeAssignStatement(new CodeVariableReferenceExpression("number"),
                    new CodePropertySetValueReferenceExpression()));
                class1.Members.Add(prop);
                CodeTypeConstructor ctc = new CodeTypeConstructor();
                class1.Members.Add(ctc);
            }

            if (provider.Supports(GeneratorSupport.TryCatchStatements))
            {
                cmm = new CodeMemberMethod();
                cmm.Name = "TryCatchMethod";
                cmm.ReturnType = new CodeTypeReference(typeof(int));
                cmm.Attributes = MemberAttributes.Public | MemberAttributes.Static;
                CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression(typeof(int), "a");
                cmm.Parameters.Add(param);

                CodeTryCatchFinallyStatement tcfstmt = new CodeTryCatchFinallyStatement();
                tcfstmt.FinallyStatements.Add(new CodeAssignStatement(new CodeVariableReferenceExpression("a"), new
                    CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("a"), CodeBinaryOperatorType.Add,
                    new CodePrimitiveExpression(5))));
                cmm.Statements.Add(tcfstmt);
                cmm.Statements.Add(new CodeMethodReturnStatement(new CodeVariableReferenceExpression("a")));
                cd.Members.Add(cmm);
            }

            if (provider.Supports(GeneratorSupport.DeclareEvents))
            {
                CodeNamespace ns = new CodeNamespace();
                ns.Name = "MyNamespace";
                ns.Imports.Add(new CodeNamespaceImport("System"));
                ns.Imports.Add(new CodeNamespaceImport("System.Drawing"));
                ns.Imports.Add(new CodeNamespaceImport("System.Windows.Forms"));
                ns.Imports.Add(new CodeNamespaceImport("System.ComponentModel"));
                cu.Namespaces.Add(ns);
                class1 = new CodeTypeDeclaration("Test");
                class1.IsClass = true;
                class1.BaseTypes.Add(new CodeTypeReference("Form"));
                ns.Types.Add(class1);

                CodeMemberField mfield = new CodeMemberField(new CodeTypeReference("Button"), "b");
                mfield.InitExpression = new CodeObjectCreateExpression(new CodeTypeReference("Button"));
                class1.Members.Add(mfield);

                CodeConstructor ctor = new CodeConstructor();
                ctor.Attributes = MemberAttributes.Public;
                ctor.Statements.Add(new CodeAssignStatement(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(),
                    "Size"), new CodeObjectCreateExpression(new CodeTypeReference("Size"),
                    new CodePrimitiveExpression(600), new CodePrimitiveExpression(600))));
                ctor.Statements.Add(new CodeAssignStatement(new CodeFieldReferenceExpression(new CodeTypeReferenceExpression("b"),
                    "Text"), new CodePrimitiveExpression("Test")));
                ctor.Statements.Add(new CodeAssignStatement(new CodeFieldReferenceExpression(new CodeTypeReferenceExpression("b"),
                    "TabIndex"), new CodePrimitiveExpression(0)));
                ctor.Statements.Add(new CodeAssignStatement(new CodeFieldReferenceExpression(new CodeTypeReferenceExpression("b"),
                    "Location"), new CodeObjectCreateExpression(new CodeTypeReference("Point"),
                    new CodePrimitiveExpression(400), new CodePrimitiveExpression(525))));
                ctor.Statements.Add(new CodeAttachEventStatement(new CodeEventReferenceExpression(new
                    CodeThisReferenceExpression(), "MyEvent"), new CodeDelegateCreateExpression(new CodeTypeReference("EventHandler")
                    , new CodeThisReferenceExpression(), "b_Click")));
                class1.Members.Add(ctor);

                CodeMemberEvent evt = new CodeMemberEvent();
                evt.Name = "MyEvent";
                evt.Type = new CodeTypeReference("System.EventHandler");
                evt.Attributes = MemberAttributes.Public;
                class1.Members.Add(evt);

                cmm = new CodeMemberMethod();
                cmm.Name = "b_Click";
                cmm.Parameters.Add(new CodeParameterDeclarationExpression(typeof(object), "sender"));
                cmm.Parameters.Add(new CodeParameterDeclarationExpression(typeof(EventArgs), "e"));
                class1.Members.Add(cmm);
            }

            AssertEqual(cu,
                @"'------------------------------------------------------------------------------
                  ' <auto-generated>
                  '     This code was generated by a tool.
                  '     Runtime Version:4.0.30319.42000
                  '
                  '     Changes to this file may cause incorrect behavior and will be lost if
                  '     the code is regenerated.
                  ' </auto-generated>
                  '------------------------------------------------------------------------------

                  Option Strict Off
                  Option Explicit On

                  Imports System
                  Imports System.ComponentModel
                  Imports System.Drawing
                  Imports System.Windows.Forms
                  <Assembly: System.Reflection.AssemblyTitle(""MyAssembly""),  _
                   Assembly: System.Reflection.AssemblyVersion(""1.0.6.2"")>

                  Namespace NSPC

                      Public Class TEST

                          Public Function ArraysOfArrays() As Integer
                              Dim arrayOfArrays()() As Integer = New Integer()() {New Integer() {3, 4}, New Integer() {1}}
                              Return arrayOfArrays(0)(1)
                          End Function

                          Public Shared Function ChainedConstructorUse() As String
                              Dim t As Test2 = New Test2()
                              Return t.accessStringField
                          End Function

                          Public Function ComplexExpressions(ByVal i As Integer) As Integer
                              i = (i  _
                                          * (i + 3))
                              Return i
                          End Function

                          Public Shared Function OutputDecimalEnumVal(ByVal i As Integer) As Integer
                              If (i = 3) Then
                                  Return CType(DecimalEnum.Num3,Integer)
                              End If
                              If (i = 4) Then
                                  Return CType(DecimalEnum.Num4,Integer)
                              End If
                              If (i = 2) Then
                                  Return CType(DecimalEnum.Num2,Integer)
                              End If
                              If (i = 1) Then
                                  Return CType(DecimalEnum.Num1,Integer)
                              End If
                              If (i = 0) Then
                                  Return CType(DecimalEnum.Num0,Integer)
                              End If
                              Return (i + 10)
                          End Function

                          Public Shared Function TestSingleInterface(ByVal i As Integer) As Integer
                              Dim t As TestSingleInterfaceImp = New TestSingleInterfaceImp()
                              Return t.InterfaceMethod(i)
                          End Function

                          Public Shared Function TestMultipleInterfaces(ByVal i As Integer) As Integer
                              Dim t As TestMultipleInterfaceImp = New TestMultipleInterfaceImp()
                              Dim interfaceAobject As InterfaceA = CType(t,InterfaceA)
                              Dim interfaceBobject As InterfaceB = CType(t,InterfaceB)
                              Return (interfaceAobject.InterfaceMethod(i) - interfaceBobject.InterfaceMethod(i))
                          End Function

                          Public Shared Function NestedStructMethod() As Integer
                              Dim varStructA As structA
                              varStructA.innerStruct.int1 = 3
                              Return varStructA.innerStruct.int1
                          End Function

                          Public Shared Sub Main()
                          End Sub

                          Public Function GoToMethod(ByVal i As Integer) As Integer
                              If (i < 1) Then
                                  goto comehere
                              End If
                              Return 6
                          comehere:
                              Return 7
                          End Function

                          Public Shared Function CallingPublicNestedScenario(ByVal i As Integer) As Integer
                              Dim t As PublicNestedClassA.PublicNestedClassB2.PublicNestedClassC = New PublicNestedClassA.PublicNestedClassB2.PublicNestedClassC()
                              Return t.publicNestedClassesMethod(i)
                          End Function

                          Public Sub MyMethod(<System.Xml.Serialization.XmlElementAttribute(Form:=System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable:=false)> ByVal blah As String)
                          End Sub

                          Public Shared Function PublicStaticMethod() As Integer
                              Return 16
                          End Function

                          Shared Sub Work(ByRef i As Integer, ByRef j As Integer)
                              i = (i + 4)
                              j = 5
                          End Sub

                          Public Shared Function CallingWork(ByVal a As Integer) As Integer
                              a = 10
                              Dim b As Integer
                              TEST.Work(a, b)
                              Return (a + b)
                          End Function

                          Public Function MyFunction() As <System.Xml.Serialization.XmlIgnoreAttribute(), System.Xml.Serialization.XmlRootAttribute([Namespace]:=""Namespace Value"", ElementName:=""Root, hehehe"")> String
                              Return ""Return""
                          End Function

                          Public Shared Function TestStaticConstructor(ByVal a As Integer) As Integer
                              Dim t As Test4 = New Test4()
                              t.i = a
                              Return t.i
                          End Function

                          Public Shared Function TryCatchMethod(ByVal a As Integer) As Integer
                              Try
                              Finally
                                  a = (a + 5)
                              End Try
                              Return a
                          End Function
                      End Class

                      Public Class Test2

                          Private stringField As String

                          Public Sub New()
                              Me.New(""testingString"", Nothing, Nothing)
                          End Sub

                          Public Sub New(ByVal p1 As String, ByVal p2 As String, ByVal p3 As String)
                              MyBase.New
                              Me.stringField = p1
                          End Sub

                          Public Property accessStringField() As String
                              Get
                                  Return Me.stringField
                              End Get
                              Set
                                  Me.stringField = value
                              End Set
                          End Property
                      End Class

                      Public Enum DecimalEnum

                          Num0 = 0

                          Num1 = 1

                          Num2 = 2

                          Num3 = 3

                          Num4 = 4
                      End Enum

                      Public Interface InterfaceA

                          Function InterfaceMethod(ByVal a As Integer) As Integer
                      End Interface

                      Public Interface InterfaceB

                          Function InterfaceMethod(ByVal a As Integer) As Integer
                      End Interface

                      Public Class TestMultipleInterfaceImp
                          Inherits Object
                          Implements InterfaceB, InterfaceA

                          Public Function InterfaceMethod(ByVal a As Integer) As Integer Implements InterfaceA.InterfaceMethod , InterfaceB.InterfaceMethod
                              Return a
                          End Function
                      End Class

                      Public Class TestSingleInterfaceImp
                          Inherits Object
                          Implements InterfaceA

                          Public Overridable Function InterfaceMethod(ByVal a As Integer) As Integer Implements InterfaceA.InterfaceMethod
                              Return a
                          End Function
                      End Class

                      Public Structure structA

                          Public innerStruct As structB

                          Public Structure structB

                              Public int1 As Integer
                          End Structure
                      End Structure

                      Public Class PublicNestedClassA

                          Public Class PublicNestedClassB1
                          End Class

                          Public Class PublicNestedClassB2

                              Public Class PublicNestedClassC

                                  Public Function publicNestedClassesMethod(ByVal a As Integer) As Integer
                                      Return a
                                  End Function
                              End Class
                          End Class
                      End Class

                      Public Class Test4

                          Private number As Integer

                          Shared Sub New()
                          End Sub

                          Public Property i() As Integer
                              Get
                                  Return number
                              End Get
                              Set
                                  number = value
                              End Set
                          End Property
                      End Class
                  End Namespace

                  Namespace MyNamespace

                      Public Class Test
                          Inherits Form

                          Private b As Button = New Button()

                          Public Sub New()
                              MyBase.New
                              Me.Size = New Size(600, 600)
                              b.Text = ""Test""
                              b.TabIndex = 0
                              b.Location = New Point(400, 525)
                              AddHandler MyEvent, AddressOf Me.b_Click
                          End Sub

                          Public Event MyEvent As System.EventHandler

                          Private Sub b_Click(ByVal sender As Object, ByVal e As System.EventArgs)
                          End Sub
                      End Class
                  End Namespace");
        }
			public void Visit(CodeBinaryOperatorExpression o)
			{
				g.GenerateBinaryOperatorExpression(o);
			}
        public void BinaryOperators()
        {
            CodeNamespace ns = new CodeNamespace("Namespace1");
            ns.Imports.Add(new CodeNamespaceImport("System"));

            CodeTypeDeclaration class1 = new CodeTypeDeclaration();
            class1.Name = "Class1";
            class1.BaseTypes.Add(new CodeTypeReference(typeof(object)));
            ns.Types.Add(class1);

            CodeMemberMethod retMethod = new CodeMemberMethod();
            retMethod.Name = "ReturnMethod";
            retMethod.Attributes = (retMethod.Attributes & ~MemberAttributes.AccessMask) | MemberAttributes.Public;
            retMethod.ReturnType = new CodeTypeReference(typeof(int));
            retMethod.Parameters.Add(new CodeParameterDeclarationExpression(typeof(int), "intInput"));

            CodeBinaryOperatorExpression cboExpression = new CodeBinaryOperatorExpression(
                new CodeBinaryOperatorExpression(
                new CodePrimitiveExpression(18),
                CodeBinaryOperatorType.Divide,
                new CodeBinaryOperatorExpression(
                new CodePrimitiveExpression(6),
                CodeBinaryOperatorType.Subtract,
                new CodePrimitiveExpression(4))),
                CodeBinaryOperatorType.Multiply,
                new CodeArgumentReferenceExpression("intInput"));

            CodeVariableDeclarationStatement variableDeclaration = null;
            variableDeclaration = new CodeVariableDeclarationStatement(typeof(int), "x1", cboExpression);

            retMethod.Statements.Add(variableDeclaration);
            retMethod.Statements.Add(
                new CodeVariableDeclarationStatement(
                typeof(int),
                "x2",
                new CodeBinaryOperatorExpression(
                new CodePrimitiveExpression(19),
                CodeBinaryOperatorType.Modulus,
                new CodePrimitiveExpression(8))));
            retMethod.Statements.Add(
                new CodeVariableDeclarationStatement(
                typeof(int),
                "x3",
                new CodeBinaryOperatorExpression(
                new CodeBinaryOperatorExpression(
                new CodePrimitiveExpression(15),
                CodeBinaryOperatorType.BitwiseAnd,
                new CodePrimitiveExpression(35)),
                CodeBinaryOperatorType.BitwiseOr,
                new CodePrimitiveExpression(129))));
            retMethod.Statements.Add(
                new CodeVariableDeclarationStatement(
                typeof(int),
                "x4",
                new CodePrimitiveExpression(0)));
            retMethod.Statements.Add(
                new CodeConditionStatement(
                new CodeBinaryOperatorExpression(
                new CodeBinaryOperatorExpression(
                new CodeVariableReferenceExpression("x2"),
                CodeBinaryOperatorType.ValueEquality,
                new CodePrimitiveExpression(3)),
                CodeBinaryOperatorType.BooleanOr,
                new CodeBinaryOperatorExpression(
                new CodeVariableReferenceExpression("x3"),
                CodeBinaryOperatorType.LessThan,
                new CodePrimitiveExpression(129))),
                new CodeStatement[] { CreateVariableIncrementExpression("x4", 1) },
                new CodeStatement[] { CreateVariableIncrementExpression("x4", 2) }));
            retMethod.Statements.Add(
                new CodeConditionStatement(
                new CodeBinaryOperatorExpression(
                new CodeBinaryOperatorExpression(
                new CodeVariableReferenceExpression("x2"),
                CodeBinaryOperatorType.GreaterThan,
                new CodePrimitiveExpression(-1)),
                CodeBinaryOperatorType.BooleanAnd,
                new CodeBinaryOperatorExpression(
                new CodeVariableReferenceExpression("x3"),
                CodeBinaryOperatorType.GreaterThanOrEqual,
                new CodePrimitiveExpression(5000))),
                new CodeStatement[] { CreateVariableIncrementExpression("x4", 4) },
                new CodeStatement[] { CreateVariableIncrementExpression("x4", 8) }));
            retMethod.Statements.Add(
                new CodeConditionStatement(
                new CodeBinaryOperatorExpression(
                new CodeBinaryOperatorExpression(
                new CodeVariableReferenceExpression("x2"),
                CodeBinaryOperatorType.LessThanOrEqual,
                new CodePrimitiveExpression(3)),
                CodeBinaryOperatorType.BooleanAnd,
                new CodeBinaryOperatorExpression(
                new CodeVariableReferenceExpression("x3"),
                CodeBinaryOperatorType.IdentityInequality,
                new CodePrimitiveExpression(1))),
                new CodeStatement[] { CreateVariableIncrementExpression("x4", 16) },
                new CodeStatement[] { CreateVariableIncrementExpression("x4", 32) }));
            retMethod.Statements.Add(
                new CodeMethodReturnStatement(
                new CodeBinaryOperatorExpression(
                new CodeVariableReferenceExpression("x1"),
                CodeBinaryOperatorType.Add,
                new CodeBinaryOperatorExpression(
                new CodeVariableReferenceExpression("x2"),
                CodeBinaryOperatorType.Add,
                new CodeBinaryOperatorExpression(
                new CodeVariableReferenceExpression("x3"),
                CodeBinaryOperatorType.Add,
                new CodeVariableReferenceExpression("x4"))))));
            class1.Members.Add(retMethod);

            retMethod = new CodeMemberMethod();
            retMethod.Name = "SecondReturnMethod";
            retMethod.Attributes = (retMethod.Attributes & ~MemberAttributes.AccessMask) | MemberAttributes.Public;
            retMethod.ReturnType = new CodeTypeReference(typeof(int));
            retMethod.Parameters.Add(new CodeParameterDeclarationExpression(typeof(int), "intInput"));

            retMethod.Statements.Add(new CodeCommentStatement("To test CodeBinaryOperatorType.IdentiEquality operator"));
            retMethod.Statements.Add(
                new CodeConditionStatement(
                new CodeBinaryOperatorExpression(new CodeCastExpression("Object",
                new CodeVariableReferenceExpression("intInput")),
                CodeBinaryOperatorType.IdentityEquality, new CodeCastExpression("Object",
                new CodePrimitiveExpression(5))),
                new CodeStatement[] { new CodeMethodReturnStatement(new
                CodePrimitiveExpression(5)) }, new CodeStatement[] { new
                CodeMethodReturnStatement(new CodePrimitiveExpression(4))}));
            class1.Members.Add(retMethod);

            AssertEqual(ns,
                @"namespace Namespace1 {
                      using System;

                      public class Class1 : object {
                          public int ReturnMethod(int intInput) {
                              int x1 = ((18 / (6 - 4)) * intInput);
                              int x2 = (19 % 8);
                              int x3 = ((15 & 35) | 129);
                              int x4 = 0;
                              if (((x2 == 3) || (x3 < 129))) {
                                  x4 = (x4 + 1);
                              }
                              else {
                                  x4 = (x4 + 2);
                              }
                              if (((x2 > -1) && (x3 >= 5000))) {
                                  x4 = (x4 + 4);
                              }
                              else {
                                  x4 = (x4 + 8);
                              }
                              if (((x2 <= 3) && (x3 != 1))) {
                                  x4 = (x4 + 16);
                              }
                              else {
                                  x4 = (x4 + 32);
                              }
                              return (x1 + (x2 + (x3 + x4)));
                          }

                          public int SecondReturnMethod(int intInput) {
                              // To test CodeBinaryOperatorType.IdentiEquality operator
                              if ((((Object)(intInput)) == ((Object)(5)))) {
                                  return 5;
                              }
                              else {
                                  return 4;
                              }
                          }
                      }
                  }");
        }
        public void ProviderSupports()
        {
            CodeDomProvider provider = GetProvider();

            var cu = new CodeCompileUnit();
            var nspace = new CodeNamespace("NSPC");
            nspace.Imports.Add(new CodeNamespaceImport("System"));
            nspace.Imports.Add(new CodeNamespaceImport("System.Drawing"));
            nspace.Imports.Add(new CodeNamespaceImport("System.Windows.Forms"));
            nspace.Imports.Add(new CodeNamespaceImport("System.ComponentModel"));
            cu.Namespaces.Add(nspace);

            var cd = new CodeTypeDeclaration("TEST");
            cd.IsClass = true;
            nspace.Types.Add(cd);

            // Arrays of Arrays
            var cmm = new CodeMemberMethod();
            cmm.Name = "ArraysOfArrays";
            cmm.ReturnType = new CodeTypeReference(typeof(int));
            cmm.Attributes = MemberAttributes.Final | MemberAttributes.Public;
            if (provider.Supports(GeneratorSupport.ArraysOfArrays))
            {
                cmm.Statements.Add(new CodeVariableDeclarationStatement(new CodeTypeReference(typeof(int[][])),
                    "arrayOfArrays", new CodeArrayCreateExpression(typeof(int[][]),
                    new CodeArrayCreateExpression(typeof(int[]), new CodePrimitiveExpression(3), new CodePrimitiveExpression(4)),
                    new CodeArrayCreateExpression(typeof(int[]), new CodeExpression[] { new CodePrimitiveExpression(1) }))));
                cmm.Statements.Add(new CodeMethodReturnStatement(new CodeArrayIndexerExpression(
                    new CodeArrayIndexerExpression(new CodeVariableReferenceExpression("arrayOfArrays"), new CodePrimitiveExpression(0))
                    , new CodePrimitiveExpression(1))));
            }
            else
            {
                cmm.Statements.Add(new CodeMethodReturnStatement(new CodePrimitiveExpression(0)));
            }
            cd.Members.Add(cmm);

            // assembly attributes
            if (provider.Supports(GeneratorSupport.AssemblyAttributes))
            {
                CodeAttributeDeclarationCollection attrs = cu.AssemblyCustomAttributes;
                attrs.Add(new CodeAttributeDeclaration("System.Reflection.AssemblyTitle", new
                    CodeAttributeArgument(new CodePrimitiveExpression("MyAssembly"))));
                attrs.Add(new CodeAttributeDeclaration("System.Reflection.AssemblyVersion", new
                    CodeAttributeArgument(new CodePrimitiveExpression("1.0.6.2"))));
            }

            CodeTypeDeclaration class1 = new CodeTypeDeclaration();
            if (provider.Supports(GeneratorSupport.ChainedConstructorArguments))
            {
                class1.Name = "Test2";
                class1.IsClass = true;
                nspace.Types.Add(class1);

                class1.Members.Add(new CodeMemberField(new CodeTypeReference(typeof(String)), "stringField"));
                CodeMemberProperty prop = new CodeMemberProperty();
                prop.Name = "accessStringField";
                prop.Attributes = MemberAttributes.Public | MemberAttributes.Final;
                prop.Type = new CodeTypeReference(typeof(String));
                prop.GetStatements.Add(new CodeMethodReturnStatement(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(),
                    "stringField")));
                prop.SetStatements.Add(new CodeAssignStatement(new CodeFieldReferenceExpression(new
                    CodeThisReferenceExpression(), "stringField"),
                    new CodePropertySetValueReferenceExpression()));
                class1.Members.Add(prop);

                CodeConstructor cctor = new CodeConstructor();
                cctor.Attributes = MemberAttributes.Public;
                cctor.ChainedConstructorArgs.Add(new CodePrimitiveExpression("testingString"));
                cctor.ChainedConstructorArgs.Add(new CodePrimitiveExpression(null));
                cctor.ChainedConstructorArgs.Add(new CodePrimitiveExpression(null));
                class1.Members.Add(cctor);

                CodeConstructor cc = new CodeConstructor();
                cc.Attributes = MemberAttributes.Public | MemberAttributes.Overloaded;
                cc.Parameters.Add(new CodeParameterDeclarationExpression(typeof(string), "p1"));
                cc.Parameters.Add(new CodeParameterDeclarationExpression(typeof(string), "p2"));
                cc.Parameters.Add(new CodeParameterDeclarationExpression(typeof(string), "p3"));
                cc.Statements.Add(new CodeAssignStatement(new CodeFieldReferenceExpression(new CodeThisReferenceExpression()
                    , "stringField"), new CodeVariableReferenceExpression("p1")));
                class1.Members.Add(cc);
                // verify chained constructors work
                cmm = new CodeMemberMethod();
                cmm.Name = "ChainedConstructorUse";
                cmm.Attributes = MemberAttributes.Public | MemberAttributes.Static;
                cmm.ReturnType = new CodeTypeReference(typeof(String));
                // utilize constructor
                cmm.Statements.Add(new CodeVariableDeclarationStatement("Test2", "t", new CodeObjectCreateExpression("Test2")));
                cmm.Statements.Add(new CodeMethodReturnStatement(new CodeMethodReferenceExpression(
                    new CodeVariableReferenceExpression("t"), "accessStringField")));
                cd.Members.Add(cmm);
            }

            // complex expressions
            if (provider.Supports(GeneratorSupport.ComplexExpressions))
            {
                cmm = new CodeMemberMethod();
                cmm.Name = "ComplexExpressions";
                cmm.ReturnType = new CodeTypeReference(typeof(int));
                cmm.Attributes = MemberAttributes.Final | MemberAttributes.Public;
                cmm.Parameters.Add(new CodeParameterDeclarationExpression(new CodeTypeReference(typeof(int)), "i"));
                cmm.Statements.Add(new CodeAssignStatement(new CodeVariableReferenceExpression("i"),
                    new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("i"), CodeBinaryOperatorType.Multiply,
                    new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("i"), CodeBinaryOperatorType.Add,
                    new CodePrimitiveExpression(3)))));
                cmm.Statements.Add(new CodeMethodReturnStatement(new CodeVariableReferenceExpression("i")));
                cd.Members.Add(cmm);
            }

            if (provider.Supports(GeneratorSupport.DeclareEnums))
            {
                CodeTypeDeclaration ce = new CodeTypeDeclaration("DecimalEnum");
                ce.IsEnum = true;
                nspace.Types.Add(ce);

                // things to enumerate
                for (int k = 0; k < 5; k++)
                {
                    CodeMemberField Field = new CodeMemberField("System.Int32", "Num" + (k).ToString());
                    Field.InitExpression = new CodePrimitiveExpression(k);
                    ce.Members.Add(Field);
                }
                cmm = new CodeMemberMethod();
                cmm.Name = "OutputDecimalEnumVal";
                cmm.Attributes = MemberAttributes.Public | MemberAttributes.Static;
                CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression(typeof(int), "i");
                cmm.Parameters.Add(param);
                CodeBinaryOperatorExpression eq = new CodeBinaryOperatorExpression(
                    new CodeVariableReferenceExpression("i"), CodeBinaryOperatorType.ValueEquality,
                    new CodePrimitiveExpression(3));
                CodeMethodReturnStatement truestmt = new CodeMethodReturnStatement(
                    new CodeCastExpression(typeof(int),
                    new CodeFieldReferenceExpression(new CodeTypeReferenceExpression("DecimalEnum"), "Num3")));
                CodeConditionStatement condstmt = new CodeConditionStatement(eq, truestmt);
                cmm.Statements.Add(condstmt);

                eq = new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("i"),
                    CodeBinaryOperatorType.ValueEquality, new CodePrimitiveExpression(4));
                truestmt = new CodeMethodReturnStatement(new CodeCastExpression(typeof(int),
                    new CodeFieldReferenceExpression(new CodeTypeReferenceExpression("DecimalEnum"), "Num4")));
                condstmt = new CodeConditionStatement(eq, truestmt);
                cmm.Statements.Add(condstmt);
                eq = new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("i"),
                    CodeBinaryOperatorType.ValueEquality, new CodePrimitiveExpression(2));
                truestmt = new CodeMethodReturnStatement(new CodeCastExpression(typeof(int),
                    new CodeFieldReferenceExpression(new CodeTypeReferenceExpression("DecimalEnum"), "Num2")));
                condstmt = new CodeConditionStatement(eq, truestmt);
                cmm.Statements.Add(condstmt);

                eq = new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("i"),
                    CodeBinaryOperatorType.ValueEquality, new CodePrimitiveExpression(1));
                truestmt = new CodeMethodReturnStatement(new CodeCastExpression(typeof(int),
                    new CodeFieldReferenceExpression(new CodeTypeReferenceExpression("DecimalEnum"), "Num1")));
                condstmt = new CodeConditionStatement(eq, truestmt);
                cmm.Statements.Add(condstmt);

                eq = new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("i"),
                    CodeBinaryOperatorType.ValueEquality, new CodePrimitiveExpression(0));
                truestmt = new CodeMethodReturnStatement(new CodeCastExpression(typeof(int),
                    new CodeFieldReferenceExpression(new CodeTypeReferenceExpression("DecimalEnum"), "Num0")));
                condstmt = new CodeConditionStatement(eq, truestmt);
                cmm.Statements.Add(condstmt);

                cmm.ReturnType = new CodeTypeReference("System.int32");

                cmm.Statements.Add(new CodeMethodReturnStatement(new CodeBinaryOperatorExpression(
                    new CodeVariableReferenceExpression("i"), CodeBinaryOperatorType.Add, new CodePrimitiveExpression(10))));
                cd.Members.Add(cmm);
            }

            if (provider.Supports(GeneratorSupport.DeclareInterfaces))
            {
                cmm = new CodeMemberMethod();
                cmm.Name = "TestSingleInterface";
                cmm.ReturnType = new CodeTypeReference(typeof(int));
                cmm.Parameters.Add(new CodeParameterDeclarationExpression(typeof(int), "i"));
                cmm.Attributes = MemberAttributes.Public | MemberAttributes.Static;
                cmm.Statements.Add(new CodeVariableDeclarationStatement("TestSingleInterfaceImp", "t", new CodeObjectCreateExpression("TestSingleInterfaceImp")));
                CodeMethodInvokeExpression methodinvoke = new CodeMethodInvokeExpression(new CodeVariableReferenceExpression("t")
                    , "InterfaceMethod");
                methodinvoke.Parameters.Add(new CodeVariableReferenceExpression("i"));
                cmm.Statements.Add(new CodeMethodReturnStatement(methodinvoke));
                cd.Members.Add(cmm);

                class1 = new CodeTypeDeclaration("InterfaceA");
                class1.IsInterface = true;
                nspace.Types.Add(class1);
                cmm = new CodeMemberMethod();
                cmm.Attributes = MemberAttributes.Public;
                cmm.Name = "InterfaceMethod";
                cmm.ReturnType = new CodeTypeReference(typeof(int));
                cmm.Parameters.Add(new CodeParameterDeclarationExpression(typeof(int), "a"));
                class1.Members.Add(cmm);

                if (provider.Supports(GeneratorSupport.MultipleInterfaceMembers))
                {
                    CodeTypeDeclaration classDecl = new CodeTypeDeclaration("InterfaceB");
                    classDecl.IsInterface = true;
                    nspace.Types.Add(classDecl);
                    cmm = new CodeMemberMethod();
                    cmm.Name = "InterfaceMethod";
                    cmm.Attributes = MemberAttributes.Public;
                    cmm.ReturnType = new CodeTypeReference(typeof(int));
                    cmm.Parameters.Add(new CodeParameterDeclarationExpression(typeof(int), "a"));
                    classDecl.Members.Add(cmm);

                    CodeTypeDeclaration class2 = new CodeTypeDeclaration("TestMultipleInterfaceImp");
                    class2.BaseTypes.Add(new CodeTypeReference("System.Object"));
                    class2.BaseTypes.Add(new CodeTypeReference("InterfaceB"));
                    class2.BaseTypes.Add(new CodeTypeReference("InterfaceA"));
                    class2.IsClass = true;
                    nspace.Types.Add(class2);
                    cmm = new CodeMemberMethod();
                    cmm.ImplementationTypes.Add(new CodeTypeReference("InterfaceA"));
                    cmm.ImplementationTypes.Add(new CodeTypeReference("InterfaceB"));
                    cmm.Name = "InterfaceMethod";
                    cmm.ReturnType = new CodeTypeReference(typeof(int));
                    cmm.Parameters.Add(new CodeParameterDeclarationExpression(typeof(int), "a"));
                    cmm.Attributes = MemberAttributes.Public | MemberAttributes.Final;
                    cmm.Statements.Add(new CodeMethodReturnStatement(new CodeVariableReferenceExpression("a")));
                    class2.Members.Add(cmm);

                    cmm = new CodeMemberMethod();
                    cmm.Name = "TestMultipleInterfaces";
                    cmm.ReturnType = new CodeTypeReference(typeof(int));
                    cmm.Parameters.Add(new CodeParameterDeclarationExpression(typeof(int), "i"));
                    cmm.Attributes = MemberAttributes.Public | MemberAttributes.Static;
                    cmm.Statements.Add(new CodeVariableDeclarationStatement("TestMultipleInterfaceImp", "t", new CodeObjectCreateExpression("TestMultipleInterfaceImp")));
                    cmm.Statements.Add(new CodeVariableDeclarationStatement("InterfaceA", "interfaceAobject", new CodeCastExpression("InterfaceA",
                        new CodeVariableReferenceExpression("t"))));
                    cmm.Statements.Add(new CodeVariableDeclarationStatement("InterfaceB", "interfaceBobject", new CodeCastExpression("InterfaceB",
                        new CodeVariableReferenceExpression("t"))));
                    methodinvoke = new CodeMethodInvokeExpression(new CodeVariableReferenceExpression("interfaceAobject")
                        , "InterfaceMethod");
                    methodinvoke.Parameters.Add(new CodeVariableReferenceExpression("i"));
                    CodeMethodInvokeExpression methodinvoke2 = new CodeMethodInvokeExpression(new CodeVariableReferenceExpression("interfaceBobject")
                        , "InterfaceMethod");
                    methodinvoke2.Parameters.Add(new CodeVariableReferenceExpression("i"));
                    cmm.Statements.Add(new CodeMethodReturnStatement(new CodeBinaryOperatorExpression(
                        methodinvoke,
                        CodeBinaryOperatorType.Subtract, methodinvoke2)));
                    cd.Members.Add(cmm);
                }

                class1 = new CodeTypeDeclaration("TestSingleInterfaceImp");
                class1.BaseTypes.Add(new CodeTypeReference("System.Object"));
                class1.BaseTypes.Add(new CodeTypeReference("InterfaceA"));
                class1.IsClass = true;
                nspace.Types.Add(class1);
                cmm = new CodeMemberMethod();
                cmm.ImplementationTypes.Add(new CodeTypeReference("InterfaceA"));
                cmm.Name = "InterfaceMethod";
                cmm.ReturnType = new CodeTypeReference(typeof(int));
                cmm.Parameters.Add(new CodeParameterDeclarationExpression(typeof(int), "a"));
                cmm.Attributes = MemberAttributes.Public;
                cmm.Statements.Add(new CodeMethodReturnStatement(new CodeVariableReferenceExpression("a")));
                class1.Members.Add(cmm);
            }

            if (provider.Supports(GeneratorSupport.DeclareValueTypes))
            {
                CodeTypeDeclaration structA = new CodeTypeDeclaration("structA");
                structA.IsStruct = true;

                CodeTypeDeclaration structB = new CodeTypeDeclaration("structB");
                structB.Attributes = MemberAttributes.Public;
                structB.IsStruct = true;

                CodeMemberField firstInt = new CodeMemberField(typeof(int), "int1");
                firstInt.Attributes = MemberAttributes.Public;
                structB.Members.Add(firstInt);

                CodeMemberField innerStruct = new CodeMemberField("structB", "innerStruct");
                innerStruct.Attributes = MemberAttributes.Public;

                structA.Members.Add(structB);
                structA.Members.Add(innerStruct);
                nspace.Types.Add(structA);

                CodeMemberMethod nestedStructMethod = new CodeMemberMethod();
                nestedStructMethod.Name = "NestedStructMethod";
                nestedStructMethod.ReturnType = new CodeTypeReference(typeof(int));
                nestedStructMethod.Attributes = MemberAttributes.Public | MemberAttributes.Static;
                CodeVariableDeclarationStatement varStructA = new CodeVariableDeclarationStatement("structA", "varStructA");
                nestedStructMethod.Statements.Add(varStructA);
                nestedStructMethod.Statements.Add
                    (
                    new CodeAssignStatement
                    (
                    /* Expression1 */ new CodeFieldReferenceExpression(new CodeFieldReferenceExpression(new CodeVariableReferenceExpression("varStructA"), "innerStruct"), "int1"),
                    /* Expression1 */ new CodePrimitiveExpression(3)
                    )
                    );
                nestedStructMethod.Statements.Add(new CodeMethodReturnStatement(new CodeFieldReferenceExpression(new CodeFieldReferenceExpression(new CodeVariableReferenceExpression("varStructA"), "innerStruct"), "int1")));
                cd.Members.Add(nestedStructMethod);
            }
            if (provider.Supports(GeneratorSupport.EntryPointMethod))
            {
                CodeEntryPointMethod cep = new CodeEntryPointMethod();
                cd.Members.Add(cep);
            }
            // goto statements
            if (provider.Supports(GeneratorSupport.GotoStatements))
            {
                cmm = new CodeMemberMethod();
                cmm.Name = "GoToMethod";
                cmm.ReturnType = new CodeTypeReference(typeof(int));
                cmm.Attributes = MemberAttributes.Public | MemberAttributes.Final;
                CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression(typeof(int), "i");
                cmm.Parameters.Add(param);
                CodeConditionStatement condstmt = new CodeConditionStatement(new CodeBinaryOperatorExpression(
                    new CodeVariableReferenceExpression("i"), CodeBinaryOperatorType.LessThan, new CodePrimitiveExpression(1)),
                    new CodeGotoStatement("comehere"));
                cmm.Statements.Add(condstmt);
                cmm.Statements.Add(new CodeMethodReturnStatement(new CodePrimitiveExpression(6)));
                cmm.Statements.Add(new CodeLabeledStatement("comehere",
                    new CodeMethodReturnStatement(new CodePrimitiveExpression(7))));
                cd.Members.Add(cmm);
            }
            if (provider.Supports(GeneratorSupport.NestedTypes))
            {
                cmm = new CodeMemberMethod();
                cmm.Name = "CallingPublicNestedScenario";
                cmm.Parameters.Add(new CodeParameterDeclarationExpression(typeof(int), "i"));
                cmm.ReturnType = new CodeTypeReference(typeof(int));
                cmm.Attributes = MemberAttributes.Public | MemberAttributes.Static;
                cmm.Statements.Add(new CodeVariableDeclarationStatement(new CodeTypeReference
                    ("PublicNestedClassA+PublicNestedClassB2+PublicNestedClassC"), "t",
                    new CodeObjectCreateExpression(new CodeTypeReference
                    ("PublicNestedClassA+PublicNestedClassB2+PublicNestedClassC"))));
                cmm.Statements.Add(new CodeMethodReturnStatement(new CodeMethodInvokeExpression(new CodeVariableReferenceExpression("t"),
                    "publicNestedClassesMethod",
                    new CodeVariableReferenceExpression("i"))));
                cd.Members.Add(cmm);

                class1 = new CodeTypeDeclaration("PublicNestedClassA");
                class1.IsClass = true;
                nspace.Types.Add(class1);
                CodeTypeDeclaration nestedClass = new CodeTypeDeclaration("PublicNestedClassB1");
                nestedClass.IsClass = true;
                nestedClass.TypeAttributes = TypeAttributes.NestedPublic;
                class1.Members.Add(nestedClass);
                nestedClass = new CodeTypeDeclaration("PublicNestedClassB2");
                nestedClass.TypeAttributes = TypeAttributes.NestedPublic;
                nestedClass.IsClass = true;
                class1.Members.Add(nestedClass);
                CodeTypeDeclaration innerNestedClass = new CodeTypeDeclaration("PublicNestedClassC");
                innerNestedClass.TypeAttributes = TypeAttributes.NestedPublic;
                innerNestedClass.IsClass = true;
                nestedClass.Members.Add(innerNestedClass);
                cmm = new CodeMemberMethod();
                cmm.Name = "publicNestedClassesMethod";
                cmm.ReturnType = new CodeTypeReference(typeof(int));
                cmm.Parameters.Add(new CodeParameterDeclarationExpression(typeof(int), "a"));
                cmm.Attributes = MemberAttributes.Public | MemberAttributes.Final;
                cmm.Statements.Add(new CodeMethodReturnStatement(new CodeVariableReferenceExpression("a")));
                innerNestedClass.Members.Add(cmm);
            }
            // Parameter Attributes
            if (provider.Supports(GeneratorSupport.ParameterAttributes))
            {
                CodeMemberMethod method1 = new CodeMemberMethod();
                method1.Name = "MyMethod";
                method1.Attributes = MemberAttributes.Public | MemberAttributes.Final;
                CodeParameterDeclarationExpression param1 = new CodeParameterDeclarationExpression(typeof(string), "blah");
                param1.CustomAttributes.Add(
                    new CodeAttributeDeclaration(
                    "System.Xml.Serialization.XmlElementAttribute",
                    new CodeAttributeArgument(
                    "Form",
                    new CodeFieldReferenceExpression(new CodeTypeReferenceExpression("System.Xml.Schema.XmlSchemaForm"), "Unqualified")),
                    new CodeAttributeArgument(
                    "IsNullable",
                    new CodePrimitiveExpression(false))));
                method1.Parameters.Add(param1);
                cd.Members.Add(method1);
            }
            // public static members
            if (provider.Supports(GeneratorSupport.PublicStaticMembers))
            {
                cmm = new CodeMemberMethod();
                cmm.Name = "PublicStaticMethod";
                cmm.ReturnType = new CodeTypeReference(typeof(int));
                cmm.Attributes = MemberAttributes.Public | MemberAttributes.Static;
                cmm.Statements.Add(new CodeMethodReturnStatement(new CodePrimitiveExpression(16)));
                cd.Members.Add(cmm);
            }
            // reference parameters
            if (provider.Supports(GeneratorSupport.ReferenceParameters))
            {
                cmm = new CodeMemberMethod();
                cmm.Name = "Work";
                cmm.ReturnType = new CodeTypeReference("System.void");
                cmm.Attributes = MemberAttributes.Static;
                // add parameter with ref direction
                CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression(typeof(int), "i");
                param.Direction = FieldDirection.Ref;
                cmm.Parameters.Add(param);
                // add parameter with out direction
                param = new CodeParameterDeclarationExpression(typeof(int), "j");
                param.Direction = FieldDirection.Out;
                cmm.Parameters.Add(param);
                cmm.Statements.Add(new CodeAssignStatement(new CodeArgumentReferenceExpression("i"),
                    new CodeBinaryOperatorExpression(new CodeArgumentReferenceExpression("i"),
                    CodeBinaryOperatorType.Add, new CodePrimitiveExpression(4))));
                cmm.Statements.Add(new CodeAssignStatement(new CodeArgumentReferenceExpression("j"),
                    new CodePrimitiveExpression(5)));
                cd.Members.Add(cmm);

                cmm = new CodeMemberMethod();
                cmm.Name = "CallingWork";
                cmm.Attributes = MemberAttributes.Public | MemberAttributes.Static;
                CodeParameterDeclarationExpression parames = new CodeParameterDeclarationExpression(typeof(int), "a");
                cmm.Parameters.Add(parames);
                cmm.ReturnType = new CodeTypeReference("System.int32");
                cmm.Statements.Add(new CodeAssignStatement(new CodeVariableReferenceExpression("a"),
                    new CodePrimitiveExpression(10)));
                cmm.Statements.Add(new CodeVariableDeclarationStatement(typeof(int), "b"));
                // invoke the method called "work"
                CodeMethodInvokeExpression methodinvoked = new CodeMethodInvokeExpression(new CodeMethodReferenceExpression
                    (new CodeTypeReferenceExpression("TEST"), "Work"));
                // add parameter with ref direction
                CodeDirectionExpression parameter = new CodeDirectionExpression(FieldDirection.Ref,
                    new CodeVariableReferenceExpression("a"));
                methodinvoked.Parameters.Add(parameter);
                // add parameter with out direction
                parameter = new CodeDirectionExpression(FieldDirection.Out, new CodeVariableReferenceExpression("b"));
                methodinvoked.Parameters.Add(parameter);
                cmm.Statements.Add(methodinvoked);
                cmm.Statements.Add(new CodeMethodReturnStatement(new CodeBinaryOperatorExpression
                    (new CodeVariableReferenceExpression("a"), CodeBinaryOperatorType.Add, new CodeVariableReferenceExpression("b"))));
                cd.Members.Add(cmm);
            }
            if (provider.Supports(GeneratorSupport.ReturnTypeAttributes))
            {
                CodeMemberMethod function1 = new CodeMemberMethod();
                function1.Name = "MyFunction";
                function1.ReturnType = new CodeTypeReference(typeof(string));
                function1.Attributes = MemberAttributes.Public | MemberAttributes.Final;
                function1.ReturnTypeCustomAttributes.Add(new
                    CodeAttributeDeclaration("System.Xml.Serialization.XmlIgnoreAttribute"));
                function1.ReturnTypeCustomAttributes.Add(new CodeAttributeDeclaration("System.Xml.Serialization.XmlRootAttribute", new
                    CodeAttributeArgument("Namespace", new CodePrimitiveExpression("Namespace Value")), new
                    CodeAttributeArgument("ElementName", new CodePrimitiveExpression("Root, hehehe"))));
                function1.Statements.Add(new CodeMethodReturnStatement(new CodePrimitiveExpression("Return")));
                cd.Members.Add(function1);
            }
            if (provider.Supports(GeneratorSupport.StaticConstructors))
            {
                cmm = new CodeMemberMethod();
                cmm.Name = "TestStaticConstructor";
                cmm.Attributes = MemberAttributes.Public | MemberAttributes.Static;
                cmm.ReturnType = new CodeTypeReference(typeof(int));
                CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression(typeof(int), "a");
                cmm.Parameters.Add(param);
                // utilize constructor
                cmm.Statements.Add(new CodeVariableDeclarationStatement("Test4", "t", new CodeObjectCreateExpression("Test4")));
                // set then get number
                cmm.Statements.Add(new CodeAssignStatement(new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("t"), "i")
                    , new CodeVariableReferenceExpression("a")));
                cmm.Statements.Add(new CodeMethodReturnStatement(new CodeMethodReferenceExpression(
                    new CodeVariableReferenceExpression("t"), "i")));
                cd.Members.Add(cmm);

                class1 = new CodeTypeDeclaration();
                class1.Name = "Test4";
                class1.IsClass = true;
                nspace.Types.Add(class1);

                class1.Members.Add(new CodeMemberField(new CodeTypeReference(typeof(int)), "number"));
                CodeMemberProperty prop = new CodeMemberProperty();
                prop.Name = "i";
                prop.Attributes = MemberAttributes.Public | MemberAttributes.Final;
                prop.Type = new CodeTypeReference(typeof(int));
                prop.GetStatements.Add(new CodeMethodReturnStatement(new CodeVariableReferenceExpression("number")));
                prop.SetStatements.Add(new CodeAssignStatement(new CodeVariableReferenceExpression("number"),
                    new CodePropertySetValueReferenceExpression()));
                class1.Members.Add(prop);
                CodeTypeConstructor ctc = new CodeTypeConstructor();
                class1.Members.Add(ctc);
            }
            if (provider.Supports(GeneratorSupport.TryCatchStatements))
            {
                cmm = new CodeMemberMethod();
                cmm.Name = "TryCatchMethod";
                cmm.ReturnType = new CodeTypeReference(typeof(int));
                cmm.Attributes = MemberAttributes.Public | MemberAttributes.Static;
                CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression(typeof(int), "a");
                cmm.Parameters.Add(param);

                CodeTryCatchFinallyStatement tcfstmt = new CodeTryCatchFinallyStatement();
                tcfstmt.FinallyStatements.Add(new CodeAssignStatement(new CodeVariableReferenceExpression("a"), new
                    CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("a"), CodeBinaryOperatorType.Add,
                    new CodePrimitiveExpression(5))));
                cmm.Statements.Add(tcfstmt);
                cmm.Statements.Add(new CodeMethodReturnStatement(new CodeVariableReferenceExpression("a")));
                cd.Members.Add(cmm);
            }
            if (provider.Supports(GeneratorSupport.DeclareEvents))
            {
                CodeNamespace ns = new CodeNamespace();
                ns.Name = "MyNamespace";
                ns.Imports.Add(new CodeNamespaceImport("System"));
                ns.Imports.Add(new CodeNamespaceImport("System.Drawing"));
                ns.Imports.Add(new CodeNamespaceImport("System.Windows.Forms"));
                ns.Imports.Add(new CodeNamespaceImport("System.ComponentModel"));
                cu.Namespaces.Add(ns);
                class1 = new CodeTypeDeclaration("Test");
                class1.IsClass = true;
                class1.BaseTypes.Add(new CodeTypeReference("Form"));
                ns.Types.Add(class1);

                CodeMemberField mfield = new CodeMemberField(new CodeTypeReference("Button"), "b");
                mfield.InitExpression = new CodeObjectCreateExpression(new CodeTypeReference("Button"));
                class1.Members.Add(mfield);

                CodeConstructor ctor = new CodeConstructor();
                ctor.Attributes = MemberAttributes.Public;
                ctor.Statements.Add(new CodeAssignStatement(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(),
                    "Size"), new CodeObjectCreateExpression(new CodeTypeReference("Size"),
                    new CodePrimitiveExpression(600), new CodePrimitiveExpression(600))));
                ctor.Statements.Add(new CodeAssignStatement(new CodeFieldReferenceExpression(new CodeTypeReferenceExpression("b"),
                    "Text"), new CodePrimitiveExpression("Test")));
                ctor.Statements.Add(new CodeAssignStatement(new CodeFieldReferenceExpression(new CodeTypeReferenceExpression("b"),
                    "TabIndex"), new CodePrimitiveExpression(0)));
                ctor.Statements.Add(new CodeAssignStatement(new CodeFieldReferenceExpression(new CodeTypeReferenceExpression("b"),
                    "Location"), new CodeObjectCreateExpression(new CodeTypeReference("Point"),
                    new CodePrimitiveExpression(400), new CodePrimitiveExpression(525))));
                ctor.Statements.Add(new CodeAttachEventStatement(new CodeEventReferenceExpression(new
                    CodeThisReferenceExpression(), "MyEvent"), new CodeDelegateCreateExpression(new CodeTypeReference("EventHandler")
                    , new CodeThisReferenceExpression(), "b_Click")));
                class1.Members.Add(ctor);

                CodeMemberEvent evt = new CodeMemberEvent();
                evt.Name = "MyEvent";
                evt.Type = new CodeTypeReference("System.EventHandler");
                evt.Attributes = MemberAttributes.Public;
                class1.Members.Add(evt);

                cmm = new CodeMemberMethod();
                cmm.Name = "b_Click";
                cmm.Parameters.Add(new CodeParameterDeclarationExpression(typeof(object), "sender"));
                cmm.Parameters.Add(new CodeParameterDeclarationExpression(typeof(EventArgs), "e"));
                class1.Members.Add(cmm);
            }

            AssertEqual(cu,
                @"//------------------------------------------------------------------------------
                  // <auto-generated>
                  //     This code was generated by a tool.
                  //     Runtime Version:4.0.30319.42000
                  //
                  //     Changes to this file may cause incorrect behavior and will be lost if
                  //     the code is regenerated.
                  // </auto-generated>
                  //------------------------------------------------------------------------------

                  [assembly: System.Reflection.AssemblyTitle(""MyAssembly"")]
                  [assembly: System.Reflection.AssemblyVersion(""1.0.6.2"")]

                  namespace NSPC {
                      using System;
                      using System.Drawing;
                      using System.Windows.Forms;
                      using System.ComponentModel;

                      public class TEST {

                          public int ArraysOfArrays() {
                              int[][] arrayOfArrays = new int[][] {
                                      new int[] { 3, 4},
                                      new int[] { 1}};
                              return arrayOfArrays[0][1];
                          }

                          public static string ChainedConstructorUse() {
                              Test2 t = new Test2();
                              return t.accessStringField;
                          }

                          public int ComplexExpressions(int i) {
                              i = (i * (i + 3));
                              return i;
                          }

                          public static int OutputDecimalEnumVal(int i) {
                              if ((i == 3)) {
                                  return ((int)(DecimalEnum.Num3));
                              }
                              if ((i == 4)) {
                                  return ((int)(DecimalEnum.Num4));
                              }
                              if ((i == 2)) {
                                  return ((int)(DecimalEnum.Num2));
                              }
                              if ((i == 1)) {
                                  return ((int)(DecimalEnum.Num1));
                              }
                              if ((i == 0)) {
                                  return ((int)(DecimalEnum.Num0));
                              }
                              return (i + 10);
                          }

                          public static int TestSingleInterface(int i) {
                              TestSingleInterfaceImp t = new TestSingleInterfaceImp();
                              return t.InterfaceMethod(i);
                          }

                          public static int TestMultipleInterfaces(int i) {
                              TestMultipleInterfaceImp t = new TestMultipleInterfaceImp();
                              InterfaceA interfaceAobject = ((InterfaceA)(t));
                              InterfaceB interfaceBobject = ((InterfaceB)(t));
                              return (interfaceAobject.InterfaceMethod(i) - interfaceBobject.InterfaceMethod(i));
                          }

                          public static int NestedStructMethod() {
                              structA varStructA;
                              varStructA.innerStruct.int1 = 3;
                              return varStructA.innerStruct.int1;
                          }

                          public static void Main() { }

                          public int GoToMethod(int i) {
                              if ((i < 1)) {
                                  goto comehere;
                              }
                              return 6;
                          comehere:
                              return 7;
                          }

                          public static int CallingPublicNestedScenario(int i) {
                              PublicNestedClassA.PublicNestedClassB2.PublicNestedClassC t = new PublicNestedClassA.PublicNestedClassB2.PublicNestedClassC();
                              return t.publicNestedClassesMethod(i);
                          }

                          public void MyMethod([System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable=false)] string blah) {
                          }

                          public static int PublicStaticMethod() {
                              return 16;
                          }

                          static void Work(ref int i, out int j) {
                              i = (i + 4);
                              j = 5;
                          }

                          public static int CallingWork(int a) {
                              a = 10;
                              int b;
                              TEST.Work(ref a, out b);
                              return (a + b);
                          }

                          [return: System.Xml.Serialization.XmlIgnoreAttribute()]
                          [return: System.Xml.Serialization.XmlRootAttribute(Namespace=""Namespace Value"", ElementName=""Root, hehehe"")]
                          public string MyFunction() {
                              return ""Return"";
                          }

                          public static int TestStaticConstructor(int a) {
                              Test4 t = new Test4();
                              t.i = a;
                              return t.i;
                          }

                          public static int TryCatchMethod(int a) {
                              try {
                              }
                              finally {
                                  a = (a + 5);
                              }
                              return a;
                          }
                      }

                      public class Test2 {

                          private string stringField;

                          public Test2() :
                                  this(""testingString"", null, null) {
                          }

                          public Test2(string p1, string p2, string p3) {
                              this.stringField = p1;
                          }

                          public string accessStringField {
                              get {
                                  return this.stringField;
                              }
                              set {
                                  this.stringField = value;
                              }
                          }
                      }

                      public enum DecimalEnum {
                          Num0 = 0,
                          Num1 = 1,
                          Num2 = 2,
                          Num3 = 3,
                          Num4 = 4,
                      }

                      public interface InterfaceA {
                          int InterfaceMethod(int a);
                      }

                      public interface InterfaceB {
                          int InterfaceMethod(int a);
                      }

                      public class TestMultipleInterfaceImp : object, InterfaceB, InterfaceA {
                          public int InterfaceMethod(int a) {
                              return a;
                          }
                      }

                      public class TestSingleInterfaceImp : object, InterfaceA {
                          public virtual int InterfaceMethod(int a) {
                              return a;
                          }
                      }

                      public struct structA {
                          public structB innerStruct;

                          public struct structB {
                              public int int1;
                          }
                      }

                      public class PublicNestedClassA {

                          public class PublicNestedClassB1 { }

                          public class PublicNestedClassB2 {
                              public class PublicNestedClassC {
                                  public int publicNestedClassesMethod(int a) {
                                      return a;
                                  }
                              }
                          }
                      }

                      public class Test4 {

                          private int number;

                          static Test4() {
                          }

                          public int i {
                              get {
                                  return number;
                              }
                              set {
                                  number = value;
                              }
                          }
                      }
                  }
                  namespace MyNamespace {
                      using System;
                      using System.Drawing;
                      using System.Windows.Forms;
                      using System.ComponentModel;

                      public class Test : Form {
                          private Button b = new Button();

                          public Test() {
                              this.Size = new Size(600, 600);
                              b.Text = ""Test"";
                              b.TabIndex = 0;
                              b.Location = new Point(400, 525);
                              this.MyEvent += new EventHandler(this.b_Click);
                          }

                          public event System.EventHandler MyEvent;

                          private void b_Click(object sender, System.EventArgs e) {
                          }
                      }
                  }");
        }
        public void TryCatchThrow()
        {
            var cd = new CodeTypeDeclaration();
            cd.Name = "Test";
            cd.IsClass = true;

            // try catch statement with just finally
            var cmm = new CodeMemberMethod();
            cmm.Name = "FirstScenario";
            cmm.ReturnType = new CodeTypeReference(typeof(int));
            cmm.Attributes = MemberAttributes.Public | MemberAttributes.Static;
            CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression(typeof(int), "a");
            cmm.Parameters.Add(param);

            CodeTryCatchFinallyStatement tcfstmt = new CodeTryCatchFinallyStatement();
            tcfstmt.FinallyStatements.Add(new CodeAssignStatement(new CodeVariableReferenceExpression("a"), new
                                                                  CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("a"), CodeBinaryOperatorType.Add,
                                                                                               new CodePrimitiveExpression(5))));
            cmm.Statements.Add(tcfstmt);
            cmm.Statements.Add(new CodeMethodReturnStatement(new CodeVariableReferenceExpression("a")));
            cd.Members.Add(cmm);

            CodeBinaryOperatorExpression cboExpression = new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("a"), CodeBinaryOperatorType.Divide, new CodeVariableReferenceExpression("a"));
            CodeAssignStatement assignStatement = new CodeAssignStatement(new CodeVariableReferenceExpression("a"), cboExpression);

            // try catch statement with just catch
            cmm = new CodeMemberMethod();
            cmm.Name = "SecondScenario";
            cmm.ReturnType = new CodeTypeReference(typeof(int));
            cmm.Attributes = MemberAttributes.Public | MemberAttributes.Static;
            param = new CodeParameterDeclarationExpression(typeof(int), "a");
            cmm.Parameters.Add(param);
            cmm.Parameters.Add(new CodeParameterDeclarationExpression(typeof(String), "exceptionMessage"));

            tcfstmt = new CodeTryCatchFinallyStatement();
            CodeCatchClause catchClause = new CodeCatchClause("e");
            tcfstmt.TryStatements.Add(assignStatement);
            catchClause.Statements.Add(new CodeAssignStatement(new CodeVariableReferenceExpression("a"),
                                                               new CodePrimitiveExpression(3)));
            catchClause.Statements.Add(new CodeAssignStatement(new CodeVariableReferenceExpression("exceptionMessage"),
                                                               new CodeMethodInvokeExpression(new CodeVariableReferenceExpression("e"), "ToString")));
            tcfstmt.CatchClauses.Add(catchClause);
            tcfstmt.FinallyStatements.Add(CreateVariableIncrementExpression("a", 1));

            cmm.Statements.Add(tcfstmt);
            cmm.Statements.Add(new CodeMethodReturnStatement(new CodeVariableReferenceExpression("a")));

            cd.Members.Add(cmm);

            // try catch statement with multiple catches
            cmm = new CodeMemberMethod();
            cmm.Name = "ThirdScenario";
            cmm.ReturnType = new CodeTypeReference(typeof(int));
            cmm.Attributes = MemberAttributes.Public | MemberAttributes.Static;
            param = new CodeParameterDeclarationExpression(typeof(int), "a");
            cmm.Parameters.Add(param);
            cmm.Parameters.Add(new CodeParameterDeclarationExpression(typeof(String), "exceptionMessage"));

            tcfstmt = new CodeTryCatchFinallyStatement();
            catchClause = new CodeCatchClause("e", new CodeTypeReference(typeof(ArgumentNullException)));
            tcfstmt.TryStatements.Add(assignStatement);
            catchClause.Statements.Add(new CodeAssignStatement(new CodeVariableReferenceExpression("a"),
                                                               new CodePrimitiveExpression(9)));
            catchClause.Statements.Add(new CodeAssignStatement(new CodeVariableReferenceExpression("exceptionMessage"),
                                                               new CodeMethodInvokeExpression(new CodeVariableReferenceExpression("e"), "ToString")));
            tcfstmt.CatchClauses.Add(catchClause);

            // add a second catch clause
            catchClause = new CodeCatchClause("f", new CodeTypeReference(typeof(Exception)));
            catchClause.Statements.Add(new CodeAssignStatement(new CodeVariableReferenceExpression("exceptionMessage"),
                                                               new CodeMethodInvokeExpression(new CodeVariableReferenceExpression("f"), "ToString")));
            catchClause.Statements.Add(new CodeAssignStatement(new CodeVariableReferenceExpression("a"),
                                                               new CodePrimitiveExpression(9)));
            tcfstmt.CatchClauses.Add(catchClause);

            cmm.Statements.Add(tcfstmt);
            cmm.Statements.Add(new CodeMethodReturnStatement(new CodeVariableReferenceExpression("a")));
            cd.Members.Add(cmm);

            // catch throws exception
            cmm = new CodeMemberMethod();
            cmm.Name = "FourthScenario";
            cmm.ReturnType = new CodeTypeReference(typeof(int));
            cmm.Attributes = MemberAttributes.Public | MemberAttributes.Static;
            param = new CodeParameterDeclarationExpression(typeof(int), "a");
            cmm.Parameters.Add(param);

            tcfstmt = new CodeTryCatchFinallyStatement();
            catchClause = new CodeCatchClause("e");
            tcfstmt.TryStatements.Add(assignStatement);
            catchClause.Statements.Add(new CodeCommentStatement("Error handling"));
            catchClause.Statements.Add(new CodeThrowExceptionStatement(new CodeArgumentReferenceExpression("e")));
            tcfstmt.CatchClauses.Add(catchClause);
            cmm.Statements.Add(tcfstmt);
            cmm.Statements.Add(new CodeMethodReturnStatement(new CodeVariableReferenceExpression("a")));
            cd.Members.Add(cmm);

            AssertEqual(cd,
                @"public class Test {
                      public static int FirstScenario(int a) {
                          try {
                          }
                          finally {
                              a = (a + 5);
                          }
                          return a;
                      }
                      public static int SecondScenario(int a, string exceptionMessage) {
                          try {
                              a = (a / a);
                          }
                          catch (System.Exception e) {
                              a = 3;
                              exceptionMessage = e.ToString();
                          }
                          finally {
                              a = (a + 1);
                          }
                          return a;
                      }
                      public static int ThirdScenario(int a, string exceptionMessage) {
                          try {
                              a = (a / a);
                          }
                          catch (System.ArgumentNullException e) {
                              a = 9;
                              exceptionMessage = e.ToString();
                          }
                          catch (System.Exception f) {
                              exceptionMessage = f.ToString();
                              a = 9;
                          }
                          return a;
                      }
                      public static int FourthScenario(int a) {
                          try {
                              a = (a / a);
                          }
                          catch (System.Exception e) {
                              // Error handling
                              throw e;
                          }
                          return a;
                      }
                  }");
        }
		protected virtual void GenerateBinaryOperatorExpression(CodeBinaryOperatorExpression e)
		{
			// CLEANUP: This has been cleaned up so that the code it generates looks better.
			// Namely by eliminating unneeded grouping symbols.
			// Should eventually expand this to work based on order of operations, so that
			// "a + b - c" can generate as "a + b - c" rather than as either "(a + b) - c"
			// or "a + (b - c)" as it is generated now.
			if (e.NeedsGrouping)
				output.Write('(');
			if (e.Left is CodeCastExpression)
				((CodeCastExpression)e.Left).NeedsGrouping = false;
			else if (e.Left is CodeBinaryOperatorExpression && ((CodeBinaryOperatorExpression)e.Left).Operator == e.Operator)
				((CodeBinaryOperatorExpression)e.Left).NeedsGrouping = false;
			GenerateExpression(e.Left);
			output.Write(' ');
			OutputOperator(e.Operator);
			output.Write(' ');
			if (e.Right is CodeCastExpression)
				((CodeCastExpression)e.Right).NeedsGrouping = false;
			else if (e.Right is CodeBinaryOperatorExpression && ((CodeBinaryOperatorExpression)e.Right).Operator == e.Operator)
				((CodeBinaryOperatorExpression)e.Right).NeedsGrouping = false;
			GenerateExpression(e.Right);
			if (e.NeedsGrouping)
				output.Write(')');
		}
        public void TryCatchThrow()
        {
            var cd = new CodeTypeDeclaration();
            cd.Name = "Test";
            cd.IsClass = true;

            // try catch statement with just finally
            CodeMemberMethod cmm = new CodeMemberMethod();
            cmm.Name = "FirstScenario";
            cmm.ReturnType = new CodeTypeReference(typeof(int));
            cmm.Attributes = MemberAttributes.Public | MemberAttributes.Static;
            CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression(typeof(int), "a");
            cmm.Parameters.Add(param);

            CodeTryCatchFinallyStatement tcfstmt = new CodeTryCatchFinallyStatement();
            tcfstmt.FinallyStatements.Add(new CodeAssignStatement(new CodeVariableReferenceExpression("a"), new
                                                                  CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("a"), CodeBinaryOperatorType.Add,
                                                                                               new CodePrimitiveExpression(5))));
            cmm.Statements.Add(tcfstmt);
            cmm.Statements.Add(new CodeMethodReturnStatement(new CodeVariableReferenceExpression("a")));
            cd.Members.Add(cmm);

            CodeBinaryOperatorExpression cboExpression = new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("a"), CodeBinaryOperatorType.Divide, new CodeVariableReferenceExpression("a"));
            CodeAssignStatement assignStatement = new CodeAssignStatement(new CodeVariableReferenceExpression("a"), cboExpression);

            // try catch statement with just catch
            cmm = new CodeMemberMethod();
            cmm.Name = "SecondScenario";
            cmm.ReturnType = new CodeTypeReference(typeof(int));
            cmm.Attributes = MemberAttributes.Public | MemberAttributes.Static;
            param = new CodeParameterDeclarationExpression(typeof(int), "a");
            cmm.Parameters.Add(param);
            cmm.Parameters.Add(new CodeParameterDeclarationExpression(typeof(String), "exceptionMessage"));

            tcfstmt = new CodeTryCatchFinallyStatement();
            CodeCatchClause catchClause = new CodeCatchClause("e");
            tcfstmt.TryStatements.Add(assignStatement);
            catchClause.Statements.Add(new CodeAssignStatement(new CodeVariableReferenceExpression("a"),
                                                               new CodePrimitiveExpression(3)));
            catchClause.Statements.Add(new CodeAssignStatement(new CodeVariableReferenceExpression("exceptionMessage"),
                                                               new CodeMethodInvokeExpression(new CodeVariableReferenceExpression("e"), "ToString")));
            tcfstmt.CatchClauses.Add(catchClause);
            tcfstmt.FinallyStatements.Add(CreateVariableIncrementExpression("a", 1));

            cmm.Statements.Add(tcfstmt);
            cmm.Statements.Add(new CodeMethodReturnStatement(new CodeVariableReferenceExpression("a")));

            cd.Members.Add(cmm);

            // try catch statement with multiple catches
            cmm = new CodeMemberMethod();
            cmm.Name = "ThirdScenario";
            cmm.ReturnType = new CodeTypeReference(typeof(int));
            cmm.Attributes = MemberAttributes.Public | MemberAttributes.Static;
            param = new CodeParameterDeclarationExpression(typeof(int), "a");
            cmm.Parameters.Add(param);
            cmm.Parameters.Add(new CodeParameterDeclarationExpression(typeof(String), "exceptionMessage"));

            tcfstmt = new CodeTryCatchFinallyStatement();
            catchClause = new CodeCatchClause("e", new CodeTypeReference(typeof(ArgumentNullException)));
            tcfstmt.TryStatements.Add(assignStatement);
            catchClause.Statements.Add(new CodeAssignStatement(new CodeVariableReferenceExpression("a"),
                                                               new CodePrimitiveExpression(9)));
            catchClause.Statements.Add(new CodeAssignStatement(new CodeVariableReferenceExpression("exceptionMessage"),
                                                               new CodeMethodInvokeExpression(new CodeVariableReferenceExpression("e"), "ToString")));
            tcfstmt.CatchClauses.Add(catchClause);

            // add a second catch clause
            catchClause = new CodeCatchClause("f", new CodeTypeReference(typeof(Exception)));
            catchClause.Statements.Add(new CodeAssignStatement(new CodeVariableReferenceExpression("exceptionMessage"),
                                                               new CodeMethodInvokeExpression(new CodeVariableReferenceExpression("f"), "ToString")));
            catchClause.Statements.Add(new CodeAssignStatement(new CodeVariableReferenceExpression("a"),
                                                               new CodePrimitiveExpression(9)));
            tcfstmt.CatchClauses.Add(catchClause);

            cmm.Statements.Add(tcfstmt);
            cmm.Statements.Add(new CodeMethodReturnStatement(new CodeVariableReferenceExpression("a")));
            cd.Members.Add(cmm);

            // catch throws exception
            cmm = new CodeMemberMethod();
            cmm.Name = "FourthScenario";
            cmm.ReturnType = new CodeTypeReference(typeof(int));
            cmm.Attributes = MemberAttributes.Public | MemberAttributes.Static;
            param = new CodeParameterDeclarationExpression(typeof(int), "a");
            cmm.Parameters.Add(param);

            tcfstmt = new CodeTryCatchFinallyStatement();
            catchClause = new CodeCatchClause("e");
            tcfstmt.TryStatements.Add(assignStatement);
            catchClause.Statements.Add(new CodeCommentStatement("Error handling"));
            catchClause.Statements.Add(new CodeThrowExceptionStatement(new CodeArgumentReferenceExpression("e")));
            tcfstmt.CatchClauses.Add(catchClause);
            cmm.Statements.Add(tcfstmt);
            cmm.Statements.Add(new CodeMethodReturnStatement(new CodeVariableReferenceExpression("a")));
            cd.Members.Add(cmm);

            AssertEqual(cd,
                @"Public Class Test
                      Public Shared Function FirstScenario(ByVal a As Integer) As Integer
                          Try
                          Finally
                              a = (a + 5)
                          End Try
                          Return a
                      End Function
                      Public Shared Function SecondScenario(ByVal a As Integer, ByVal exceptionMessage As String) As Integer
                          Try
                              a = (a / a)
                          Catch e As System.Exception
                              a = 3
                              exceptionMessage = e.ToString
                          Finally
                              a = (a + 1)
                          End Try
                          Return a
                      End Function
                      Public Shared Function ThirdScenario(ByVal a As Integer, ByVal exceptionMessage As String) As Integer
                          Try
                              a = (a / a)
                          Catch e As System.ArgumentNullException
                              a = 9
                              exceptionMessage = e.ToString
                          Catch f As System.Exception
                              exceptionMessage = f.ToString
                              a = 9
                          End Try
                          Return a
                      End Function
                      Public Shared Function FourthScenario(ByVal a As Integer) As Integer
                          Try
                              a = (a / a)
                          Catch e As System.Exception
                              'Error handling
                              Throw e
                          End Try
                          Return a
                      End Function
                  End Class");
        }
 public void VisitBinary(CodeBinaryOperatorExpression bin)
 {
     var prec = operatorPrecedence[bin.Operator];
     if (prec < precedence)
     {
         writer.Write("(");
     }
     Write(bin.Left, prec);
     writer.Write(" {0} ", OpToString(bin.Operator));
     Write(bin.Right, prec);
     if (prec < precedence)
     {
         writer.Write(")");
     }
 }
        public void OperatingOnFields()
        {
            var cd = new CodeTypeDeclaration("TestFields") { IsClass = true };

            var cmm = new CodeMemberMethod();
            cmm.Name = "UseFields";
            cmm.Attributes = MemberAttributes.Public | MemberAttributes.Static;
            cmm.ReturnType = new CodeTypeReference(typeof(int));
            cmm.Parameters.Add(new CodeParameterDeclarationExpression(new CodeTypeReference(typeof(int)), "i"));
            cmm.Statements.Add(new CodeVariableDeclarationStatement(new CodeTypeReference("ClassWithFields"), "number", new CodeObjectCreateExpression("ClassWithFields")));
            var binaryOpExpression = new CodeBinaryOperatorExpression(
                new CodeFieldReferenceExpression(
                    new CodeVariableReferenceExpression("number"), "NonStaticPublicField"), CodeBinaryOperatorType.Add,
                    new CodeMethodInvokeExpression(new CodeVariableReferenceExpression("number"), "UsePrivateField", new CodeVariableReferenceExpression("i")));
            cmm.Statements.Add(new CodeMethodReturnStatement(new CodeBinaryOperatorExpression(
                binaryOpExpression, CodeBinaryOperatorType.Add, new CodeFieldReferenceExpression(new CodeTypeReferenceExpression("ClassWithFields"), "StaticPublicField"))));
            cd.Members.Add(cmm);

            AssertEqual(cd,
                @"Public Class TestFields
                      Public Shared Function UseFields(ByVal i As Integer) As Integer
                          Dim number As ClassWithFields = New ClassWithFields()
                          Return ((number.NonStaticPublicField + number.UsePrivateField(i))  _
                                      + ClassWithFields.StaticPublicField)
                      End Function
                  End Class");
        }
    public override void BuildTree (CodeDomProvider provider, CodeCompileUnit cu) {

        CodeNamespace ns = new CodeNamespace ("Namespace1");

        cu.Namespaces.Add (ns);

        CodeTypeDeclaration cd = new CodeTypeDeclaration ("TEST");
        cd.IsClass = true;
        ns.Types.Add (cd);

        if (Supports (provider, GeneratorSupport.DeclareEnums)) {
            // GENERATE (C#):
            //    public enum DecimalEnum {
            //        Num0 = 0,
            //        Num1 = 1,
            //        Num2 = 2,
            //        Num3 = 3,
            //        Num4 = 4,
            //    }

            CodeTypeDeclaration ce = new CodeTypeDeclaration ("DecimalEnum");
            ce.IsEnum = true;
            ns.Types.Add (ce);

            // things to enumerate
            for (int k = 0; k < 5; k++) {
                CodeMemberField Field = new CodeMemberField ("System.Int32", "Num" + (k).ToString ());
                //Field.InitExpression = new CodePrimitiveExpression (k);
                ce.Members.Add (Field);
            }

            // GENERATE (C#):
            //    public enum BinaryEnum {
            //        Bin1 = 1,
            //        Bin2 = 2,
            //        Bin3 = 4,
            //        Bin4 = 8,
            //        Bin5 = 16,
            //    }

            ce = new CodeTypeDeclaration ("BinaryEnum");
            ce.IsEnum = true;
            ns.Types.Add (ce);

            // things to enumerate
            int i = 0x01;
            for (int k = 1; k < 6; k++) {
                CodeMemberField Field = new CodeMemberField (typeof (int), "Bin" + (k).ToString ());
                Field.InitExpression = new CodePrimitiveExpression (i);
                i = i * 2;
                ce.Members.Add (Field);
            }

#if WHIDBEY
            // GENERATE (C#):
            //    public enum MyEnum: System.UInt64 {
            //        small = 0,
            //        medium = Int64.MaxValue/10,
            //        large = Int64.MaxValue,
            //    }
            ce = new CodeTypeDeclaration ("MyEnum");
            ce.BaseTypes.Add (new CodeTypeReference (typeof (UInt64)));
            ce.IsEnum = true;
            ns.Types.Add (ce);

            // Add fields     
            ce.Members.Add (CreateFieldMember ("Small", 0));
            ce.Members.Add (CreateFieldMember ("Medium", Int64.MaxValue / 10));
            ce.Members.Add (CreateFieldMember ("Large", Int64.MaxValue));
#endif

            // GENERATE (C#):
            //        public int OutputDecimalEnumVal(int i) {
            //                if ((i == 3)) {
            //                        return ((int)(DecimalEnum.Num3));
            //                }
            //                if ((i == 4)) {
            //                        return ((int)(DecimalEnum.Num4));
            //                }
            //                if ((i == 2)) {
            //                        return ((int)(DecimalEnum.Num2));
            //                }
            //                if ((i == 1)) {
            //                        return ((int)(DecimalEnum.Num1));
            //                }
            //                if ((i == 0)) {
            //                        return ((int)(DecimalEnum.Num0));
            //                }
            //                    return (i + 10);
            //            }
    
            // generate 5 scenarios for OutputDecimalEnumVal
            for (int k = 0; k < 5; k++)
                AddScenario ("CheckOutputDecimalEnumVal" + k);

            CodeMemberMethod cmm = new CodeMemberMethod ();
            cmm.Name = "OutputDecimalEnumVal";
            cmm.Attributes = MemberAttributes.Public;
            CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (typeof (int), "i");
            cmm.Parameters.Add (param);
            CodeBinaryOperatorExpression eq       = new CodeBinaryOperatorExpression (
                new CodeArgumentReferenceExpression ("i"), CodeBinaryOperatorType.ValueEquality,
                new CodePrimitiveExpression (3));
            CodeMethodReturnStatement    truestmt = new CodeMethodReturnStatement (
                new CodeCastExpression (typeof (int),
                new CodeFieldReferenceExpression (new CodeTypeReferenceExpression ("DecimalEnum"), "Num3")));
            CodeConditionStatement       condstmt = new CodeConditionStatement (eq, truestmt);
            cmm.Statements.Add (condstmt);

            eq = new CodeBinaryOperatorExpression (new CodeArgumentReferenceExpression ("i"),
                CodeBinaryOperatorType.ValueEquality, new CodePrimitiveExpression (4));
            truestmt = new CodeMethodReturnStatement (new CodeCastExpression (typeof (int), new
                CodeFieldReferenceExpression (new CodeTypeReferenceExpression ("DecimalEnum"), "Num4")));
            condstmt = new CodeConditionStatement (eq, truestmt);
            cmm.Statements.Add (condstmt);
            eq = new CodeBinaryOperatorExpression (new CodeArgumentReferenceExpression ("i"),
                CodeBinaryOperatorType.ValueEquality, new CodePrimitiveExpression (2));
            truestmt = new CodeMethodReturnStatement (new CodeCastExpression (typeof (int), new
                CodeFieldReferenceExpression (new CodeTypeReferenceExpression ("DecimalEnum"), "Num2")));
            condstmt = new CodeConditionStatement (eq, truestmt);
            cmm.Statements.Add (condstmt);

            eq = new CodeBinaryOperatorExpression (new CodeArgumentReferenceExpression ("i"),
                CodeBinaryOperatorType.ValueEquality, new CodePrimitiveExpression (1));
            truestmt = new CodeMethodReturnStatement (new CodeCastExpression (typeof (int), new
                CodeFieldReferenceExpression (new CodeTypeReferenceExpression ("DecimalEnum"), "Num1")));
            condstmt = new CodeConditionStatement (eq, truestmt);
            cmm.Statements.Add (condstmt);

            eq = new CodeBinaryOperatorExpression (new CodeArgumentReferenceExpression ("i"),
                CodeBinaryOperatorType.ValueEquality, new CodePrimitiveExpression (0));
            truestmt = new CodeMethodReturnStatement (new CodeCastExpression (typeof (int), new
                CodeFieldReferenceExpression (new CodeTypeReferenceExpression ("DecimalEnum"), "Num0")));
            condstmt = new CodeConditionStatement (eq, truestmt);
            cmm.Statements.Add (condstmt);

            cmm.ReturnType = new CodeTypeReference ("System.Int32");

            cmm.Statements.Add (new CodeMethodReturnStatement (new CodeBinaryOperatorExpression (
                new CodeArgumentReferenceExpression ("i"), CodeBinaryOperatorType.Add, new CodePrimitiveExpression (10))));
            cd.Members.Add (cmm);


            // GENERATE (C#):
            //        public int OutputBinaryEnumVal(int i) {
            //            if ((i == 3)) {
            //                return ((int)(BinaryEnum.Bin3));
            //            }
            //            if ((i == 4)) {
            //                return ((int)(BinaryEnum.Bin4));
            //            }
            //            if ((i == 2)) {
            //                return ((int)(BinaryEnum.Bin2));
            //            }
            //            if ((i == 1)) {
            //                return ((int)(BinaryEnum.Bin1));
            //            }
            //            if ((i == 5)) {
            //                return ((int)(BinaryEnum.Bin5));
            //            }
            //            return (i + 10);
            //        }

            // generate 6 scenarios for OutputBinaryEnumVal
            for (int k = 1; k < 6; k++)
                AddScenario ("CheckOutputBinaryEnumVal" + k);
           AddScenario ("CheckOutputBinaryEnumValRet17", "Check for a return value of 17");

            cmm = new CodeMemberMethod ();
            cmm.Name = "OutputBinaryEnumVal";
            cmm.Attributes = MemberAttributes.Public;
            param = new CodeParameterDeclarationExpression (typeof (int), "i");
            cmm.Parameters.Add (param);
            eq = new CodeBinaryOperatorExpression (
                new CodeArgumentReferenceExpression ("i"), CodeBinaryOperatorType.ValueEquality,
                new CodePrimitiveExpression (3));
            truestmt = new CodeMethodReturnStatement (
                new CodeCastExpression (typeof (int),
                new CodeFieldReferenceExpression (new CodeTypeReferenceExpression ("BinaryEnum"), "Bin3")));
            condstmt = new CodeConditionStatement (eq, truestmt);
            cmm.Statements.Add (condstmt);

            eq = new CodeBinaryOperatorExpression (new CodeArgumentReferenceExpression ("i"),
                CodeBinaryOperatorType.ValueEquality, new CodePrimitiveExpression (4));
            truestmt = new CodeMethodReturnStatement (new CodeCastExpression (typeof (int), new
                CodeFieldReferenceExpression (new CodeTypeReferenceExpression ("BinaryEnum"), "Bin4")));
            condstmt = new CodeConditionStatement (eq, truestmt);
            cmm.Statements.Add (condstmt);
            eq = new CodeBinaryOperatorExpression (new CodeArgumentReferenceExpression ("i"),
                CodeBinaryOperatorType.ValueEquality, new CodePrimitiveExpression (2));
            truestmt = new CodeMethodReturnStatement (new CodeCastExpression (typeof (int), new
                CodeFieldReferenceExpression (new CodeTypeReferenceExpression ("BinaryEnum"), "Bin2")));
            condstmt = new CodeConditionStatement (eq, truestmt);
            cmm.Statements.Add (condstmt);

            eq = new CodeBinaryOperatorExpression (new CodeArgumentReferenceExpression ("i"),
                CodeBinaryOperatorType.ValueEquality, new CodePrimitiveExpression (1));
            truestmt = new CodeMethodReturnStatement (new CodeCastExpression (typeof (int), new
                CodeFieldReferenceExpression (new CodeTypeReferenceExpression ("BinaryEnum"), "Bin1")));
            condstmt = new CodeConditionStatement (eq, truestmt);
            cmm.Statements.Add (condstmt);

            eq = new CodeBinaryOperatorExpression (new CodeArgumentReferenceExpression ("i"),
                CodeBinaryOperatorType.ValueEquality, new CodePrimitiveExpression (5));
            truestmt = new CodeMethodReturnStatement (new CodeCastExpression (typeof (int), new
                CodeFieldReferenceExpression (new CodeTypeReferenceExpression ("BinaryEnum"), "Bin5")));
            condstmt = new CodeConditionStatement (eq, truestmt);
            cmm.Statements.Add (condstmt);

            cmm.ReturnType = new CodeTypeReference ("System.Int32");

            cmm.Statements.Add (new CodeMethodReturnStatement (new CodeBinaryOperatorExpression (
                new CodeArgumentReferenceExpression ("i"), CodeBinaryOperatorType.Add, new CodePrimitiveExpression (10))));
            cd.Members.Add (cmm);


#if WHIDBEY
            // GENERATE (C#):
            //        public long VerifyMyEnumExists(int num) {
            //            if ((num == Int32.MaxValue)) {
            //                return ((int)(MyEnum.Large));
            //            }
            //            return 0;
            //        }

            AddScenario ("CheckVerifyMyEnumExists");
            cmm = new CodeMemberMethod ();
            cmm.Name = "VerifyMyEnumExists";
            cmm.Attributes = MemberAttributes.Public;
            param = new CodeParameterDeclarationExpression (typeof (int), "num");
            cmm.Parameters.Add (param);
            cmm.ReturnType = new CodeTypeReference ("System.Int64");
            eq = new CodeBinaryOperatorExpression (
                new CodeArgumentReferenceExpression ("num"), CodeBinaryOperatorType.ValueEquality,
                new CodePrimitiveExpression (Int32.MaxValue));
            truestmt = new CodeMethodReturnStatement (new CodeCastExpression (typeof (long),
                        new CodeFieldReferenceExpression (new CodeTypeReferenceExpression ("MyEnum"),
                            "Large")));
            condstmt = new CodeConditionStatement (eq, truestmt);
            cmm.Statements.Add (condstmt);
            cmm.Statements.Add (new CodeMethodReturnStatement (new CodePrimitiveExpression (0)));
            cd.Members.Add (cmm);
#endif
        }
    }
        public void BinaryOperators()
        {
            CodeNamespace ns = new CodeNamespace("Namespace1");
            ns.Imports.Add(new CodeNamespaceImport("System"));

            CodeTypeDeclaration class1 = new CodeTypeDeclaration();
            class1.Name = "Class1";
            class1.BaseTypes.Add(new CodeTypeReference(typeof(object)));
            ns.Types.Add(class1);

            CodeMemberMethod retMethod = new CodeMemberMethod();
            retMethod.Name = "ReturnMethod";
            retMethod.Attributes = (retMethod.Attributes & ~MemberAttributes.AccessMask) | MemberAttributes.Public;
            retMethod.ReturnType = new CodeTypeReference(typeof(int));
            retMethod.Parameters.Add(new CodeParameterDeclarationExpression(typeof(int), "intInput"));

            CodeBinaryOperatorExpression cboExpression = new CodeBinaryOperatorExpression(
                new CodeBinaryOperatorExpression(
                new CodePrimitiveExpression(18),
                CodeBinaryOperatorType.Divide,
                new CodeBinaryOperatorExpression(
                new CodePrimitiveExpression(6),
                CodeBinaryOperatorType.Subtract,
                new CodePrimitiveExpression(4))),
                CodeBinaryOperatorType.Multiply,
                new CodeArgumentReferenceExpression("intInput"));

            CodeVariableDeclarationStatement variableDeclaration = null;
            variableDeclaration = new CodeVariableDeclarationStatement(typeof(int), "x1", cboExpression);

            retMethod.Statements.Add(variableDeclaration);
            retMethod.Statements.Add(
                new CodeVariableDeclarationStatement(
                typeof(int),
                "x2",
                new CodeBinaryOperatorExpression(
                new CodePrimitiveExpression(19),
                CodeBinaryOperatorType.Modulus,
                new CodePrimitiveExpression(8))));
            retMethod.Statements.Add(
                new CodeVariableDeclarationStatement(
                typeof(int),
                "x3",
                new CodeBinaryOperatorExpression(
                new CodeBinaryOperatorExpression(
                new CodePrimitiveExpression(15),
                CodeBinaryOperatorType.BitwiseAnd,
                new CodePrimitiveExpression(35)),
                CodeBinaryOperatorType.BitwiseOr,
                new CodePrimitiveExpression(129))));
            retMethod.Statements.Add(
                new CodeVariableDeclarationStatement(
                typeof(int),
                "x4",
                new CodePrimitiveExpression(0)));
            retMethod.Statements.Add(
                new CodeConditionStatement(
                new CodeBinaryOperatorExpression(
                new CodeBinaryOperatorExpression(
                new CodeVariableReferenceExpression("x2"),
                CodeBinaryOperatorType.ValueEquality,
                new CodePrimitiveExpression(3)),
                CodeBinaryOperatorType.BooleanOr,
                new CodeBinaryOperatorExpression(
                new CodeVariableReferenceExpression("x3"),
                CodeBinaryOperatorType.LessThan,
                new CodePrimitiveExpression(129))),
                new CodeStatement[] { CreateVariableIncrementExpression("x4", 1) },
                new CodeStatement[] { CreateVariableIncrementExpression("x4", 2) }));
            retMethod.Statements.Add(
                new CodeConditionStatement(
                new CodeBinaryOperatorExpression(
                new CodeBinaryOperatorExpression(
                new CodeVariableReferenceExpression("x2"),
                CodeBinaryOperatorType.GreaterThan,
                new CodePrimitiveExpression(-1)),
                CodeBinaryOperatorType.BooleanAnd,
                new CodeBinaryOperatorExpression(
                new CodeVariableReferenceExpression("x3"),
                CodeBinaryOperatorType.GreaterThanOrEqual,
                new CodePrimitiveExpression(5000))),
                new CodeStatement[] { CreateVariableIncrementExpression("x4", 4) },
                new CodeStatement[] { CreateVariableIncrementExpression("x4", 8) }));
            retMethod.Statements.Add(
                new CodeConditionStatement(
                new CodeBinaryOperatorExpression(
                new CodeBinaryOperatorExpression(
                new CodeVariableReferenceExpression("x2"),
                CodeBinaryOperatorType.LessThanOrEqual,
                new CodePrimitiveExpression(3)),
                CodeBinaryOperatorType.BooleanAnd,
                new CodeBinaryOperatorExpression(
                new CodeVariableReferenceExpression("x3"),
                CodeBinaryOperatorType.IdentityInequality,
                new CodePrimitiveExpression(1))),
                new CodeStatement[] { CreateVariableIncrementExpression("x4", 16) },
                new CodeStatement[] { CreateVariableIncrementExpression("x4", 32) }));
            retMethod.Statements.Add(
                new CodeMethodReturnStatement(
                new CodeBinaryOperatorExpression(
                new CodeVariableReferenceExpression("x1"),
                CodeBinaryOperatorType.Add,
                new CodeBinaryOperatorExpression(
                new CodeVariableReferenceExpression("x2"),
                CodeBinaryOperatorType.Add,
                new CodeBinaryOperatorExpression(
                new CodeVariableReferenceExpression("x3"),
                CodeBinaryOperatorType.Add,
                new CodeVariableReferenceExpression("x4"))))));
            class1.Members.Add(retMethod);

            retMethod = new CodeMemberMethod();
            retMethod.Name = "SecondReturnMethod";
            retMethod.Attributes = (retMethod.Attributes & ~MemberAttributes.AccessMask) | MemberAttributes.Public;
            retMethod.ReturnType = new CodeTypeReference(typeof(int));
            retMethod.Parameters.Add(new CodeParameterDeclarationExpression(typeof(int), "intInput"));

            retMethod.Statements.Add(new CodeCommentStatement("To test CodeBinaryOperatorType.IdentiEquality operator"));
            retMethod.Statements.Add(
                new CodeConditionStatement(
                new CodeBinaryOperatorExpression(new CodeCastExpression("Object",
                new CodeVariableReferenceExpression("intInput")),
                CodeBinaryOperatorType.IdentityEquality, new CodeCastExpression("Object",
                new CodePrimitiveExpression(5))),
                new CodeStatement[] { new CodeMethodReturnStatement(new
                CodePrimitiveExpression(5)) }, new CodeStatement[] { new
                CodeMethodReturnStatement(new CodePrimitiveExpression(4))}));
            class1.Members.Add(retMethod);

            AssertEqual(ns,
                @"Imports System

                  Namespace Namespace1

                      Public Class Class1
                          Inherits Object

                          Public Function ReturnMethod(ByVal intInput As Integer) As Integer
                              Dim x1 As Integer = ((18  _
                                          / (6 - 4))  _
                                          * intInput)
                              Dim x2 As Integer = (19 Mod 8)
                              Dim x3 As Integer = ((15 And 35)  _
                                          Or 129)
                              Dim x4 As Integer = 0
                              If ((x2 = 3)  _
                                          OrElse (x3 < 129)) Then
                                  x4 = (x4 + 1)
                              Else
                                  x4 = (x4 + 2)
                              End If
                              If ((x2 > -1)  _
                                          AndAlso (x3 >= 5000)) Then
                                  x4 = (x4 + 4)
                              Else
                                  x4 = (x4 + 8)
                              End If
                              If ((x2 <= 3)  _
                                          AndAlso (x3 <> 1)) Then
                                  x4 = (x4 + 16)
                              Else
                                  x4 = (x4 + 32)
                              End If
                              Return (x1  _
                                          + (x2  _
                                          + (x3 + x4)))
                          End Function

                          Public Function SecondReturnMethod(ByVal intInput As Integer) As Integer
                              'To test CodeBinaryOperatorType.IdentiEquality operator
                              If (CType(intInput,[Object]) Is CType(5,[Object])) Then
                                  Return 5
                              Else
                                  Return 4
                              End If
                          End Function
                      End Class
                  End Namespace");
        }
    public override void BuildTree (CodeDomProvider provider, CodeCompileUnit cu) {

        // GENERATES (C#):
        //  namespace Namespace1 {
        //      using System;
        //      
        //      
        //      public class Class1 : object {
        //          
        //          public int ReturnMethod(int intInput) {

        CodeNamespace ns = new CodeNamespace ("Namespace1");
        ns.Imports.Add (new CodeNamespaceImport ("System"));
        cu.Namespaces.Add (ns);

        CodeTypeDeclaration class1 = new CodeTypeDeclaration ();
        class1.Name = "Class1";
        class1.BaseTypes.Add (new CodeTypeReference (typeof (object)));
        ns.Types.Add (class1);

        AddScenario ("CheckReturnMethod", "Tests varying operators.");
        CodeMemberMethod retMethod = new CodeMemberMethod ();
        retMethod.Name = "ReturnMethod";
        retMethod.Attributes = (retMethod.Attributes & ~MemberAttributes.AccessMask) | MemberAttributes.Public;
        retMethod.ReturnType = new CodeTypeReference (typeof (int));
        retMethod.Parameters.Add (new CodeParameterDeclarationExpression (typeof (int), "intInput"));

        // GENERATES (C#):
        //              int x1 = ((18 
        //                          / (6 - 4)) 
        //                          * intInput);
        //
        // in VB (a = a/a) generates an warning if a is integer. Cast the expression just for VB language. 
        CodeBinaryOperatorExpression cboExpression = new CodeBinaryOperatorExpression (
            new CodeBinaryOperatorExpression (
            new CodePrimitiveExpression (18),
            CodeBinaryOperatorType.Divide,
            new CodeBinaryOperatorExpression (
            new CodePrimitiveExpression (6),
            CodeBinaryOperatorType.Subtract,
            new CodePrimitiveExpression (4))),
            CodeBinaryOperatorType.Multiply,
            new CodeArgumentReferenceExpression ("intInput"));

        CodeVariableDeclarationStatement variableDeclaration = null;
        if (provider is Microsoft.VisualBasic.VBCodeProvider)
            variableDeclaration = new CodeVariableDeclarationStatement (typeof (int), "x1", new CodeCastExpression (typeof (int), cboExpression));
        else
            variableDeclaration = new CodeVariableDeclarationStatement (typeof (int), "x1", cboExpression);

        retMethod.Statements.Add (variableDeclaration);

        // GENERATES (C#):
        //              int x2 = (19 % 8);
        retMethod.Statements.Add (
            new CodeVariableDeclarationStatement (
            typeof (int),
            "x2",
            new CodeBinaryOperatorExpression (
            new CodePrimitiveExpression (19),
            CodeBinaryOperatorType.Modulus,
            new CodePrimitiveExpression (8))));

        // GENERATES (C#):
        //              int x3 = ((15 & 35) 
        //                          | 129);
        retMethod.Statements.Add (
            new CodeVariableDeclarationStatement (
            typeof (int),
            "x3",
            new CodeBinaryOperatorExpression (
            new CodeBinaryOperatorExpression (
            new CodePrimitiveExpression (15),
            CodeBinaryOperatorType.BitwiseAnd,
            new CodePrimitiveExpression (35)),
            CodeBinaryOperatorType.BitwiseOr,
            new CodePrimitiveExpression (129))));

        // GENERATES (C#):
        //              int x4 = 0;
        retMethod.Statements.Add (
            new CodeVariableDeclarationStatement (
            typeof (int),
            "x4",
            new CodePrimitiveExpression (0)));

        // GENERATES (C#):
        //              if (((x2 == 3) 
        //                          || (x3 < 129))) {
        //                  x4 = (x4 + 1);
        //              }
        //              else {
        //                  x4 = (x4 + 2);
        //              }

        retMethod.Statements.Add (
            new CodeConditionStatement (
            new CodeBinaryOperatorExpression (
            new CodeBinaryOperatorExpression (
            new CodeVariableReferenceExpression ("x2"),
            CodeBinaryOperatorType.ValueEquality,
            new CodePrimitiveExpression (3)),
            CodeBinaryOperatorType.BooleanOr,
            new CodeBinaryOperatorExpression (
            new CodeVariableReferenceExpression ("x3"),
            CodeBinaryOperatorType.LessThan,
            new CodePrimitiveExpression (129))),
            CDHelper.CreateIncrementByStatement ("x4", 1),
            CDHelper.CreateIncrementByStatement ("x4", 2)));

        // GENERATES (C#):
        //              if (((x2 > -1) 
        //                          && (x3 >= 5000))) {
        //                  x4 = (x4 + 4);
        //              }
        //              else {
        //                  x4 = (x4 + 8);
        //              }
        retMethod.Statements.Add (
            new CodeConditionStatement (
            new CodeBinaryOperatorExpression (
            new CodeBinaryOperatorExpression (
            new CodeVariableReferenceExpression ("x2"),
            CodeBinaryOperatorType.GreaterThan,
            new CodePrimitiveExpression (-1)),
            CodeBinaryOperatorType.BooleanAnd,
            new CodeBinaryOperatorExpression (
            new CodeVariableReferenceExpression ("x3"),
            CodeBinaryOperatorType.GreaterThanOrEqual,
            new CodePrimitiveExpression (5000))),
            CDHelper.CreateIncrementByStatement ("x4", 4),
            CDHelper.CreateIncrementByStatement ("x4", 8)));

        // GENERATES (C#):
        //              if (((x2 <= 3) 
        //                          && (x3 != 1))) {
        //                  x4 = (x4 + 16);
        //              }
        //              else {
        //                  x4 = (x4 + 32);
        //              }
        retMethod.Statements.Add (
            new CodeConditionStatement (
            new CodeBinaryOperatorExpression (
            new CodeBinaryOperatorExpression (
            new CodeVariableReferenceExpression ("x2"),
            CodeBinaryOperatorType.LessThanOrEqual,
            new CodePrimitiveExpression (3)),
            CodeBinaryOperatorType.BooleanAnd,
            new CodeBinaryOperatorExpression (
            new CodeVariableReferenceExpression ("x3"),
            CodeBinaryOperatorType.IdentityInequality,
            new CodePrimitiveExpression (1))),
            CDHelper.CreateIncrementByStatement ("x4", 16),
            CDHelper.CreateIncrementByStatement ("x4", 32)));


        // GENERATES (C#):
        //              return (x1 
        //                          + (x2 
        //                          + (x3 + x4)));
        //          }
        retMethod.Statements.Add (
            new CodeMethodReturnStatement (
            new CodeBinaryOperatorExpression (
            new CodeVariableReferenceExpression ("x1"),
            CodeBinaryOperatorType.Add,
            new CodeBinaryOperatorExpression (
            new CodeVariableReferenceExpression ("x2"),
            CodeBinaryOperatorType.Add,
            new CodeBinaryOperatorExpression (
            new CodeVariableReferenceExpression ("x3"),
            CodeBinaryOperatorType.Add,
            new CodeVariableReferenceExpression ("x4"))))));
        class1.Members.Add (retMethod);

        //          
        // GENERATES (C#):
        //          public int SecondReturnMethod(int intInput) {
        //              // To test CodeBinaryOperatorType.IdentityEquality operator
        //              if ((((Object)(intInput)) == ((Object)(5)))) {
        //                  return 5;
        //              }
        //              else {
        //                  return 4;
        //              }
        //          }
        //      }
        AddScenario ("CheckSecondReturnMethod", "Tests identity equality.");
        retMethod = new CodeMemberMethod ();
        retMethod.Name = "SecondReturnMethod";
        retMethod.Attributes = (retMethod.Attributes & ~MemberAttributes.AccessMask) | MemberAttributes.Public;
        retMethod.ReturnType = new CodeTypeReference (typeof (int));
        retMethod.Parameters.Add (new CodeParameterDeclarationExpression (typeof (int), "intInput"));

        retMethod.Statements.Add (new CodeCommentStatement ("To test CodeBinaryOperatorType.IdentiEquality operator"));
        retMethod.Statements.Add (
            new CodeConditionStatement (
            new CodeBinaryOperatorExpression (new CodeCastExpression ("Object",
            new CodeArgumentReferenceExpression ("intInput")),
            CodeBinaryOperatorType.IdentityEquality, new CodeCastExpression ("Object",
            new CodePrimitiveExpression (5))),
            new CodeStatement[] {new CodeMethodReturnStatement (new
                CodePrimitiveExpression (5))}, new CodeStatement[] {new
                CodeMethodReturnStatement (new CodePrimitiveExpression (4))}));
        class1.Members.Add (retMethod);

        // GENERATES (C#):
        //      public class Class2 : object {
        //      }
        //  }

        /*class1 = new CodeTypeDeclaration ();
        class1.Name = "Class2";
        class1.BaseTypes.Add (new CodeTypeReference (typeof (object)));
        ns.Types.Add (class1);*/
    }
        public void GCode_CodeDom_GenerateCode(CodeTypeDeclaration codeClass, CodeStatementCollection codeStatementCollection, CodeExpression expression, string strValueName)
        {
            GetGradientDatas();
            if (GradientDatas.Count > 1)
            {
                for (int i = 1; i < GradientDatas.Count; i++)
                {
                    var value   = expression;
                    var offset1 = GradientDatas[i - 1].Offset;
                    var color1  = GradientDatas[i - 1].GradientColor;
                    var offset2 = GradientDatas[i].Offset;
                    var color2  = GradientDatas[i].GradientColor;

                    CodeObjectCreateExpression color1obj = new CodeObjectCreateExpression("EngineNS.Color4", new CodeExpression[] { });
                    color1obj.Parameters.Add(new CodePrimitiveExpression(color1.Alpha));
                    color1obj.Parameters.Add(new CodePrimitiveExpression(color1.Red));
                    color1obj.Parameters.Add(new CodePrimitiveExpression(color1.Green));
                    color1obj.Parameters.Add(new CodePrimitiveExpression(color1.Blue));

                    CodeObjectCreateExpression color2obj = new CodeObjectCreateExpression("EngineNS.Color4", new CodeExpression[] { });
                    color2obj.Parameters.Add(new CodePrimitiveExpression(color2.Alpha));
                    color2obj.Parameters.Add(new CodePrimitiveExpression(color2.Red));
                    color2obj.Parameters.Add(new CodePrimitiveExpression(color2.Green));
                    color2obj.Parameters.Add(new CodePrimitiveExpression(color2.Blue));

                    //"t = (value - offset1) / (offset2 - offset1) "
                    CodeBinaryOperatorExpression v1 = new CodeBinaryOperatorExpression(
                        value,
                        CodeBinaryOperatorType.Subtract,
                        new CodePrimitiveExpression(offset2));

                    CodeBinaryOperatorExpression v2 = new CodeBinaryOperatorExpression(
                        new CodePrimitiveExpression(offset1),
                        CodeBinaryOperatorType.Subtract,
                        new CodePrimitiveExpression(offset2));

                    CodeBinaryOperatorExpression v3 = new CodeBinaryOperatorExpression(
                        v1,
                        CodeBinaryOperatorType.Divide,
                        v2);

                    var typeref = new System.CodeDom.CodeTypeReferenceExpression("EngineNS.Color4");
                    //Lerp( Color4 color1, Color4 color2, float amount )
                    var methodInvoke = new CodeGenerateSystem.CodeDom.CodeMethodInvokeExpression(
                        // targetObject that contains the method to invoke.
                        typeref,
                        // methodName indicates the method to invoke.
                        "Lerp",
                        // parameters array contains the parameters for the method.
                        new CodeExpression[] { color2obj, color1obj, v3 });

                    CodeAssignStatement result = new CodeAssignStatement(new CodeVariableReferenceExpression(strValueName), methodInvoke);
                    //  CodeBinaryOperatorExpression result = new CodeBinaryOperatorExpression(
                    //new CodeVariableReferenceExpression(strValueName),
                    // CodeBinaryOperatorType.Assign,
                    // methodInvoke);

                    var greaterthan = new CodeBinaryOperatorExpression(
                        value,
                        CodeBinaryOperatorType.GreaterThan,
                        new CodePrimitiveExpression(offset2));

                    var lessthan = new CodeBinaryOperatorExpression(
                        value,
                        CodeBinaryOperatorType.LessThan,
                        new CodePrimitiveExpression(offset1));

                    if (i == GradientDatas.Count - 1)
                    {
                        var first = new CodeBinaryOperatorExpression(
                            value,
                            CodeBinaryOperatorType.LessThanOrEqual,
                            new CodePrimitiveExpression(offset2));

                        codeStatementCollection.Add(new CodeConditionStatement(
                                                        first,
                                                        new CodeAssignStatement(new CodeVariableReferenceExpression(strValueName), color2obj)));
                    }

                    if (i == 1)
                    {
                        var last = new CodeBinaryOperatorExpression(
                            value,
                            CodeBinaryOperatorType.GreaterThanOrEqual,
                            new CodePrimitiveExpression(offset1));

                        codeStatementCollection.Add(new CodeConditionStatement(
                                                        last,
                                                        new CodeAssignStatement(new CodeVariableReferenceExpression(strValueName), color1obj)));
                    }
                    codeStatementCollection.Add(new CodeConditionStatement(
                                                    new CodeBinaryOperatorExpression(greaterthan, CodeBinaryOperatorType.BooleanAnd, lessthan),
                                                    result));
                }
            }
            else if (GradientDatas.Count == 1)
            {
                var color1 = GradientDatas[0].GradientColor;

                CodeObjectCreateExpression color1obj = new CodeObjectCreateExpression("EngineNS.Color4", new CodeExpression[] { });
                color1obj.Parameters.Add(new CodePrimitiveExpression(color1.Alpha));
                color1obj.Parameters.Add(new CodePrimitiveExpression(color1.Red));
                color1obj.Parameters.Add(new CodePrimitiveExpression(color1.Green));
                color1obj.Parameters.Add(new CodePrimitiveExpression(color1.Blue));

                codeStatementCollection.Add(new CodeAssignStatement(new CodeVariableReferenceExpression(strValueName), color1obj));
            }
        }
    public override void BuildTree (CodeDomProvider provider, CodeCompileUnit cu)
    {

        CodeNamespace nspace = new CodeNamespace ("NSPC");
        nspace.Imports.Add (new CodeNamespaceImport ("System"));
        nspace.Imports.Add (new CodeNamespaceImport ("System.Drawing"));
        nspace.Imports.Add (new CodeNamespaceImport ("System.Windows.Forms"));
        nspace.Imports.Add (new CodeNamespaceImport ("System.ComponentModel"));
        cu.Namespaces.Add (nspace);

        cu.ReferencedAssemblies.Add ("System.Drawing.dll");
        cu.ReferencedAssemblies.Add ("System.Windows.Forms.dll");
        cu.ReferencedAssemblies.Add ("System.Xml.dll");

        CodeTypeDeclaration cd = new CodeTypeDeclaration ("TEST");
        cd.IsClass = true;
        nspace.Types.Add (cd);

        CodeMemberMethod cmm;

        // Arrays of Arrays
#if !WHIDBEY
        // Everett VB code provider doesn't support array of array initialization
        if (!(provider is Microsoft.VisualBasic.VBCodeProvider)) {
#endif
            if (Supports (provider, GeneratorSupport.ArraysOfArrays)) {
                AddScenario ("CheckArrayOfArrays");
                cmm = new CodeMemberMethod ();
                cmm.Name = "ArraysOfArrays";
                cmm.ReturnType = new CodeTypeReference (typeof (int));
                cmm.Attributes = MemberAttributes.Final | MemberAttributes.Public;
                cmm.Statements.Add (new CodeVariableDeclarationStatement (new CodeTypeReference (typeof (int[][])),
                    "arrayOfArrays", new CodeArrayCreateExpression (typeof (int[][]),
                    new CodeArrayCreateExpression (typeof (int[]), new CodePrimitiveExpression (3), new CodePrimitiveExpression (4)),
                    new CodeArrayCreateExpression (typeof (int[]), new CodeExpression[] {new CodePrimitiveExpression (1)}))));
                cmm.Statements.Add (new CodeMethodReturnStatement (new CodeArrayIndexerExpression (
                    new CodeArrayIndexerExpression (new CodeVariableReferenceExpression ("arrayOfArrays"), new CodePrimitiveExpression (0)),
                    new CodePrimitiveExpression (1))));
                cd.Members.Add (cmm);
            }
#if !WHIDBEY
        }
#endif

        // assembly attributes
        if (Supports (provider, GeneratorSupport.AssemblyAttributes)) {
            AddScenario ("CheckAssemblyAttributes");
            CodeAttributeDeclarationCollection attrs = cu.AssemblyCustomAttributes;
            attrs.Add (new CodeAttributeDeclaration ("System.Reflection.AssemblyTitle", new
                CodeAttributeArgument (new CodePrimitiveExpression ("MyAssembly"))));
            attrs.Add (new CodeAttributeDeclaration ("System.Reflection.AssemblyVersion", new
                CodeAttributeArgument (new CodePrimitiveExpression ("1.0.6.2"))));
        }

        CodeTypeDeclaration class1 = new CodeTypeDeclaration ();
        if (Supports (provider, GeneratorSupport.ChainedConstructorArguments)) {
            AddScenario ("CheckChainedConstructorArgs");
            class1.Name = "Test2";
            class1.IsClass = true;
            nspace.Types.Add (class1);

            class1.Members.Add (new CodeMemberField (new CodeTypeReference (typeof (String)), "stringField"));
            CodeMemberProperty prop = new CodeMemberProperty ();
            prop.Name = "accessStringField";
            prop.Attributes = MemberAttributes.Public | MemberAttributes.Final;
            prop.Type = new CodeTypeReference (typeof (String));
            prop.GetStatements.Add (new CodeMethodReturnStatement (new CodeFieldReferenceExpression (new CodeThisReferenceExpression (),
                "stringField")));
            prop.SetStatements.Add (new CodeAssignStatement (new CodeFieldReferenceExpression (new
                CodeThisReferenceExpression (), "stringField"),
                new CodePropertySetValueReferenceExpression ()));
            class1.Members.Add (prop);

            CodeConstructor cctor = new CodeConstructor ();
            cctor.Attributes = MemberAttributes.Public;
            cctor.ChainedConstructorArgs.Add (new CodePrimitiveExpression ("testingString"));
            cctor.ChainedConstructorArgs.Add (new CodePrimitiveExpression (null));
            cctor.ChainedConstructorArgs.Add (new CodePrimitiveExpression (null));
            class1.Members.Add (cctor);

            CodeConstructor cc = new CodeConstructor ();
            cc.Attributes = MemberAttributes.Public | MemberAttributes.Overloaded;
            cc.Parameters.Add (new CodeParameterDeclarationExpression (typeof (string), "p1"));
            cc.Parameters.Add (new CodeParameterDeclarationExpression (typeof (string), "p2"));
            cc.Parameters.Add (new CodeParameterDeclarationExpression (typeof (string), "p3"));
            cc.Statements.Add (new CodeAssignStatement (new CodeFieldReferenceExpression (new CodeThisReferenceExpression ()
                , "stringField"), new CodeArgumentReferenceExpression ("p1")));
            class1.Members.Add (cc);

            // verify chained constructors work
            cmm = new CodeMemberMethod ();
            cmm.Name = "ChainedConstructorUse";
            cmm.Attributes = MemberAttributes.Public | MemberAttributes.Static;
            cmm.ReturnType = new CodeTypeReference (typeof (String));
            // utilize constructor
            cmm.Statements.Add (new CodeVariableDeclarationStatement ("Test2", "t", new CodeObjectCreateExpression ("Test2")));
            cmm.Statements.Add (new CodeMethodReturnStatement (new CodePropertyReferenceExpression (
                new CodeVariableReferenceExpression ("t"), "accessStringField")));
            cd.Members.Add (cmm);
        }

        // complex expressions
        if (Supports (provider, GeneratorSupport.ComplexExpressions)) {
            AddScenario ("CheckComplexExpressions");
            cmm = new CodeMemberMethod ();
            cmm.Name = "ComplexExpressions";
            cmm.ReturnType = new CodeTypeReference (typeof (int));
            cmm.Attributes = MemberAttributes.Final | MemberAttributes.Public;
            cmm.Parameters.Add (new CodeParameterDeclarationExpression (new CodeTypeReference (typeof (int)), "i"));
            cmm.Statements.Add (new CodeAssignStatement (new CodeArgumentReferenceExpression ("i"),
                new CodeBinaryOperatorExpression (new CodeArgumentReferenceExpression ("i"), CodeBinaryOperatorType.Multiply,
                new CodeBinaryOperatorExpression (new CodeArgumentReferenceExpression ("i"), CodeBinaryOperatorType.Add,
                new CodePrimitiveExpression (3)))));
            cmm.Statements.Add (new CodeMethodReturnStatement (new CodeArgumentReferenceExpression ("i")));
            cd.Members.Add (cmm);
        }

        if (Supports (provider, GeneratorSupport.DeclareEnums)) {
            AddScenario ("CheckDeclareEnums");
            CodeTypeDeclaration ce = new CodeTypeDeclaration ("DecimalEnum");
            ce.IsEnum = true;
            nspace.Types.Add (ce);

            // things to enumerate
            for (int k = 0; k < 5; k++)
            {
                CodeMemberField Field = new CodeMemberField ("System.Int32", "Num" + (k).ToString ());
                Field.InitExpression = new CodePrimitiveExpression (k);
                ce.Members.Add (Field);
            }
            cmm = new CodeMemberMethod ();
            cmm.Name = "OutputDecimalEnumVal";
            cmm.Attributes = MemberAttributes.Public | MemberAttributes.Static;
            CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (typeof (int), "i");
            cmm.Parameters.Add (param);
            CodeBinaryOperatorExpression eq       = new CodeBinaryOperatorExpression (
                new CodeArgumentReferenceExpression ("i"), CodeBinaryOperatorType.ValueEquality,
                new CodePrimitiveExpression (3));
            CodeMethodReturnStatement    truestmt = new CodeMethodReturnStatement (
                new CodeCastExpression (typeof (int),
                new CodeFieldReferenceExpression (new CodeTypeReferenceExpression ("DecimalEnum"), "Num3")));
            CodeConditionStatement       condstmt = new CodeConditionStatement (eq, truestmt);
            cmm.Statements.Add (condstmt);

            eq = new CodeBinaryOperatorExpression (new CodeArgumentReferenceExpression ("i"),
                CodeBinaryOperatorType.ValueEquality, new CodePrimitiveExpression (4));
            truestmt = new CodeMethodReturnStatement (new CodeCastExpression (typeof (int), new
                CodeFieldReferenceExpression (new CodeTypeReferenceExpression ("DecimalEnum"), "Num4")));
            condstmt = new CodeConditionStatement (eq, truestmt);
            cmm.Statements.Add (condstmt);
            eq = new CodeBinaryOperatorExpression (new CodeArgumentReferenceExpression ("i"),
                CodeBinaryOperatorType.ValueEquality, new CodePrimitiveExpression (2));
            truestmt = new CodeMethodReturnStatement (new CodeCastExpression (typeof (int), new
                CodeFieldReferenceExpression (new CodeTypeReferenceExpression ("DecimalEnum"), "Num2")));
            condstmt = new CodeConditionStatement (eq, truestmt);
            cmm.Statements.Add (condstmt);

            eq = new CodeBinaryOperatorExpression (new CodeArgumentReferenceExpression ("i"),
                CodeBinaryOperatorType.ValueEquality, new CodePrimitiveExpression (1));
            truestmt = new CodeMethodReturnStatement (new CodeCastExpression (typeof (int), new
                CodeFieldReferenceExpression (new CodeTypeReferenceExpression ("DecimalEnum"), "Num1")));
            condstmt = new CodeConditionStatement (eq, truestmt);
            cmm.Statements.Add (condstmt);

            eq = new CodeBinaryOperatorExpression (new CodeArgumentReferenceExpression ("i"),
                CodeBinaryOperatorType.ValueEquality, new CodePrimitiveExpression (0));
            truestmt = new CodeMethodReturnStatement (new CodeCastExpression (typeof (int), new
                CodeFieldReferenceExpression (new CodeTypeReferenceExpression ("DecimalEnum"), "Num0")));
            condstmt = new CodeConditionStatement (eq, truestmt);
            cmm.Statements.Add (condstmt);

            cmm.ReturnType = new CodeTypeReference ("System.Int32");

            cmm.Statements.Add (new CodeMethodReturnStatement (new CodeBinaryOperatorExpression (
                new CodeArgumentReferenceExpression ("i"), CodeBinaryOperatorType.Add, new CodePrimitiveExpression (10))));
            cd.Members.Add (cmm);
        }

        if (Supports (provider, GeneratorSupport.DeclareInterfaces)) {
            AddScenario ("CheckDeclareInterfaces");
            cmm = new CodeMemberMethod ();
            cmm.Name = "TestSingleInterface";
            cmm.ReturnType = new CodeTypeReference (typeof (int));
            cmm.Parameters.Add (new CodeParameterDeclarationExpression (typeof (int), "i"));
            cmm.Attributes = MemberAttributes.Public | MemberAttributes.Static;
            cmm.Statements.Add (new CodeVariableDeclarationStatement ("TestSingleInterfaceImp", "t", new CodeObjectCreateExpression ("TestSingleInterfaceImp")));
            CodeMethodInvokeExpression methodinvoke = new CodeMethodInvokeExpression (new CodeVariableReferenceExpression ("t")
                , "InterfaceMethod");
            methodinvoke.Parameters.Add (new CodeArgumentReferenceExpression ("i"));
            cmm.Statements.Add (new CodeMethodReturnStatement (methodinvoke));
            cd.Members.Add (cmm);

            class1 = new CodeTypeDeclaration ("InterfaceA");
            class1.IsInterface = true;
            nspace.Types.Add (class1);
            cmm = new CodeMemberMethod ();
            cmm.Attributes = MemberAttributes.Public;
            cmm.Name = "InterfaceMethod";
            cmm.ReturnType = new CodeTypeReference (typeof (int));
            cmm.Parameters.Add (new CodeParameterDeclarationExpression (typeof (int), "a"));
            class1.Members.Add (cmm);

            if (Supports (provider, GeneratorSupport.MultipleInterfaceMembers)) {
                AddScenario ("CheckMultipleInterfaceMembers");
                CodeTypeDeclaration classDecl = new CodeTypeDeclaration ("InterfaceB");
                classDecl.IsInterface = true;
                nspace.Types.Add (classDecl);
                cmm = new CodeMemberMethod ();
                cmm.Name = "InterfaceMethod";
                cmm.Attributes = MemberAttributes.Public;
                cmm.ReturnType = new CodeTypeReference (typeof (int));
                cmm.Parameters.Add (new CodeParameterDeclarationExpression (typeof (int), "a"));
                classDecl.Members.Add (cmm);

                CodeTypeDeclaration class2 = new CodeTypeDeclaration ("TestMultipleInterfaceImp");
                class2.BaseTypes.Add (new CodeTypeReference ("System.Object"));
                class2.BaseTypes.Add (new CodeTypeReference ("InterfaceB"));
                class2.BaseTypes.Add (new CodeTypeReference ("InterfaceA"));
                class2.IsClass = true;
                nspace.Types.Add (class2);
                cmm = new CodeMemberMethod ();
                cmm.ImplementationTypes.Add (new CodeTypeReference ("InterfaceA"));
                cmm.ImplementationTypes.Add (new CodeTypeReference ("InterfaceB"));
                cmm.Name = "InterfaceMethod";
                cmm.ReturnType = new CodeTypeReference (typeof (int));
                cmm.Parameters.Add (new CodeParameterDeclarationExpression (typeof (int), "a"));
                cmm.Attributes = MemberAttributes.Public | MemberAttributes.Final;
                cmm.Statements.Add (new CodeMethodReturnStatement (new CodeArgumentReferenceExpression ("a")));
                class2.Members.Add (cmm);

                cmm = new CodeMemberMethod ();
                cmm.Name = "TestMultipleInterfaces";
                cmm.ReturnType = new CodeTypeReference (typeof (int));
                cmm.Parameters.Add (new CodeParameterDeclarationExpression (typeof (int), "i"));
                cmm.Attributes = MemberAttributes.Public | MemberAttributes.Static;
                cmm.Statements.Add (new CodeVariableDeclarationStatement ("TestMultipleInterfaceImp", "t", new CodeObjectCreateExpression ("TestMultipleInterfaceImp")));
                cmm.Statements.Add (new CodeVariableDeclarationStatement ("InterfaceA", "interfaceAobject", new CodeCastExpression ("InterfaceA",
                    new CodeVariableReferenceExpression ("t"))));
                cmm.Statements.Add (new CodeVariableDeclarationStatement ("InterfaceB", "interfaceBobject", new CodeCastExpression ("InterfaceB",
                    new CodeVariableReferenceExpression ("t"))));
                methodinvoke = new CodeMethodInvokeExpression (new CodeVariableReferenceExpression ("interfaceAobject")
                    , "InterfaceMethod");
                methodinvoke.Parameters.Add (new CodeArgumentReferenceExpression ("i"));
                CodeMethodInvokeExpression methodinvoke2 = new CodeMethodInvokeExpression (new CodeVariableReferenceExpression ("interfaceBobject")
                    , "InterfaceMethod");
                methodinvoke2.Parameters.Add (new CodeArgumentReferenceExpression ("i"));
                cmm.Statements.Add (new CodeMethodReturnStatement (new CodeBinaryOperatorExpression (
                    methodinvoke,
                    CodeBinaryOperatorType.Subtract, methodinvoke2)));
                cd.Members.Add (cmm);
            }

            class1 = new CodeTypeDeclaration ("TestSingleInterfaceImp");
            class1.BaseTypes.Add (new CodeTypeReference ("System.Object"));
            class1.BaseTypes.Add (new CodeTypeReference ("InterfaceA"));
            class1.IsClass = true;
            nspace.Types.Add (class1);
            cmm = new CodeMemberMethod ();
            cmm.ImplementationTypes.Add (new CodeTypeReference ("InterfaceA"));
            cmm.Name = "InterfaceMethod";
            cmm.ReturnType = new CodeTypeReference (typeof (int));
            cmm.Parameters.Add (new CodeParameterDeclarationExpression (typeof (int), "a"));
            cmm.Attributes = MemberAttributes.Public;
            cmm.Statements.Add (new CodeMethodReturnStatement (new CodeArgumentReferenceExpression ("a")));
            class1.Members.Add (cmm);
        }

        /*if (Supports (provider, GeneratorSupport.DeclareValueTypes)) {
            AddScenario ("CheckDeclareValueTypes");

            // create first struct to test nested structs
            //     GENERATE (C#):
            //	public struct structA {
            //		public structB innerStruct;
            //		public struct structB {
            //    		public int int1;
            //		}
            //	}
            CodeTypeDeclaration structA = new CodeTypeDeclaration ("structA");
            structA.IsStruct = true;

            CodeTypeDeclaration structB = new CodeTypeDeclaration ("structB");
            structB.TypeAttributes = TypeAttributes.NestedPublic;
            structB.Attributes = MemberAttributes.Public;
            structB.IsStruct = true;

            CodeMemberField firstInt = new CodeMemberField (typeof (int), "int1");
            firstInt.Attributes = MemberAttributes.Public;
            structB.Members.Add (firstInt);

            CodeMemberField innerStruct = new CodeMemberField ("structB", "innerStruct");
            innerStruct.Attributes = MemberAttributes.Public;

            structA.Members.Add (structB);
            structA.Members.Add (innerStruct);
            nspace.Types.Add (structA);

            CodeMemberMethod nestedStructMethod = new CodeMemberMethod ();
            nestedStructMethod.Name = "NestedStructMethod";
            nestedStructMethod.ReturnType = new CodeTypeReference (typeof (int));
            nestedStructMethod.Attributes = MemberAttributes.Public | MemberAttributes.Static;
            CodeVariableDeclarationStatement varStructA = new CodeVariableDeclarationStatement ("structA", "varStructA");
            nestedStructMethod.Statements.Add (varStructA);
            nestedStructMethod.Statements.Add
                (
                new CodeAssignStatement
                (
									new CodeFieldReferenceExpression (new CodeFieldReferenceExpression (new CodeVariableReferenceExpression ("varStructA"), "innerStruct"), "int1"),
									new CodePrimitiveExpression (3)
                )
                );
            nestedStructMethod.Statements.Add (new CodeMethodReturnStatement (new CodeFieldReferenceExpression (new CodeFieldReferenceExpression (new CodeVariableReferenceExpression ("varStructA"), "innerStruct"), "int1")));
            cd.Members.Add (nestedStructMethod);
        }*/
        if (Supports (provider, GeneratorSupport.EntryPointMethod)) {
            AddScenario ("CheckEntryPointMethod");
            CodeEntryPointMethod cep = new CodeEntryPointMethod ();
            cd.Members.Add (cep);
        }
        // goto statements
        if (Supports (provider, GeneratorSupport.GotoStatements)) {
            AddScenario ("CheckGotoStatements");
            cmm = new CodeMemberMethod ();
            cmm.Name = "GoToMethod";
            cmm.ReturnType = new CodeTypeReference (typeof (int));
            cmm.Attributes = MemberAttributes.Public | MemberAttributes.Final;
            CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (typeof (int), "i");
            cmm.Parameters.Add (param);
            CodeConditionStatement condstmt = new CodeConditionStatement (new CodeBinaryOperatorExpression (
                new CodeArgumentReferenceExpression ("i"), CodeBinaryOperatorType.LessThan, new CodePrimitiveExpression (1)),
                new CodeGotoStatement ("comehere"));
            cmm.Statements.Add (condstmt);
            cmm.Statements.Add (new CodeMethodReturnStatement (new CodePrimitiveExpression (6)));
            cmm.Statements.Add (new CodeLabeledStatement ("comehere",
                new CodeMethodReturnStatement (new CodePrimitiveExpression (7))));
            cd.Members.Add (cmm);
        }
        if (Supports (provider, GeneratorSupport.NestedTypes)) {
            AddScenario ("CheckNestedTypes");
            cmm = new CodeMemberMethod ();
            cmm.Name = "CallingPublicNestedScenario";
            cmm.Parameters.Add (new CodeParameterDeclarationExpression (typeof (int), "i"));
            cmm.ReturnType = new CodeTypeReference (typeof (int));
            cmm.Attributes = MemberAttributes.Public | MemberAttributes.Static;
            cmm.Statements.Add (new CodeVariableDeclarationStatement (new CodeTypeReference
                ("PublicNestedClassA+PublicNestedClassB2+PublicNestedClassC"), "t",
                new CodeObjectCreateExpression (new CodeTypeReference
                ("PublicNestedClassA+PublicNestedClassB2+PublicNestedClassC"))));
            cmm.Statements.Add (new CodeMethodReturnStatement (new CodeMethodInvokeExpression (new CodeVariableReferenceExpression ("t"),
                "publicNestedClassesMethod",
                new CodeArgumentReferenceExpression ("i"))));
            cd.Members.Add (cmm);

            class1 = new CodeTypeDeclaration ("PublicNestedClassA");
            class1.IsClass = true;
            nspace.Types.Add (class1);
            CodeTypeDeclaration nestedClass = new CodeTypeDeclaration ("PublicNestedClassB1");
            nestedClass.IsClass = true;
            nestedClass.TypeAttributes = TypeAttributes.NestedPublic;
            class1.Members.Add (nestedClass);
            nestedClass = new CodeTypeDeclaration ("PublicNestedClassB2");
            nestedClass.TypeAttributes = TypeAttributes.NestedPublic;
            nestedClass.IsClass = true;
            class1.Members.Add (nestedClass);
            CodeTypeDeclaration innerNestedClass = new CodeTypeDeclaration ("PublicNestedClassC");
            innerNestedClass.TypeAttributes = TypeAttributes.NestedPublic;
            innerNestedClass.IsClass = true;
            nestedClass.Members.Add (innerNestedClass);
            cmm = new CodeMemberMethod ();
            cmm.Name = "publicNestedClassesMethod";
            cmm.ReturnType = new CodeTypeReference (typeof (int));
            cmm.Parameters.Add (new CodeParameterDeclarationExpression (typeof (int), "a"));
            cmm.Attributes = MemberAttributes.Public | MemberAttributes.Final;
            cmm.Statements.Add (new CodeMethodReturnStatement (new CodeArgumentReferenceExpression ("a")));
            innerNestedClass.Members.Add (cmm);
        }
        // Parameter Attributes
        if (Supports (provider, GeneratorSupport.ParameterAttributes)) {
            AddScenario ("CheckParameterAttributes");
            CodeMemberMethod method1 = new CodeMemberMethod ();
            method1.Name = "MyMethod";
            method1.Attributes = MemberAttributes.Public | MemberAttributes.Final;
            CodeParameterDeclarationExpression param1 = new CodeParameterDeclarationExpression (typeof (string), "blah");
            param1.CustomAttributes.Add (
                new CodeAttributeDeclaration (
                "System.Xml.Serialization.XmlElementAttribute",
                new CodeAttributeArgument (
                "Form",
                new CodeFieldReferenceExpression (new CodeTypeReferenceExpression ("System.Xml.Schema.XmlSchemaForm"), "Unqualified")),
                new CodeAttributeArgument (
                "IsNullable",
                new CodePrimitiveExpression (false))));
            method1.Parameters.Add (param1);
            cd.Members.Add (method1);
        }
        // public static members
        if (Supports (provider, GeneratorSupport.PublicStaticMembers)) {
            AddScenario ("CheckPublicStaticMembers");
            cmm = new CodeMemberMethod ();
            cmm.Name = "PublicStaticMethod";
            cmm.ReturnType = new CodeTypeReference (typeof (int));
            cmm.Attributes = MemberAttributes.Public | MemberAttributes.Static;
            cmm.Statements.Add (new CodeMethodReturnStatement (new CodePrimitiveExpression (16)));
            cd.Members.Add (cmm);
        }
        // reference parameters
        if (Supports (provider, GeneratorSupport.ReferenceParameters)) {
            AddScenario ("CheckReferenceParameters");
            cmm = new CodeMemberMethod ();
            cmm.Name = "Work";
            cmm.ReturnType = new CodeTypeReference ("System.void");
            cmm.Attributes = MemberAttributes.Static;
            // add parameter with ref direction
            CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (typeof (int), "i");
            param.Direction = FieldDirection.Ref;
            cmm.Parameters.Add (param);
            // add parameter with out direction
            param = new CodeParameterDeclarationExpression (typeof (int), "j");
            param.Direction = FieldDirection.Out;
            cmm.Parameters.Add (param);
            cmm.Statements.Add (new CodeAssignStatement (new CodeArgumentReferenceExpression ("i"),
                new CodeBinaryOperatorExpression (new CodeArgumentReferenceExpression ("i"),
                CodeBinaryOperatorType.Add, new CodePrimitiveExpression (4))));
            cmm.Statements.Add (new CodeAssignStatement (new CodeArgumentReferenceExpression ("j"),
                new CodePrimitiveExpression (5)));
            cd.Members.Add (cmm);

            cmm = new CodeMemberMethod ();
            cmm.Name = "CallingWork";
            cmm.Attributes = MemberAttributes.Public | MemberAttributes.Static;
            CodeParameterDeclarationExpression parames = new CodeParameterDeclarationExpression (typeof (int), "a");
            cmm.Parameters.Add (parames);
            cmm.ReturnType = new CodeTypeReference ("System.Int32");
            cmm.Statements.Add (new CodeAssignStatement (new CodeArgumentReferenceExpression ("a"),
                new CodePrimitiveExpression (10)));
            cmm.Statements.Add (new CodeVariableDeclarationStatement (typeof (int), "b"));
            // invoke the method called "work"
            CodeMethodInvokeExpression methodinvoked = new CodeMethodInvokeExpression (new CodeMethodReferenceExpression
                (new CodeTypeReferenceExpression ("TEST"), "Work"));
            // add parameter with ref direction
            CodeDirectionExpression parameter = new CodeDirectionExpression (FieldDirection.Ref,
                new CodeArgumentReferenceExpression ("a"));
            methodinvoked.Parameters.Add (parameter);
            // add parameter with out direction
            parameter = new CodeDirectionExpression (FieldDirection.Out, new CodeVariableReferenceExpression ("b"));
            methodinvoked.Parameters.Add (parameter);
            cmm.Statements.Add (methodinvoked);
            cmm.Statements.Add (new CodeMethodReturnStatement (new CodeBinaryOperatorExpression
                (new CodeArgumentReferenceExpression ("a"), CodeBinaryOperatorType.Add, new CodeVariableReferenceExpression ("b"))));
            cd.Members.Add (cmm);
        }
        if (Supports (provider, GeneratorSupport.ReturnTypeAttributes)) {
            AddScenario ("CheckReturnTypeAttributes");
            CodeMemberMethod function1 = new CodeMemberMethod ();
            function1.Name = "MyFunction";
            function1.ReturnType = new CodeTypeReference (typeof (string));
            function1.Attributes = MemberAttributes.Public | MemberAttributes.Final;
            function1.ReturnTypeCustomAttributes.Add (new
                CodeAttributeDeclaration ("System.Xml.Serialization.XmlIgnoreAttribute"));
            function1.ReturnTypeCustomAttributes.Add (new CodeAttributeDeclaration ("System.Xml.Serialization.XmlRootAttribute", new
                CodeAttributeArgument ("Namespace", new CodePrimitiveExpression ("Namespace Value")), new
                CodeAttributeArgument ("ElementName", new CodePrimitiveExpression ("Root, hehehe"))));
            function1.Statements.Add (new CodeMethodReturnStatement (new CodePrimitiveExpression ("Return")));
            cd.Members.Add (function1);
        }
        if (Supports (provider, GeneratorSupport.StaticConstructors)) {
            AddScenario ("CheckStaticConstructors");
            cmm = new CodeMemberMethod ();
            cmm.Name = "TestStaticConstructor";
            cmm.Attributes = MemberAttributes.Public | MemberAttributes.Static;
            cmm.ReturnType = new CodeTypeReference (typeof (int));
            CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (typeof (int), "a");
            cmm.Parameters.Add (param);
            // utilize constructor
            cmm.Statements.Add (new CodeVariableDeclarationStatement ("Test4", "t", new CodeObjectCreateExpression ("Test4")));
            // set then get number
            cmm.Statements.Add (new CodeAssignStatement (new CodePropertyReferenceExpression (new CodeVariableReferenceExpression ("t"), "i")
                , new CodeArgumentReferenceExpression ("a")));
            cmm.Statements.Add (new CodeMethodReturnStatement (new CodePropertyReferenceExpression (
                new CodeVariableReferenceExpression ("t"), "i")));
            cd.Members.Add (cmm);

            class1 = new CodeTypeDeclaration ();
            class1.Name = "Test4";
            class1.IsClass = true;
            nspace.Types.Add (class1);

            class1.Members.Add (new CodeMemberField (new CodeTypeReference (typeof (int)), "number"));
            CodeMemberProperty prop = new CodeMemberProperty ();
            prop.Name = "i";
            prop.Attributes = MemberAttributes.Public | MemberAttributes.Final;
            prop.Type = new CodeTypeReference (typeof (int));
            prop.GetStatements.Add (new CodeMethodReturnStatement (new CodeFieldReferenceExpression (null, "number")));
            prop.SetStatements.Add (new CodeAssignStatement (new CodeFieldReferenceExpression (null, "number"),
                new CodePropertySetValueReferenceExpression ()));
            class1.Members.Add (prop);
            CodeTypeConstructor ctc = new CodeTypeConstructor ();
            class1.Members.Add (ctc);
        }
        if (Supports (provider, GeneratorSupport.TryCatchStatements)) {
            AddScenario ("CheckTryCatchStatements");
            cmm = new CodeMemberMethod ();
            cmm.Name = "TryCatchMethod";
            cmm.ReturnType = new CodeTypeReference (typeof (int));
            cmm.Attributes = MemberAttributes.Public | MemberAttributes.Static;
            CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (typeof (int), "a");
            cmm.Parameters.Add (param);

            CodeTryCatchFinallyStatement tcfstmt = new CodeTryCatchFinallyStatement ();
            tcfstmt.FinallyStatements.Add (new CodeAssignStatement (new CodeArgumentReferenceExpression ("a"), new
                CodeBinaryOperatorExpression (new CodeArgumentReferenceExpression ("a"), CodeBinaryOperatorType.Add,
                new CodePrimitiveExpression (5))));
            cmm.Statements.Add (tcfstmt);
            cmm.Statements.Add (new CodeMethodReturnStatement (new CodeArgumentReferenceExpression ("a")));
            cd.Members.Add (cmm);
        }
        if (Supports (provider, GeneratorSupport.DeclareEvents)) {
            AddScenario ("CheckDeclareEvents");
            CodeNamespace ns = new CodeNamespace ();
            ns.Name = "MyNamespace";
            ns.Imports.Add (new CodeNamespaceImport ("System"));
            ns.Imports.Add (new CodeNamespaceImport ("System.Drawing"));
            ns.Imports.Add (new CodeNamespaceImport ("System.Windows.Forms"));
            ns.Imports.Add (new CodeNamespaceImport ("System.ComponentModel"));
            cu.Namespaces.Add (ns);
            class1 = new CodeTypeDeclaration ("Test");
            class1.IsClass = true;
            class1.BaseTypes.Add (new CodeTypeReference ("Form"));
            ns.Types.Add (class1);

            CodeMemberField mfield = new CodeMemberField (new CodeTypeReference ("Button"), "b");
            mfield.InitExpression = new CodeObjectCreateExpression (new CodeTypeReference ("Button"));
            class1.Members.Add (mfield);

            CodeConstructor ctor = new CodeConstructor ();
            ctor.Attributes = MemberAttributes.Public;
            ctor.Statements.Add (new CodeAssignStatement (new CodeFieldReferenceExpression (new CodeThisReferenceExpression (),
                "Size"), new CodeObjectCreateExpression (new CodeTypeReference ("Size"),
                new CodePrimitiveExpression (600), new CodePrimitiveExpression (600))));
            ctor.Statements.Add (new CodeAssignStatement (new CodePropertyReferenceExpression (new CodeFieldReferenceExpression (null, "b"),
                "Text"), new CodePrimitiveExpression ("Test")));
            ctor.Statements.Add (new CodeAssignStatement (new CodePropertyReferenceExpression (new CodeFieldReferenceExpression (null, "b"),
                "TabIndex"), new CodePrimitiveExpression (0)));
            ctor.Statements.Add (new CodeAssignStatement (new CodePropertyReferenceExpression (new CodeFieldReferenceExpression (null, "b"),
                "Location"), new CodeObjectCreateExpression (new CodeTypeReference ("Point"),
                new CodePrimitiveExpression (400), new CodePrimitiveExpression (525))));
            ctor.Statements.Add (new CodeAttachEventStatement (new CodeEventReferenceExpression (new
                CodeThisReferenceExpression (), "MyEvent"), new CodeDelegateCreateExpression (new CodeTypeReference ("EventHandler")
                , new CodeThisReferenceExpression (), "b_Click")));
            class1.Members.Add (ctor);

            CodeMemberEvent evt = new CodeMemberEvent ();
            evt.Name = "MyEvent";
            evt.Type = new CodeTypeReference ("System.EventHandler");
            evt.Attributes = MemberAttributes.Public;
            class1.Members.Add (evt);

            cmm = new CodeMemberMethod ();
            cmm.Name = "b_Click";
            cmm.Parameters.Add (new CodeParameterDeclarationExpression (typeof (object), "sender"));
            cmm.Parameters.Add (new CodeParameterDeclarationExpression (typeof (EventArgs), "e"));
            class1.Members.Add (cmm);
        }
        if (Supports (provider, GeneratorSupport.MultidimensionalArrays)) {
            // no codedom language represents declaration of multidimensional arrays
        }
    }