Ejemplo n.º 1
0
    public ItemMethod(string inName, MemberAttributes inAtt, List<string> inParameters)
    {
        method = new CodeMemberMethod();
        method.Name = inName;
        method.Attributes = inAtt;
        for (int i = 0; i < inParameters.Count; i++)
        {

            method.Parameters.Add(new CodeParameterDeclarationExpression(inParameters[i], "inArg" + i));
        }
        statement = new CodeConditionStatement();
    }
Ejemplo n.º 2
0
        public override void ProcessDirective(string directiveName, IDictionary <string, string> arguments)
        {
            if (!arguments.TryGetValue("name", out string name) || string.IsNullOrEmpty(name))
            {
                throw new DirectiveProcessorException("Parameter directive has no name argument");
            }

            arguments.TryGetValue("type", out string type);
            type = MapTypeName(type);

            string fieldName = "_" + name + "Field";
            var    typeRef   = new CodeTypeReference(type);
            var    thisRef   = new CodeThisReferenceExpression();
            var    fieldRef  = new CodeFieldReferenceExpression(thisRef, fieldName);

            var property = new CodeMemberProperty()
            {
                Name       = name,
                Attributes = MemberAttributes.Public | MemberAttributes.Final,
                HasGet     = true,
                HasSet     = false,
                Type       = typeRef
            };

            property.GetStatements.Add(new CodeMethodReturnStatement(fieldRef));
            members.Add(new CodeMemberField(typeRef, fieldName));
            members.Add(property);

            var valRef                 = new CodeVariableReferenceExpression("data");
            var namePrimitive          = new CodePrimitiveExpression(name);
            var sessionRef             = new CodePropertyReferenceExpression(thisRef, "Session");
            var callContextTypeRefExpr = new CodeTypeReferenceExpression("System.Runtime.Remoting.Messaging.CallContext");
            var nullPrim               = new CodePrimitiveExpression(null);

            bool hasAcquiredCheck = hostSpecific
#if FEATURE_APPDOMAINS
                                    || true;
#endif
            ;

            string acquiredName        = "_" + name + "Acquired";
            var    acquiredVariable    = new CodeVariableDeclarationStatement(typeof(bool), acquiredName, new CodePrimitiveExpression(false));
            var    acquiredVariableRef = new CodeVariableReferenceExpression(acquiredVariable.Name);
            if (hasAcquiredCheck)
            {
                postStatements.Add(acquiredVariable);
            }

            //checks the local called "data" can be cast and assigned to the field, and if successful, sets acquiredVariable to true
            var checkCastThenAssignVal = new CodeConditionStatement(
                new CodeMethodInvokeExpression(
                    new CodeTypeOfExpression(typeRef), "IsAssignableFrom", new CodeMethodInvokeExpression(valRef, "GetType")),
                hasAcquiredCheck
                                        ? new CodeStatement[] {
                new CodeAssignStatement(fieldRef, new CodeCastExpression(typeRef, valRef)),
                new CodeAssignStatement(acquiredVariableRef, new CodePrimitiveExpression(true)),
            }
                                        : new CodeStatement [] {
                new CodeAssignStatement(fieldRef, new CodeCastExpression(typeRef, valRef)),
            }
                ,
                new CodeStatement[] {
                new CodeExpressionStatement(new CodeMethodInvokeExpression(thisRef, "Error",
                                                                           new CodePrimitiveExpression("The type '" + type + "' of the parameter '" + name +
                                                                                                       "' did not match the type passed to the template"))),
            });

            //tries to gets the value from the session
            var checkSession = new CodeConditionStatement(
                new CodeBinaryOperatorExpression(NotNull(sessionRef), CodeBinaryOperatorType.BooleanAnd,
                                                 new CodeMethodInvokeExpression(sessionRef, "ContainsKey", namePrimitive)),
                new CodeVariableDeclarationStatement(typeof(object), "data", new CodeIndexerExpression(sessionRef, namePrimitive)),
                checkCastThenAssignVal);

            this.postStatements.Add(checkSession);

            //if acquiredVariable is false, tries to gets the value from the host
            if (hostSpecific)
            {
                var hostRef   = new CodePropertyReferenceExpression(thisRef, "Host");
                var checkHost = new CodeConditionStatement(
                    BooleanAnd(IsFalse(acquiredVariableRef), NotNull(hostRef)),
                    new CodeVariableDeclarationStatement(typeof(string), "data",
                                                         new CodeMethodInvokeExpression(hostRef, "ResolveParameterValue", nullPrim, nullPrim, namePrimitive)),
                    new CodeConditionStatement(
                        NotNull(valRef),
                        checkCastThenAssignVal));

                this.postStatements.Add(checkHost);
            }

#if FEATURE_APPDOMAINS
            //if acquiredVariable is false, tries to gets the value from the call context
            var checkCallContext = new CodeConditionStatement(
                IsFalse(acquiredVariableRef),
                new CodeVariableDeclarationStatement(typeof(object), "data",
                                                     new CodeMethodInvokeExpression(callContextTypeRefExpr, "LogicalGetData", namePrimitive)),
                new CodeConditionStatement(NotNull(valRef), checkCastThenAssignVal));

            this.postStatements.Add(checkCallContext);
#endif
        }
Ejemplo n.º 3
0
        CodeMemberMethod GenerateMethod(CodeTypeDeclaration mainClass)
        {
            CodeMemberMethod method;

            if (GroupZero)
            {
                method = GetMainMethod();
            }
            else
            {
                method = GetGroupMethod();
            }

            mainClass.Members.Add(method);
            CodeConditionStatement matches, subMatches;
            ArrayList        reverseMatches;
            CodeMemberMethod childMethod;
            CodeExpression   hasJSRef = GroupZero ?
                                        (CodeExpression) new CodeVariableReferenceExpression("hasJavaScript") :
                                        (CodeExpression) new CodeArgumentReferenceExpression("hasJavaScript");

            reverseMatches = GenerateExceptions(mainClass, !GroupZero);
            if (reverseMatches != null && reverseMatches.Count > 0)
            {
                foreach (CodeConditionStatement ccs in reverseMatches)
                {
                    method.Statements.Add(ccs);
                }
            }

            if (childGroups.Count > 0)
            {
                CodeDirectionExpression hasJavaScript = new CodeDirectionExpression(FieldDirection.Out, hasJSRef);
                CodeExpression          ualengthRef   = GroupZero ?
                                                        (CodeExpression) new CodeVariableReferenceExpression("ualength") :
                                                        (CodeExpression) new CodeArgumentReferenceExpression("ualength");

                int groupId = 0;

                CodeMethodReturnStatement returnHasJS = new CodeMethodReturnStatement(
                    new CodeVariableReferenceExpression("hasJavaScript"));

                foreach (GroupDefinition gd in childGroups)
                {
                    matches = gd.GenerateConditionStatement(mainClass);

                    if (gd.ChildGroups.Count > 0)
                    {
                        childMethod = gd.GenerateMethod(mainClass);

                        subMatches           = new CodeConditionStatement();
                        subMatches.Condition = new CodeMethodInvokeExpression(
                            new CodeMethodReferenceExpression(
                                new CodeTypeReferenceExpression("UplevelHelper"), childMethod.Name),
                            new CodeExpression[] { new CodeArgumentReferenceExpression("ua"),
                                                   hasJavaScript, ualengthRef }
                            );
                        subMatches.TrueStatements.Add(returnHasJS);
                        subMatches.FalseStatements.Add(new CodeMethodReturnStatement(
                                                           new CodePrimitiveExpression(false))
                                                       );

                        matches.TrueStatements.Add(subMatches);
                    }
                    else
                    {
                        reverseMatches = gd.GenerateExceptions(mainClass, !GroupZero);
                        if (reverseMatches != null && reverseMatches.Count > 0)
                        {
                            foreach (CodeConditionStatement ccs in reverseMatches)
                            {
                                matches.TrueStatements.Add(ccs);
                            }
                        }

                        if (!GroupZero && gd.Positional)
                        {
                            matches.TrueStatements.Add(
                                new CodeAssignStatement(
                                    new CodeVariableReferenceExpression("hasJavaScript"),
                                    new CodePrimitiveExpression(true))
                                );
                        }
                        matches.TrueStatements.Add(returnTrue);
                    }
                    method.Statements.Add(matches);
                    groupId++;
                }

                // return false;
                method.Statements.Add(new CodeMethodReturnStatement(new CodePrimitiveExpression(false)));
            }
            else
            {
                // return <valueOf_DefaultJS>
                method.Statements.Add(new CodeMethodReturnStatement(new CodePrimitiveExpression(DefaultJS)));
            }

            return(method);
        }
Ejemplo n.º 4
0
        public void ForLoops()
        {
            CodeNamespace nspace = new CodeNamespace("NSPC");

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

            CodeMemberMethod cmm = new CodeMemberMethod();
            cmm.Name = "TestBasicIterationStatement";
            cmm.Attributes = MemberAttributes.Public | MemberAttributes.Static;
            cmm.Statements.Add(new CodeVariableDeclarationStatement(new CodeTypeReference(typeof(int)), "i"));
            cmm.Statements.Add(new CodeIterationStatement(new CodeAssignStatement(new
                CodeVariableReferenceExpression("i"), new CodePrimitiveExpression(1)),
                new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("i"),
                CodeBinaryOperatorType.LessThan, new CodePrimitiveExpression(8)),
                new CodeAssignStatement(new CodeVariableReferenceExpression("i"),
                new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("i"), CodeBinaryOperatorType.Multiply,
                new CodePrimitiveExpression(2)))));
            cmm.ReturnType = new CodeTypeReference(typeof(int));
            cmm.Statements.Add(new CodeMethodReturnStatement(new CodeVariableReferenceExpression("i")));
            class1.Members.Add(cmm);

            cmm = new CodeMemberMethod();
            cmm.Name = "TestComplexIterationStatement";
            cmm.Attributes = MemberAttributes.Public | MemberAttributes.Static;
            cmm.ReturnType = new CodeTypeReference(typeof(int));
            cmm.Statements.Add(new CodeVariableDeclarationStatement(new CodeTypeReference(typeof(int)), "i"));
            cmm.Statements.Add(new CodeVariableDeclarationStatement(new CodeTypeReference(typeof(int)), "a", new CodePrimitiveExpression(7)));
            cmm.Statements.Add(new CodeVariableDeclarationStatement(new CodeTypeReference(typeof(int)), "b"));
            cmm.Statements.Add(new CodeVariableDeclarationStatement(new CodeTypeReference(typeof(int)), "c", new CodePrimitiveExpression(9)));
            cmm.Statements.Add(new CodeVariableDeclarationStatement(new CodeTypeReference(typeof(int)), "d", new CodePrimitiveExpression(2)));
            CodeIterationStatement iteration = new CodeIterationStatement();
            iteration.IncrementStatement = new CodeAssignStatement(new CodeVariableReferenceExpression("i"),
                new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("i"), CodeBinaryOperatorType.Add,
                new CodePrimitiveExpression(1)));
            iteration.InitStatement = new CodeAssignStatement(new CodeVariableReferenceExpression("i"), new
                CodePrimitiveExpression(0));
            iteration.TestExpression = (new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("i"),
                CodeBinaryOperatorType.LessThan, new CodePrimitiveExpression(2)));
            CodeConditionStatement secondIf = new CodeConditionStatement(new CodeBinaryOperatorExpression(
                new CodeVariableReferenceExpression("c"), CodeBinaryOperatorType.LessThan, new CodePrimitiveExpression(10)),
                new CodeAssignStatement(new CodeVariableReferenceExpression("d"), new CodeBinaryOperatorExpression(
                new CodeVariableReferenceExpression("d"), CodeBinaryOperatorType.Subtract, new CodePrimitiveExpression(1))));

            CodeIterationStatement secondFor = new CodeIterationStatement();
            secondFor.Statements.Add(secondIf);
            secondFor.IncrementStatement = new CodeAssignStatement(new CodeVariableReferenceExpression("b"),
                new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("b"), CodeBinaryOperatorType.Add,
                new CodePrimitiveExpression(1)));
            secondFor.InitStatement = new CodeAssignStatement(new CodeVariableReferenceExpression("b"), new
                CodePrimitiveExpression(0));
            secondFor.TestExpression = (new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("b"),
                CodeBinaryOperatorType.LessThan, new CodePrimitiveExpression(2)));
            secondFor.Statements.Add(new CodeAssignStatement(new CodeVariableReferenceExpression("d"),
                new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("d"), CodeBinaryOperatorType.Multiply,
                new CodePrimitiveExpression(2))));

            CodeConditionStatement firstIf = new CodeConditionStatement();
            firstIf.Condition = new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("a"), CodeBinaryOperatorType.LessThan,
                new CodePrimitiveExpression(16));
            firstIf.TrueStatements.Add(secondFor);

            iteration.Statements.Add(firstIf);
            cmm.Statements.Add(iteration);
            cmm.Statements.Add(new CodeMethodReturnStatement(new CodeVariableReferenceExpression("d")));
            class1.Members.Add(cmm);

            AssertEqual(nspace,
                @"Namespace NSPC
                  Public Class ClassWithMethod
                      Public Shared Function TestBasicIterationStatement() As Integer
                          Dim i As Integer
                          i = 1
                          Do While (i < 8)
                              i = (i * 2)
                          Loop
                          Return i
                      End Function
                      Public Shared Function TestComplexIterationStatement() As Integer
                          Dim i As Integer
                          Dim a As Integer = 7
                          Dim b As Integer
                          Dim c As Integer = 9
                          Dim d As Integer = 2
                          i = 0
                          Do While (i < 2)
                              If (a < 16) Then
                                  b = 0
                                  Do While (b < 2)
                                      If (c < 10) Then
                                          d = (d - 1)
                                      End If
                                      d = (d * 2)
                                      b = (b + 1)
                                  Loop
                              End If
                              i = (i + 1)
                          Loop
                          Return d
                      End Function
                  End Class
              End Namespace");
        }
Ejemplo n.º 5
0
 internal CodeConditionStatement If(CodeExpression test, Action xlatThen, Action xlatElse)
 {
     var i = new CodeConditionStatement
     {
         Condition = test
     };
     Scope.Add(i);
     var old = Scope;
     Scope = i.TrueStatements;
     xlatThen();
     Scope = i.FalseStatements;
     xlatElse();
     Scope = old;
     return i;
 }
Ejemplo n.º 6
0
 private static void ProcessEqualityOperators(CodeMemberMethod cmm)
 {
     if (cmm.Name == "operator==" || cmm.Name == "operator!=")
     {
         CodeMethodInvokeExpression methodInvokeExpression =
             new CodeMethodInvokeExpression(null, "ReferenceEquals",
                                            new CodeArgumentReferenceExpression(cmm.Parameters[0].Name),
                                            new CodeArgumentReferenceExpression(cmm.Parameters[1].Name));
         CodeConditionStatement conditionStatement =
             new CodeConditionStatement(
                 new CodeBinaryOperatorExpression(
                     new CodeMethodInvokeExpression(null, "ReferenceEquals",
                                                    new CodeArgumentReferenceExpression(cmm.Parameters[0].Name),
                                                    new CodePrimitiveExpression(null)),
                     CodeBinaryOperatorType.BooleanOr,
                     new CodeMethodInvokeExpression(null, "ReferenceEquals",
                                                    new CodeArgumentReferenceExpression(cmm.Parameters[1].Name),
                                                    new CodePrimitiveExpression(null))),
                 new CodeMethodReturnStatement(
                     cmm.Name == "operator=="
                         ? (CodeExpression) methodInvokeExpression
                         : new CodeBinaryOperatorExpression(
                               methodInvokeExpression, CodeBinaryOperatorType.ValueEquality, new CodePrimitiveExpression(false))));
         cmm.Statements.Add(conditionStatement);
     }
 }
Ejemplo n.º 7
0
        public static CodeConditionStatement Then(this CodeConditionStatement condition, params CodeStatement [] codeStatements)
        {
            condition.TrueStatements.AddRange(codeStatements);

            return(condition);
        }
Ejemplo n.º 8
0
        private void GenerateConditionStatement(CodeConditionStatement e)
        {
            Output.Write("if (");
            GenerateExpression(e.Condition);
            Output.Write(")");
            OutputStartingBrace();
            Indent++;
            GenerateStatements(e.TrueStatements);
            Indent--;

            CodeStatementCollection falseStatements = e.FalseStatements;
            if (falseStatements.Count > 0)
            {
                Output.Write("}");
                if (Options.ElseOnClosing)
                {
                    Output.Write(" ");
                }
                else
                {
                    Output.WriteLine("");
                }
                Output.Write("else");
                OutputStartingBrace();
                Indent++;
                GenerateStatements(e.FalseStatements);
                Indent--;
            }
            Output.WriteLine("}");
        }
Ejemplo n.º 9
0
        static void GenerateProjectActionsCode(CodeNamespace cns, GenerationOptions options, params ProjectBackend[] projects)
        {
            bool multiProject = projects.Length > 1;

            CodeTypeDeclaration type = new CodeTypeDeclaration("ActionGroups");

            type.Attributes     = MemberAttributes.Private;
            type.TypeAttributes = TypeAttributes.NestedAssembly;
            cns.Types.Add(type);

            // Generate the global action group getter

            CodeMemberMethod met = new CodeMemberMethod();

            met.Name = "GetActionGroup";
            type.Members.Add(met);
            met.Parameters.Add(new CodeParameterDeclarationExpression(typeof(Type), "type"));
            if (multiProject)
            {
                met.Parameters.Add(new CodeParameterDeclarationExpression(typeof(string), "file"));
            }
            met.ReturnType = new CodeTypeReference(typeof(Gtk.ActionGroup));
            met.Attributes = MemberAttributes.Public | MemberAttributes.Static;

            CodeMethodInvokeExpression call = new CodeMethodInvokeExpression(
                new CodeMethodReferenceExpression(
                    new CodeTypeReferenceExpression(new CodeTypeReference(cns.Name + ".ActionGroups")),
                    "GetActionGroup"
                    ),
                new CodePropertyReferenceExpression(
                    new CodeArgumentReferenceExpression("type"),
                    "FullName"
                    )
                );

            if (multiProject)
            {
                call.Parameters.Add(new CodeArgumentReferenceExpression("file"));
            }

            met.Statements.Add(new CodeMethodReturnStatement(call));

            // Generate the global action group getter (overload)

            met      = new CodeMemberMethod();
            met.Name = "GetActionGroup";
            type.Members.Add(met);
            met.Parameters.Add(new CodeParameterDeclarationExpression(typeof(string), "name"));
            if (multiProject)
            {
                met.Parameters.Add(new CodeParameterDeclarationExpression(typeof(string), "file"));
            }
            met.ReturnType = new CodeTypeReference(typeof(Gtk.ActionGroup));
            met.Attributes = MemberAttributes.Public | MemberAttributes.Static;

            CodeArgumentReferenceExpression cfile = new CodeArgumentReferenceExpression("file");
            CodeArgumentReferenceExpression cid   = new CodeArgumentReferenceExpression("name");

            CodeStatementCollection projectCol = met.Statements;
            int n = 1;

            foreach (ProjectBackend gp in projects)
            {
                CodeStatementCollection widgetCol;

                if (multiProject)
                {
                    CodeConditionStatement pcond = new CodeConditionStatement();
                    pcond.Condition = new CodeBinaryOperatorExpression(
                        cfile,
                        CodeBinaryOperatorType.IdentityEquality,
                        new CodePrimitiveExpression(gp.Id)
                        );
                    projectCol.Add(pcond);

                    widgetCol  = pcond.TrueStatements;
                    projectCol = pcond.FalseStatements;
                }
                else
                {
                    widgetCol = projectCol;
                }

                foreach (Wrapper.ActionGroup grp in gp.ActionGroups)
                {
                    string          fname    = "group" + (n++);
                    CodeMemberField grpField = new CodeMemberField(new CodeTypeReference(typeof(Gtk.ActionGroup), CodeTypeReferenceOptions.GlobalReference), fname);
                    grpField.Attributes |= MemberAttributes.Static;
                    type.Members.Add(grpField);
                    CodeFieldReferenceExpression grpVar = new CodeFieldReferenceExpression(
                        new CodeTypeReferenceExpression(new CodeTypeReference(cns.Name + ".ActionGroups", CodeTypeReferenceOptions.GlobalReference)),
                        fname
                        );

                    CodeConditionStatement pcond = new CodeConditionStatement();
                    pcond.Condition = new CodeBinaryOperatorExpression(
                        cid,
                        CodeBinaryOperatorType.IdentityEquality,
                        new CodePrimitiveExpression(grp.Name)
                        );
                    widgetCol.Add(pcond);

                    // If the group has not yet been created, create it
                    CodeConditionStatement pcondGrp = new CodeConditionStatement();
                    pcondGrp.Condition = new CodeBinaryOperatorExpression(
                        grpVar,
                        CodeBinaryOperatorType.IdentityEquality,
                        new CodePrimitiveExpression(null)
                        );

                    pcondGrp.TrueStatements.Add(
                        new CodeAssignStatement(
                            grpVar,
                            new CodeObjectCreateExpression(grp.Name)
                            )
                        );

                    pcond.TrueStatements.Add(pcondGrp);
                    pcond.TrueStatements.Add(new CodeMethodReturnStatement(grpVar));

                    widgetCol = pcond.FalseStatements;
                }
                widgetCol.Add(new CodeMethodReturnStatement(new CodePrimitiveExpression(null)));
            }
            if (met.Statements.Count == 0)
            {
                met.Statements.Add(new CodeMethodReturnStatement(new CodePrimitiveExpression(null)));
            }
        }
Ejemplo n.º 10
0
        public static CodeGenerationResult GenerateProjectCode(GenerationOptions options, ProjectBackend[] projects)
        {
            ArrayList warningList = new ArrayList();

            List <SteticCompilationUnit> units      = new List <SteticCompilationUnit> ();
            SteticCompilationUnit        globalUnit = new SteticCompilationUnit("");

            units.Add(globalUnit);

            if (options == null)
            {
                options = new GenerationOptions();
            }
            CodeNamespace globalNs = new CodeNamespace(options.GlobalNamespace);

            globalUnit.Namespaces.Add(globalNs);

            // Global class

            CodeTypeDeclaration globalType = new CodeTypeDeclaration("Gui");

            globalType.Attributes     = MemberAttributes.Private;
            globalType.TypeAttributes = TypeAttributes.NestedAssembly;
            globalNs.Types.Add(globalType);

            // Create the project initialization method
            // This method will only be added at the end if there
            // is actually something to initialize

            CodeMemberMethod initMethod = new CodeMemberMethod();

            initMethod.Name       = "Initialize";
            initMethod.ReturnType = new CodeTypeReference(typeof(void));
            initMethod.Attributes = MemberAttributes.Assembly | MemberAttributes.Static;
            initMethod.Parameters.Add(new CodeParameterDeclarationExpression(typeof(Gtk.Widget), "iconRenderer"));

            GeneratorContext initContext = new ProjectGeneratorContext(globalNs, globalType, initMethod.Statements, options);

            initContext.RootObject = new CodeArgumentReferenceExpression("iconRenderer");

            // Generate icon factory creation

            foreach (ProjectBackend gp in projects)
            {
                if (gp.IconFactory.Icons.Count > 0)
                {
                    gp.IconFactory.GenerateBuildCode(initContext);
                }
            }
            warningList.AddRange(initContext.Warnings);

            // Generate the code

            if (options.UsePartialClasses)
            {
                CodeGeneratorPartialClass.GenerateProjectGuiCode(globalUnit, globalNs, globalType, options, units, projects, warningList);
            }
            else
            {
                CodeGeneratorInternalClass.GenerateProjectGuiCode(globalUnit, globalNs, globalType, options, units, projects, warningList);
            }

            GenerateProjectActionsCode(globalNs, options, projects);

            // Final step. If there is some initialization code, add all needed infrastructure

            globalType.Members.Add(initMethod);

            CodeMemberField initField = new CodeMemberField(typeof(bool), "initialized");

            initField.Attributes = MemberAttributes.Private | MemberAttributes.Static;
            globalType.Members.Add(initField);

            CodeFieldReferenceExpression initVar = new CodeFieldReferenceExpression(
                new CodeTypeReferenceExpression(globalNs.Name + ".Gui"),
                "initialized"
                );

            CodeConditionStatement initCondition = new CodeConditionStatement();

            initCondition.Condition = new CodeBinaryOperatorExpression(
                initVar,
                CodeBinaryOperatorType.IdentityEquality,
                new CodePrimitiveExpression(false)
                );
            initCondition.TrueStatements.Add(new CodeAssignStatement(
                                                 initVar,
                                                 new CodePrimitiveExpression(true)
                                                 ));
            initCondition.TrueStatements.AddRange(initMethod.Statements);
            initMethod.Statements.Clear();
            initMethod.Statements.Add(initCondition);

            return(new CodeGenerationResult(units.ToArray(), (string[])warningList.ToArray(typeof(string))));
        }
        void GenerateEventBasedAsyncSupport(CodeTypeDeclaration type, OperationDescription od, CodeNamespace cns)
        {
            var  method      = FindByName(type, od.Name) ?? FindByName(type, "Begin" + od.Name);
            var  endMethod   = method.Name == od.Name ? null : FindByName(type, "End" + od.Name);
            bool methodAsync = method.Name.StartsWith("Begin", StringComparison.Ordinal);
            var  resultType  = endMethod != null ? endMethod.ReturnType : method.ReturnType;

            var thisExpr        = new CodeThisReferenceExpression();
            var baseExpr        = new CodeBaseReferenceExpression();
            var nullExpr        = new CodePrimitiveExpression(null);
            var asyncResultType = new CodeTypeReference(typeof(IAsyncResult));

            // OnBeginXxx() implementation
            var cm = new CodeMemberMethod()
            {
                Name       = "OnBegin" + od.Name,
                Attributes = MemberAttributes.Private | MemberAttributes.Final,
                ReturnType = asyncResultType
            };

            type.Members.Add(cm);

            AddMethodParam(cm, typeof(object []), "args");
            AddMethodParam(cm, typeof(AsyncCallback), "asyncCallback");
            AddMethodParam(cm, typeof(object), "userState");

            var call = new CodeMethodInvokeExpression(
                thisExpr,
                "Begin" + od.Name);

            for (int idx = 0; idx < method.Parameters.Count - (methodAsync ? 2 : 0); idx++)
            {
                var p = method.Parameters [idx];
                cm.Statements.Add(new CodeVariableDeclarationStatement(p.Type, p.Name, new CodeCastExpression(p.Type, new CodeArrayIndexerExpression(new CodeArgumentReferenceExpression("args"), new CodePrimitiveExpression(idx)))));
                call.Parameters.Add(new CodeVariableReferenceExpression(p.Name));
            }
            call.Parameters.Add(new CodeArgumentReferenceExpression("asyncCallback"));
            call.Parameters.Add(new CodeArgumentReferenceExpression("userState"));
            cm.Statements.Add(new CodeMethodReturnStatement(call));

            // OnEndXxx() implementation
            cm = new CodeMemberMethod()
            {
                Name       = "OnEnd" + od.Name,
                Attributes = MemberAttributes.Private | MemberAttributes.Final,
                ReturnType = new CodeTypeReference(typeof(object []))
            };
            type.Members.Add(cm);

            AddMethodParam(cm, typeof(IAsyncResult), "result");

            var outArgRefs = new List <CodeVariableReferenceExpression> ();

            for (int idx = 0; idx < method.Parameters.Count; idx++)
            {
                var p = method.Parameters [idx];
                if (p.Direction != FieldDirection.In)
                {
                    cm.Statements.Add(new CodeVariableDeclarationStatement(p.Type, p.Name));
                    outArgRefs.Add(new CodeVariableReferenceExpression(p.Name));                       // FIXME: should this work? They need "out" or "ref" modifiers.
                }
            }

            call = new CodeMethodInvokeExpression(
                thisExpr,
                "End" + od.Name,
                new CodeArgumentReferenceExpression("result"));
            call.Parameters.AddRange(outArgRefs.Cast <CodeExpression> ().ToArray());              // questionable

            var retCreate = new CodeArrayCreateExpression(typeof(object));

            if (resultType.BaseType == "System.Void")
            {
                cm.Statements.Add(call);
            }
            else
            {
                cm.Statements.Add(new CodeVariableDeclarationStatement(typeof(object), "__ret", call));
                retCreate.Initializers.Add(new CodeVariableReferenceExpression("__ret"));
            }
            foreach (var outArgRef in outArgRefs)
            {
                retCreate.Initializers.Add(new CodeVariableReferenceExpression(outArgRef.VariableName));
            }

            cm.Statements.Add(new CodeMethodReturnStatement(retCreate));

            // OnXxxCompleted() implementation
            cm = new CodeMemberMethod()
            {
                Name       = "On" + od.Name + "Completed",
                Attributes = MemberAttributes.Private | MemberAttributes.Final
            };
            type.Members.Add(cm);

            AddMethodParam(cm, typeof(object), "state");

            string argsname        = identifiers.AddUnique(od.Name + "CompletedEventArgs", null);
            var    iaargs          = new CodeTypeReference("InvokeAsyncCompletedEventArgs");  // avoid messy System.Type instance for generic nested type :|
            var    iaref           = new CodeVariableReferenceExpression("args");
            var    methodEventArgs = new CodeObjectCreateExpression(new CodeTypeReference(argsname),
                                                                    new CodePropertyReferenceExpression(iaref, "Results"),
                                                                    new CodePropertyReferenceExpression(iaref, "Error"),
                                                                    new CodePropertyReferenceExpression(iaref, "Cancelled"),
                                                                    new CodePropertyReferenceExpression(iaref, "UserState"));

            cm.Statements.Add(new CodeConditionStatement(
                                  new CodeBinaryOperatorExpression(
                                      new CodeEventReferenceExpression(thisExpr, od.Name + "Completed"), CodeBinaryOperatorType.IdentityInequality, nullExpr),
                                  new CodeVariableDeclarationStatement(iaargs, "args", new CodeCastExpression(iaargs, new CodeArgumentReferenceExpression("state"))),
                                  new CodeExpressionStatement(new CodeMethodInvokeExpression(thisExpr, od.Name + "Completed", thisExpr, methodEventArgs))));

            // delegate fields
            type.Members.Add(new CodeMemberField(new CodeTypeReference("BeginOperationDelegate"), "onBegin" + od.Name + "Delegate"));
            type.Members.Add(new CodeMemberField(new CodeTypeReference("EndOperationDelegate"), "onEnd" + od.Name + "Delegate"));
            type.Members.Add(new CodeMemberField(new CodeTypeReference(typeof(SendOrPostCallback)), "on" + od.Name + "CompletedDelegate"));

            // XxxCompletedEventArgs class
            var argsType = new CodeTypeDeclaration(argsname);

            argsType.BaseTypes.Add(new CodeTypeReference(typeof(AsyncCompletedEventArgs)));
            cns.Types.Add(argsType);

            var argsCtor = new CodeConstructor()
            {
                Attributes = MemberAttributes.Public | MemberAttributes.Final
            };

            argsCtor.Parameters.Add(new CodeParameterDeclarationExpression(typeof(object []), "results"));
            argsCtor.Parameters.Add(new CodeParameterDeclarationExpression(typeof(Exception), "error"));
            argsCtor.Parameters.Add(new CodeParameterDeclarationExpression(typeof(bool), "cancelled"));
            argsCtor.Parameters.Add(new CodeParameterDeclarationExpression(typeof(object), "userState"));
            argsCtor.BaseConstructorArgs.Add(new CodeArgumentReferenceExpression("error"));
            argsCtor.BaseConstructorArgs.Add(new CodeArgumentReferenceExpression("cancelled"));
            argsCtor.BaseConstructorArgs.Add(new CodeArgumentReferenceExpression("userState"));
            var resultsField = new CodeFieldReferenceExpression(thisExpr, "results");

            argsCtor.Statements.Add(new CodeAssignStatement(resultsField, new CodeArgumentReferenceExpression("results")));
            argsType.Members.Add(argsCtor);

            argsType.Members.Add(new CodeMemberField(typeof(object []), "results"));

            if (resultType.BaseType != "System.Void")
            {
                var resultProp = new CodeMemberProperty {
                    Name       = "Result",
                    Type       = resultType,
                    Attributes = MemberAttributes.Public | MemberAttributes.Final
                };
                resultProp.GetStatements.Add(new CodeMethodReturnStatement(new CodeCastExpression(resultProp.Type, new CodeArrayIndexerExpression(resultsField, new CodePrimitiveExpression(0)))));
                argsType.Members.Add(resultProp);
            }

            // event field
            var handlerType = new CodeTypeReference(typeof(EventHandler <>));

            handlerType.TypeArguments.Add(new CodeTypeReference(argsType.Name));
            type.Members.Add(new CodeMemberEvent()
            {
                Name       = od.Name + "Completed",
                Type       = handlerType,
                Attributes = MemberAttributes.Public | MemberAttributes.Final
            });

            // XxxAsync() implementations
            bool hasAsync = false;

            foreach (int __x in Enumerable.Range(0, 2))
            {
                cm = new CodeMemberMethod();
                type.Members.Add(cm);
                cm.Name       = od.Name + "Async";
                cm.Attributes = MemberAttributes.Public
                                | MemberAttributes.Final;

                var inArgs = new List <CodeParameterDeclarationExpression> ();

                for (int idx = 0; idx < method.Parameters.Count - (methodAsync ? 2 : 0); idx++)
                {
                    var pd = method.Parameters [idx];
                    inArgs.Add(pd);
                    cm.Parameters.Add(pd);
                }

                // First one is overload without asyncState arg.
                if (!hasAsync)
                {
                    call = new CodeMethodInvokeExpression(thisExpr, cm.Name, inArgs.ConvertAll <CodeExpression> (decl => new CodeArgumentReferenceExpression(decl.Name)).ToArray());
                    call.Parameters.Add(nullExpr);
                    cm.Statements.Add(new CodeExpressionStatement(call));
                    hasAsync = true;
                    continue;
                }

                // Second one is the primary one.

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

                // if (onBeginBarOperDelegate == null) onBeginBarOperDelegate = new BeginOperationDelegate (OnBeginBarOper);
                // if (onEndBarOperDelegate == null) onEndBarOperDelegate = new EndOperationDelegate (OnEndBarOper);
                // if (onBarOperCompletedDelegate == null) onBarOperCompletedDelegate = new BeginOperationDelegate (OnBarOperCompleted);
                var beginOperDelegateRef     = new CodeFieldReferenceExpression(thisExpr, "onBegin" + od.Name + "Delegate");
                var endOperDelegateRef       = new CodeFieldReferenceExpression(thisExpr, "onEnd" + od.Name + "Delegate");
                var operCompletedDelegateRef = new CodeFieldReferenceExpression(thisExpr, "on" + od.Name + "CompletedDelegate");

                var ifstmt = new CodeConditionStatement(
                    new CodeBinaryOperatorExpression(beginOperDelegateRef, CodeBinaryOperatorType.IdentityEquality, nullExpr),
                    new CodeAssignStatement(beginOperDelegateRef, new CodeDelegateCreateExpression(new CodeTypeReference("BeginOperationDelegate"), thisExpr, "OnBegin" + od.Name)));
                cm.Statements.Add(ifstmt);
                ifstmt = new CodeConditionStatement(
                    new CodeBinaryOperatorExpression(endOperDelegateRef, CodeBinaryOperatorType.IdentityEquality, nullExpr),
                    new CodeAssignStatement(endOperDelegateRef, new CodeDelegateCreateExpression(new CodeTypeReference("EndOperationDelegate"), thisExpr, "OnEnd" + od.Name)));
                cm.Statements.Add(ifstmt);
                ifstmt = new CodeConditionStatement(
                    new CodeBinaryOperatorExpression(operCompletedDelegateRef, CodeBinaryOperatorType.IdentityEquality, nullExpr),
                    new CodeAssignStatement(operCompletedDelegateRef, new CodeDelegateCreateExpression(new CodeTypeReference(typeof(SendOrPostCallback)), thisExpr, "On" + od.Name + "Completed")));
                cm.Statements.Add(ifstmt);

                // InvokeAsync (onBeginBarOperDelegate, inValues, onEndBarOperDelegate, onBarOperCompletedDelegate, userState);

                inArgs.Add(new CodeParameterDeclarationExpression(typeof(object), "userState"));

                var args = new List <CodeExpression> ();
                args.Add(beginOperDelegateRef);
                args.Add(new CodeArrayCreateExpression(typeof(object), inArgs.ConvertAll <CodeExpression> (decl => new CodeArgumentReferenceExpression(decl.Name)).ToArray()));
                args.Add(endOperDelegateRef);
                args.Add(new CodeFieldReferenceExpression(thisExpr, "on" + od.Name + "CompletedDelegate"));
                args.Add(new CodeArgumentReferenceExpression("userState"));
                call = new CodeMethodInvokeExpression(baseExpr, "InvokeAsync", args.ToArray());
                cm.Statements.Add(new CodeExpressionStatement(call));
            }
        }
Ejemplo n.º 12
0
        public void CodeConditionStatementTest()
        {
            CodeStatement[] trueStatements = new CodeStatement[]
            {
                new CodeExpressionStatement(new CodeSnippetExpression("DoA()")),
                new CodeExpressionStatement(new CodeSnippetExpression(";")),
                new CodeExpressionStatement(new CodeSnippetExpression("DoB()")),
                new CodeExpressionStatement(new CodeSnippetExpression("")),
                new CodeSnippetStatement("A"),
                new CodeExpressionStatement(new CodeSnippetExpression("DoC()"))
            };

            CodeStatement[] falseStatements = new CodeStatement[]
            {
                new CodeExpressionStatement(new CodeSnippetExpression("DoD()")),
                new CodeSnippetStatement("B"),
                new CodeExpressionStatement(new CodeSnippetExpression(";")),
                new CodeExpressionStatement(new CodeSnippetExpression("DoE()")),
                new CodeExpressionStatement(new CodeSnippetExpression("")),
                new CodeExpressionStatement(new CodeSnippetExpression("DoF()"))
            };

            CodeConditionStatement conditionStatement = new CodeConditionStatement();

            statement = conditionStatement;

            try
            {
                Generate();
                Assert.Fail("#1");
            }
            catch (ArgumentNullException)
            {
            }

            conditionStatement.Condition = new CodeSnippetExpression("");
            Assert.AreEqual(string.Format(CultureInfo.InvariantCulture,
                                          "if () {{{0}" +
                                          "}}{0}", NewLine), Generate(), "#2");

            conditionStatement.Condition = new CodeSnippetExpression("true == false");
            Assert.AreEqual(string.Format(CultureInfo.InvariantCulture,
                                          "if (true == false) {{{0}" +
                                          "}}{0}", NewLine), Generate(), "#3");

            conditionStatement.TrueStatements.AddRange(trueStatements);
            Assert.AreEqual(string.Format(CultureInfo.InvariantCulture,
                                          "if (true == false) {{{0}" +
                                          "    DoA();{0}" +
                                          "    ;;{0}" +
                                          "    DoB();{0}" +
                                          "    ;{0}" +
#if NET_2_0
                                          "A{0}" +
#else
                                          "    A{0}" +
#endif
                                          "    DoC();{0}" +
                                          "}}{0}", NewLine), Generate(), "#3");

            conditionStatement.FalseStatements.AddRange(falseStatements);
            Assert.AreEqual(string.Format(CultureInfo.InvariantCulture,
                                          "if (true == false) {{{0}" +
                                          "    DoA();{0}" +
                                          "    ;;{0}" +
                                          "    DoB();{0}" +
                                          "    ;{0}" +
#if NET_2_0
                                          "A{0}" +
#else
                                          "    A{0}" +
#endif
                                          "    DoC();{0}" +
                                          "}}{0}" +
                                          "else {{{0}" +
                                          "    DoD();{0}" +
#if NET_2_0
                                          "B{0}" +
#else
                                          "    B{0}" +
#endif
                                          "    ;;{0}" +
                                          "    DoE();{0}" +
                                          "    ;{0}" +
                                          "    DoF();{0}" +
                                          "}}{0}", NewLine), Generate(), "#4");

            options.ElseOnClosing = true;

            Assert.AreEqual(string.Format(CultureInfo.InvariantCulture,
                                          "if (true == false) {{{0}" +
                                          "    DoA();{0}" +
                                          "    ;;{0}" +
                                          "    DoB();{0}" +
                                          "    ;{0}" +
#if NET_2_0
                                          "A{0}" +
#else
                                          "    A{0}" +
#endif
                                          "    DoC();{0}" +
                                          "}} else {{{0}" +
                                          "    DoD();{0}" +
#if NET_2_0
                                          "B{0}" +
#else
                                          "    B{0}" +
#endif
                                          "    ;;{0}" +
                                          "    DoE();{0}" +
                                          "    ;{0}" +
                                          "    DoF();{0}" +
                                          "}}{0}", NewLine), Generate(), "#5");

            options.ElseOnClosing = false;

            conditionStatement.TrueStatements.Clear();

            Assert.AreEqual(string.Format(CultureInfo.InvariantCulture,
                                          "if (true == false) {{{0}" +
                                          "}}{0}" +
                                          "else {{{0}" +
                                          "    DoD();{0}" +
#if NET_2_0
                                          "B{0}" +
#else
                                          "    B{0}" +
#endif
                                          "    ;;{0}" +
                                          "    DoE();{0}" +
                                          "    ;{0}" +
                                          "    DoF();{0}" +
                                          "}}{0}", NewLine), Generate(), "#6");

            conditionStatement.TrueStatements.AddRange(trueStatements);
            conditionStatement.FalseStatements.Clear();
            Assert.AreEqual(string.Format(CultureInfo.InvariantCulture,
                                          "if (true == false) {{{0}" +
                                          "    DoA();{0}" +
                                          "    ;;{0}" +
                                          "    DoB();{0}" +
                                          "    ;{0}" +
#if NET_2_0
                                          "A{0}" +
#else
                                          "    A{0}" +
#endif
                                          "    DoC();{0}" +
                                          "}}{0}", NewLine), Generate(), "#7");
        }
Ejemplo n.º 13
0
        /// <summary>
        /// Generates a property that gets the lock for the data model.
        /// </summary>
        public CurrentProperty(DataModelSchema dataModelSchema)
        {
            //		/// <summary>
            //		/// Gets the current DataModelTransaction.
            //		/// </summary>
            //		public static DataModelTransaction Current
            //		{
            this.Comments.Add(new CodeCommentStatement("<summary>", true));
            this.Comments.Add(new CodeCommentStatement("Gets the lock for the data model.", true));
            this.Comments.Add(new CodeCommentStatement("</summary>", true));
            this.CustomAttributes.AddRange(new CodeCustomAttributesForProperties());
            this.Attributes = MemberAttributes.Public | MemberAttributes.Static;
            this.Type       = new CodeTypeReference(String.Format("{0}Transaction", dataModelSchema.Name));
            this.Name       = "Current";

            //			get
            //			{
            //				try
            //				{
            CodeTryCatchFinallyStatement tryLockStatement = new CodeTryCatchFinallyStatement();

            //					global::System.Threading.Monitor.Enter(DataModelTransaction.syncRoot);
            tryLockStatement.TryStatements.Add(
                new CodeMethodInvokeExpression(
                    new CodeGlobalTypeReferenceExpression(typeof(Monitor)),
                    "Enter",
                    new CodeFieldReferenceExpression(
                        new CodeTypeReferenceExpression(String.Format("{0}Transaction", dataModelSchema.Name)),
                        "syncRoot")));

            //					global::System.Transactions.Transaction transaction = global::System.Transactions.Transaction.Current;
            tryLockStatement.TryStatements.Add(
                new CodeVariableDeclarationStatement(
                    new CodeGlobalTypeReference(typeof(Transaction)),
                    "transaction",
                    new CodePropertyReferenceExpression(new CodeGlobalTypeReferenceExpression(typeof(Transaction)), "Current")));

            //					string localIdentifier = transaction.TransactionInformation.LocalIdentifier;
            tryLockStatement.TryStatements.Add(
                new CodeVariableDeclarationStatement(
                    new CodeGlobalTypeReference(typeof(String)),
                    "localIdentifier",
                    new CodePropertyReferenceExpression(
                        new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("transaction"), "TransactionInformation"),
                        "LocalIdentifier")));

            //					DataModelTransaction dataModelTransaction;
            tryLockStatement.TryStatements.Add(
                new CodeVariableDeclarationStatement(
                    new CodeTypeReference(String.Format("{0}Transaction", dataModelSchema.Name)),
                    String.Format("{0}Transaction", CommonConversion.ToCamelCase(dataModelSchema.Name))));

            //					if (DataModelTransaction.transactionTable.TryGetValue(localIdentifier, out dataModelTransaction) == false)
            //					{
            CodeConditionStatement ifTransactionFound = new CodeConditionStatement(
                new CodeBinaryOperatorExpression(
                    new CodeMethodInvokeExpression(
                        new CodeFieldReferenceExpression(
                            new CodeTypeReferenceExpression(String.Format("{0}Transaction", dataModelSchema.Name)),
                            "transactionTable"),
                        "TryGetValue",
                        new CodeVariableReferenceExpression("localIdentifier"),
                        new CodeDirectionExpression(
                            FieldDirection.Out,
                            new CodeVariableReferenceExpression(String.Format("{0}Transaction", CommonConversion.ToCamelCase(dataModelSchema.Name))))),
                    CodeBinaryOperatorType.IdentityEquality,
                    new CodePrimitiveExpression(false)));

            //						dataModelTransaction = new DataModelTransaction();
            ifTransactionFound.TrueStatements.Add(
                new CodeAssignStatement(
                    new CodeVariableReferenceExpression(String.Format("{0}Transaction", CommonConversion.ToCamelCase(dataModelSchema.Name))),
                    new CodeObjectCreateExpression(
                        new CodeTypeReference(String.Format("{0}Transaction", dataModelSchema.Name)),
                        new CodeVariableReferenceExpression("transaction"))));

            //						transactionTable.Add(localIdentifier, dataModelTransaction);
            ifTransactionFound.TrueStatements.Add(
                new CodeMethodInvokeExpression(
                    new CodeVariableReferenceExpression("transactionTable"),
                    "Add",
                    new CodeVariableReferenceExpression("localIdentifier"),
                    new CodeVariableReferenceExpression(String.Format("{0}Transaction", CommonConversion.ToCamelCase(dataModelSchema.Name)))));

            //						transaction.TransactionCompleted += new global::System.Transactions.TransactionCompletedEventHandler(OnTransactionCompleted);
            ifTransactionFound.TrueStatements.Add(
                new CodeAttachEventStatement(
                    new CodeEventReferenceExpression(new CodeVariableReferenceExpression("transaction"), "TransactionCompleted"),
                    new CodeObjectCreateExpression(
                        new CodeGlobalTypeReference(typeof(TransactionCompletedEventHandler)),
                        new CodeMethodReferenceExpression(
                            new CodeTypeReferenceExpression(String.Format("{0}Transaction", dataModelSchema.Name)),
                            "OnTransactionCompleted"))));

            //					}
            tryLockStatement.TryStatements.Add(ifTransactionFound);

            //					return dataModelTransaction;
            tryLockStatement.TryStatements.Add(
                new CodeMethodReturnStatement(
                    new CodeVariableReferenceExpression(String.Format("{0}Transaction", CommonConversion.ToCamelCase(dataModelSchema.Name)))));

            //				}

            //				finally
            //				{
            //					global::System.Threading.Monitor.Exit(DataModelTransaction.syncRoot);
            tryLockStatement.FinallyStatements.Add(
                new CodeMethodInvokeExpression(
                    new CodeGlobalTypeReferenceExpression(typeof(Monitor)),
                    "Exit",
                    new CodeFieldReferenceExpression(
                        new CodeTypeReferenceExpression(String.Format("{0}Transaction", dataModelSchema.Name)),
                        "syncRoot")));

            //				}
            //			}
            //		}
            this.GetStatements.Add(tryLockStatement);

            //		}
        }
Ejemplo n.º 14
0
        private void ValidateConditionStatement(CodeConditionStatement e)
        {
            ValidateExpression(e.Condition);
            ValidateStatements(e.TrueStatements);

            CodeStatementCollection falseStatemetns = e.FalseStatements;
            if (falseStatemetns.Count > 0)
            {
                ValidateStatements(e.FalseStatements);
            }
        }
Ejemplo n.º 15
0
        public static CodeConditionStatement Else(this CodeConditionStatement condition, params CodeStatement [] codeStatements)
        {
            condition.FalseStatements.AddRange(codeStatements);

            return(condition);
        }
Ejemplo n.º 16
0
		private static void ImplementINotifyPropertyChanged(CodeTypeDeclaration decl)
		{
			decl.BaseTypes.Add(typeof(INotifyPropertyChanged));
			decl.Members.Add(new CodeMemberEvent()
							{
								Name = PropertyChangedEventName
							 ,
								Attributes = MemberAttributes.Public
							 ,
								Type = new CodeTypeReference(typeof(PropertyChangedEventHandler))
							});
			var notify = new CodeMemberMethod()
							{
								Name = PropertyChangedFunctionName
								,
								Attributes = MemberAttributes.Family

							};
			decl.Members.Add(notify);
			notify.Parameters.Add(new CodeParameterDeclarationExpression() { Name = PropertyNameParameterName, Type = new CodeTypeReference(typeof(string)) });
            notify.Statements.Add(new CodeVariableDeclarationStatement(new CodeTypeReference(typeof(PropertyChangedEventHandler)), EventHandlerName));
            notify.Statements.Add(new CodeAssignStatement() { Left = new CodeVariableReferenceExpression(EventHandlerName), Right = new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), PropertyChangedEventName) });
			var condition = new CodeConditionStatement()
			{
				Condition = new CodeBinaryOperatorExpression()
			  {
				  Left = new CodePrimitiveExpression(null)
				  ,
                  Right = new CodeVariableReferenceExpression(EventHandlerName)
				  ,
				  Operator = CodeBinaryOperatorType.IdentityInequality
			  }
			};
			var eventArgs = new CodeObjectCreateExpression() { CreateType = new CodeTypeReference(typeof(PropertyChangedEventArgs)) };
			eventArgs.Parameters.Add(new CodeVariableReferenceExpression(PropertyNameParameterName));

            var invoke = new CodeMethodInvokeExpression(null,EventHandlerName);
			invoke.Parameters.Add(new CodeThisReferenceExpression());
			invoke.Parameters.Add(eventArgs);
			condition.TrueStatements.Add(
					invoke
				);

			notify.Statements.Add(condition);
		}
Ejemplo n.º 17
0
        CodeMemberMethod ImplementFindView(CodeTypeReference typeForParent, CodeTypeReference typeForOverloadCall = null, Func <CodeVariableReferenceExpression, CodeExpression> constructParentViewCall = null)
        {
            CodeMemberMethod method = CreateMethod("__FindView", MethodAccessibility.Private, MethodScope.Final);

            // T __FindView<T> (int resourceId) where T: Android.Views.View
            var typeParam = new CodeTypeParameter("T");

            typeParam.Constraints.Add(new CodeTypeReference("Android.Views.View", CodeTypeReferenceOptions.GlobalReference));
            method.TypeParameters.Add(typeParam);
            method.Parameters.Add(new CodeParameterDeclarationExpression(typeForParent, "parentView"));
            method.Parameters.Add(new CodeParameterDeclarationExpression(typeof(int), "resourceId"));

            var tReference = new CodeTypeReference(typeParam);

            method.ReturnType = tReference;

            // T view = parentView.FindViewById<T> (resourceId);
            var parentViewRef    = new CodeVariableReferenceExpression("parentView");
            var resourceIdVarRef = new CodeVariableReferenceExpression("resourceId");

            if (typeForOverloadCall != null)
            {
                var findViewRef = new CodeMethodReferenceExpression(
                    new CodeThisReferenceExpression(),
                    "__FindView",
                    new [] { tReference }
                    );

                CodeExpression parentViewParam;
                if (constructParentViewCall != null)
                {
                    parentViewParam = constructParentViewCall(parentViewRef);
                }
                else
                {
                    parentViewParam = parentViewRef;
                }
                var findViewCall = new CodeMethodInvokeExpression(findViewRef, new CodeExpression [] { parentViewParam, resourceIdVarRef });
                method.Statements.Add(new CodeMethodReturnStatement(findViewCall));

                return(method);
            }

            var findByIdRef = new CodeMethodReferenceExpression(
                parentViewRef,
                "FindViewById",
                new [] { tReference }
                );

            var findByIdInvoke = new CodeMethodInvokeExpression(findByIdRef, new [] { resourceIdVarRef });
            var viewVar        = new CodeVariableDeclarationStatement(tReference, "view", findByIdInvoke);

            method.Statements.Add(viewVar);

            // if (view == null) {
            //     OnLayoutViewNotFound (resourceId, ref view);
            // }
            // if (view != null)
            //     return view;
            // throw new System.InvalidOperationException($"View not found (ID: {resourceId})");

            var viewVarRef    = new CodeVariableReferenceExpression("view");
            var ifViewNotNull = new CodeConditionStatement(
                new CodeBinaryOperatorExpression(viewVarRef, CodeBinaryOperatorType.IdentityInequality, new CodePrimitiveExpression(null)),
                new CodeStatement [] { new CodeMethodReturnStatement(viewVarRef) }
                );

            var viewRefParam       = new CodeDirectionExpression(FieldDirection.Ref, viewVarRef);
            var viewNotFoundInvoke = new CodeMethodInvokeExpression(
                new CodeThisReferenceExpression(),
                "OnLayoutViewNotFound",
                new CodeExpression [] { resourceIdVarRef, viewRefParam }
                );

            var ifViewNull = new CodeConditionStatement(
                new CodeBinaryOperatorExpression(viewVarRef, CodeBinaryOperatorType.IdentityEquality, new CodePrimitiveExpression(null)),
                new CodeStatement [] { new CodeExpressionStatement(viewNotFoundInvoke) }
                );

            method.Statements.Add(ifViewNull);
            method.Statements.Add(ifViewNotNull);

            var throwInvOp = new CodeThrowExceptionStatement(
                new CodeObjectCreateExpression(
                    new CodeTypeReference(typeof(InvalidOperationException), CodeTypeReferenceOptions.GlobalReference),
                    new [] { new CodeSnippetExpression("$\"View not found (ID: {resourceId})\"") }
                    )
                );

            method.Statements.Add(throwInvOp);

            return(method);
        }
 private static CodeMemberMethod CreateOperationCompletedMethod(ServiceContractGenerationContext context, CodeTypeDeclaration clientType, string syncMethodName, CodeTypeDeclaration operationCompletedEventArgsType, CodeMemberEvent operationCompletedEvent)
 {
     CodeObjectCreateExpression expression;
     CodeMemberMethod method = new CodeMemberMethod();
     method.Attributes = MemberAttributes.Private;
     method.Name = NamingHelper.GetUniqueName(GetOperationCompletedMethodName(syncMethodName), new NamingHelper.DoesNameExist(ClientClassGenerator.DoesMethodNameExist), context.Operations);
     method.Parameters.Add(new CodeParameterDeclarationExpression(new CodeTypeReference(objectType), "state"));
     method.ReturnType = new CodeTypeReference(voidType);
     CodeVariableDeclarationStatement statement = new CodeVariableDeclarationStatement(invokeAsyncCompletedEventArgsTypeName, "e");
     statement.InitExpression = new CodeCastExpression(invokeAsyncCompletedEventArgsTypeName, new CodeArgumentReferenceExpression(method.Parameters[0].Name));
     CodeVariableReferenceExpression targetObject = new CodeVariableReferenceExpression(statement.Name);
     if (operationCompletedEventArgsType != null)
     {
         expression = new CodeObjectCreateExpression(operationCompletedEventArgsType.Name, new CodeExpression[] { new CodePropertyReferenceExpression(targetObject, EventArgsPropertyNames[0]), new CodePropertyReferenceExpression(targetObject, EventArgsPropertyNames[1]), new CodePropertyReferenceExpression(targetObject, EventArgsPropertyNames[2]), new CodePropertyReferenceExpression(targetObject, EventArgsPropertyNames[3]) });
     }
     else
     {
         expression = new CodeObjectCreateExpression(asyncCompletedEventArgsType, new CodeExpression[] { new CodePropertyReferenceExpression(targetObject, EventArgsPropertyNames[1]), new CodePropertyReferenceExpression(targetObject, EventArgsPropertyNames[2]), new CodePropertyReferenceExpression(targetObject, EventArgsPropertyNames[3]) });
     }
     CodeEventReferenceExpression expression3 = new CodeEventReferenceExpression(new CodeThisReferenceExpression(), operationCompletedEvent.Name);
     CodeDelegateInvokeExpression expression4 = new CodeDelegateInvokeExpression(expression3, new CodeExpression[] { new CodeThisReferenceExpression(), expression });
     CodeConditionStatement statement2 = new CodeConditionStatement(new CodeBinaryOperatorExpression(expression3, CodeBinaryOperatorType.IdentityInequality, new CodePrimitiveExpression(null)), new CodeStatement[] { statement, new CodeExpressionStatement(expression4) });
     method.Statements.Add(statement2);
     clientType.Members.Add(method);
     return method;
 }
Ejemplo n.º 19
0
        CodeMemberMethod ImplementFindFragment(CodeTypeReference typeForParent, CodeTypeReference typeForOverloadCall = null, Func <CodeVariableReferenceExpression, CodeExpression> constructParentViewCall = null)
        {
            CodeMemberMethod method = CreateMethod("__FindFragment", MethodAccessibility.Private, MethodScope.Final);

            var typeParam = new CodeTypeParameter("T")
            {
                Constraints =
                {
                    new CodeTypeReference("Android.App.Fragment", CodeTypeReferenceOptions.GlobalReference),
                },
            };

            method.TypeParameters.Add(typeParam);
            method.Parameters.Add(new CodeParameterDeclarationExpression(typeForParent, "activity"));
            method.Parameters.Add(new CodeParameterDeclarationExpression(typeof(int), "id"));

            var tReference = new CodeTypeReference(typeParam);

            method.ReturnType = tReference;

            // T fragment = FragmentManager.FindFragmentById<T> (id);
            var id = new CodeVariableReferenceExpression("id");

            var findByIdRef = new CodeMethodReferenceExpression(
                new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("activity"), "FragmentManager"),
                "FindFragmentById",
                new[] { tReference }
                );

            var findByIdInvoke = new CodeMethodInvokeExpression(findByIdRef, new[] { id });
            var viewVar        = new CodeVariableDeclarationStatement(tReference, "fragment", findByIdInvoke);

            method.Statements.Add(viewVar);

            // if (view == null) {
            //     OnLayoutFragmentNotFound (resourceId, ref view);
            // }
            // if (view != null)
            //     return view;
            // throw new System.InvalidOperationException($"Fragment not found (ID: {id})");

            var viewVarRef    = new CodeVariableReferenceExpression("fragment");
            var ifViewNotNull = new CodeConditionStatement(
                new CodeBinaryOperatorExpression(viewVarRef, CodeBinaryOperatorType.IdentityInequality, new CodePrimitiveExpression(null)),
                new CodeStatement[] { new CodeMethodReturnStatement(viewVarRef) }
                );

            var viewRefParam       = new CodeDirectionExpression(FieldDirection.Ref, viewVarRef);
            var viewNotFoundInvoke = new CodeMethodInvokeExpression(
                new CodeThisReferenceExpression(),
                "OnLayoutFragmentNotFound",
                new CodeExpression[] { id, viewRefParam }
                );

            var ifViewNull = new CodeConditionStatement(
                new CodeBinaryOperatorExpression(viewVarRef, CodeBinaryOperatorType.IdentityEquality, new CodePrimitiveExpression(null)),
                new CodeStatement[] { new CodeExpressionStatement(viewNotFoundInvoke) }
                );

            method.Statements.Add(ifViewNull);
            method.Statements.Add(ifViewNotNull);

            var throwInvOp = new CodeThrowExceptionStatement(
                new CodeObjectCreateExpression(
                    new CodeTypeReference(typeof(InvalidOperationException), CodeTypeReferenceOptions.GlobalReference),
                    new[] { new CodeSnippetExpression("$\"Fragment not found (ID: {id})\"") }
                    )
                );

            method.Statements.Add(throwInvOp);

            return(method);
        }
Ejemplo n.º 20
0
        public void Goto()
        {
            CodeNamespace ns = new CodeNamespace("NS");
            ns.Imports.Add(new CodeNamespaceImport("System"));

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

            // create first method to test gotos that jump ahead to a defined label with statement
            var cmm = new CodeMemberMethod();
            cmm.Name = "FirstMethod";
            cmm.ReturnType = new CodeTypeReference(typeof(int));
            cmm.Attributes = MemberAttributes.Public | MemberAttributes.Static;
            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))));
            class1.Members.Add(cmm);

            // create second method to test gotos that jump ahead to a defined label without a statement attached to it
            cmm = new CodeMemberMethod();
            cmm.Name = "SecondMethod";
            cmm.ReturnType = new CodeTypeReference(typeof(int));
            cmm.Attributes = MemberAttributes.Public | MemberAttributes.Static;
            param = new CodeParameterDeclarationExpression(typeof(int), "i");
            cmm.Parameters.Add(param);
            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"));
            cmm.Statements.Add(new CodeMethodReturnStatement(new CodePrimitiveExpression(7)));
            class1.Members.Add(cmm);

            // create third method to test gotos that jump to a previously defined label
            cmm = new CodeMemberMethod();
            cmm.Name = "ThirdMethod";
            cmm.ReturnType = new CodeTypeReference(typeof(int));
            cmm.Attributes = MemberAttributes.Public | MemberAttributes.Static;
            param = new CodeParameterDeclarationExpression(typeof(int), "i");
            cmm.Parameters.Add(param);
            CodeAssignStatement assignmt = new CodeAssignStatement(new CodeVariableReferenceExpression("i"),
                                new CodeBinaryOperatorExpression
                                (new CodeVariableReferenceExpression("i"), CodeBinaryOperatorType.Add,
                                new CodePrimitiveExpression(5)));
            cmm.Statements.Add(new CodeLabeledStatement("label", assignmt));
            condstmt = new CodeConditionStatement(new CodeBinaryOperatorExpression(
                                new CodeVariableReferenceExpression("i"), CodeBinaryOperatorType.LessThan, new CodePrimitiveExpression(1)),
                                new CodeGotoStatement("label"));
            cmm.Statements.Add(condstmt);
            cmm.Statements.Add(new CodeMethodReturnStatement(new CodeVariableReferenceExpression("i")));
            class1.Members.Add(cmm);

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

                      public class Test {
                          public static int FirstMethod(int i) {
                              if ((i < 1)) {
                                  goto comehere;
                              }
                              return 6;
                          comehere:
                              return 7;
                          }

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

                          public static int ThirdMethod(int i) {
                          label:
                              i = (i + 5);
                              if ((i < 1)) {
                                  goto label;
                              }
                              return i;
                          }
                      }
                  }");
        }
        private void CreateRemoveClaimMethod(CodeTypeDeclaration type)
        {
            CodeMemberMethod method = new CodeMemberMethod();

            method.ReturnType = new CodeTypeReference(typeof(Task));
            method.Attributes = MemberAttributes.Public;
            method.Name       = "RemoveClaimAsync";
            method.Parameters.Add(new CodeParameterDeclarationExpression(IdentityRole.ClrFullTypeName, "role"));
            method.Parameters.Add(new CodeParameterDeclarationExpression(typeof(Claim), "claim"));

            method.ImplementationTypes.Add(GetGenericInterfaceType("Microsoft.AspNet.Identity.IRoleClaimStore", false));

            method.Statements.Add(CodeDomUtilities.CreateParameterThrowIfNull("role"));
            method.Statements.Add(CodeDomUtilities.CreateParameterThrowIfNull("claim"));

            /*
             * List<RoleClaim> toDelete = new List<RoleClaim>();
             * foreach (var roleClaim in role.Claims)
             * {
             *  if (roleClaim.Equals(claim))
             *  {
             *      toDelete.Add(roleClaim);
             *  }
             * }*/
            method.Statements.Add(new CodeVariableDeclarationStatement(CodeDomUtilities.GetGenericType(typeof(IList <>), IdentityRoleClaim.ClrFullTypeName), "toDelete", new CodeObjectCreateExpression(CodeDomUtilities.GetGenericType(typeof(List <>), IdentityRoleClaim.ClrFullTypeName))));

            var roleClaimsEnumerator = CodeDomUtilities.GetUniqueVariable(method, CodeDomUtilities.GetGenericType(typeof(IEnumerator <>), IdentityRoleClaim.ClrFullTypeName), "enumerator");

            roleClaimsEnumerator.InitExpression = new CodeMethodInvokeExpression(new CodePropertyReferenceExpression(new CodeArgumentReferenceExpression("role"), IdentityRole.ClaimsProperty.Name), "GetEnumerator");

            var roleClaimsIteration = new CodeIterationStatement();

            roleClaimsIteration.InitStatement      = roleClaimsEnumerator;
            roleClaimsIteration.TestExpression     = new CodeMethodInvokeExpression(new CodeVariableReferenceExpression(roleClaimsEnumerator.Name), "MoveNext");
            roleClaimsIteration.IncrementStatement = new CodeSnippetStatement("");
            method.Statements.Add(roleClaimsIteration);

            roleClaimsIteration.Statements.Add(new CodeVariableDeclarationStatement(IdentityRoleClaim.ClrFullTypeName, "roleClaim", new CodePropertyReferenceExpression(new CodeVariableReferenceExpression(roleClaimsEnumerator.Name), "Current")));
            CodeConditionStatement claimsEqual = new CodeConditionStatement();

            roleClaimsIteration.Statements.Add(claimsEqual);
            claimsEqual.Condition = CreateStringEqualsExpression(StringComparison.OrdinalIgnoreCase,
                                                                 new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("roleClaim"), IdentityRoleClaim.TypeProperty.Name),
                                                                 new CodePropertyReferenceExpression(new CodeArgumentReferenceExpression("claim"), "Type"));

            if (IdentityRoleClaim.ValueProperty.GetAttributeValue("isComparer", Constants.NamespaceUri, true))
            {
                claimsEqual.Condition = new CodeBinaryOperatorExpression(claimsEqual.Condition, CodeBinaryOperatorType.BooleanAnd,
                                                                         CreateStringEqualsExpression(StringComparison.OrdinalIgnoreCase,
                                                                                                      new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("roleClaim"), IdentityRoleClaim.TypeProperty.Name),
                                                                                                      new CodePropertyReferenceExpression(new CodeArgumentReferenceExpression("claim"), "Type")));
            }

            if (IdentityRoleClaim.ValueTypeProperty != null && IdentityRoleClaim.ValueTypeProperty.GetAttributeValue("isComparer", Constants.NamespaceUri, false))
            {
                claimsEqual.Condition = new CodeBinaryOperatorExpression(claimsEqual.Condition, CodeBinaryOperatorType.BooleanAnd,
                                                                         CreateStringEqualsExpression(StringComparison.OrdinalIgnoreCase,
                                                                                                      new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("roleClaim"), IdentityRoleClaim.ValueTypeProperty.Name),
                                                                                                      new CodePropertyReferenceExpression(new CodeArgumentReferenceExpression("claim"), "ValueType")));
            }

            if (IdentityRoleClaim.IssuerProperty != null && IdentityRoleClaim.IssuerProperty.GetAttributeValue("isComparer", Constants.NamespaceUri, false))
            {
                claimsEqual.Condition = new CodeBinaryOperatorExpression(claimsEqual.Condition, CodeBinaryOperatorType.BooleanAnd,
                                                                         CreateStringEqualsExpression(StringComparison.OrdinalIgnoreCase,
                                                                                                      new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("roleClaim"), IdentityRoleClaim.IssuerProperty.Name),
                                                                                                      new CodePropertyReferenceExpression(new CodeArgumentReferenceExpression("claim"), "Issuer")));
            }

            if (IdentityRoleClaim.OriginalIssuerProperty != null && IdentityRoleClaim.OriginalIssuerProperty.GetAttributeValue("isComparer", Constants.NamespaceUri, false))
            {
                claimsEqual.Condition = new CodeBinaryOperatorExpression(claimsEqual.Condition, CodeBinaryOperatorType.BooleanAnd,
                                                                         CreateStringEqualsExpression(StringComparison.OrdinalIgnoreCase,
                                                                                                      new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("roleClaim"), IdentityRoleClaim.OriginalIssuerProperty.Name),
                                                                                                      new CodePropertyReferenceExpression(new CodeArgumentReferenceExpression("claim"), "OriginalIssuer")));
            }

            claimsEqual.TrueStatements.Add(new CodeMethodInvokeExpression(new CodeVariableReferenceExpression("toDelete"), "Add", new CodeVariableReferenceExpression("roleClaim")));

            /*
             * foreach (var roleClaim in toDelete)
             * {
             *  roleClaim.Delete();
             *  role.Claims.Remove(roleClaim);
             * }
             */

            var toDeleteEnumerator = CodeDomUtilities.GetUniqueVariable(method, CodeDomUtilities.GetGenericType(typeof(IEnumerator <>), IdentityRoleClaim.ClrFullTypeName), "enumerator");

            toDeleteEnumerator.InitExpression = new CodeMethodInvokeExpression(new CodeVariableReferenceExpression("toDelete"), "GetEnumerator");

            var toDeleteIteration = new CodeIterationStatement();

            toDeleteIteration.InitStatement      = toDeleteEnumerator;
            toDeleteIteration.TestExpression     = new CodeMethodInvokeExpression(new CodeVariableReferenceExpression(toDeleteEnumerator.Name), "MoveNext");
            toDeleteIteration.IncrementStatement = new CodeSnippetStatement("");
            method.Statements.Add(toDeleteIteration);

            toDeleteIteration.Statements.Add(new CodeVariableDeclarationStatement(IdentityRoleClaim.ClrFullTypeName, "roleClaim", new CodePropertyReferenceExpression(new CodeVariableReferenceExpression(toDeleteEnumerator.Name), "Current")));
            toDeleteIteration.Statements.Add(new CodeMethodInvokeExpression(new CodeVariableReferenceExpression("roleClaim"), "Delete"));
            toDeleteIteration.Statements.Add(new CodeMethodInvokeExpression(new CodePropertyReferenceExpression(new CodeArgumentReferenceExpression("role"), IdentityRole.ClaimsProperty.Name), "Remove", new CodeVariableReferenceExpression("roleClaim")));

            method.Statements.Add(CreateEmptyTaskResult());
            type.Members.Add(method);
        }
Ejemplo n.º 22
0
 /// <summary>
 /// 条件语句
 /// </summary>
 public void AddConditionStatement(CodeConditionStatement inStatement)
 {
     methodList[0].Method.Statements.Add(inStatement);
 }
Ejemplo n.º 23
0
        void AddAsyncMembers(string messageName, CodeMemberMethod method)
        {
            CodeThisReferenceExpression ethis = new CodeThisReferenceExpression();
            CodePrimitiveExpression     enull = new CodePrimitiveExpression(null);

            CodeMemberField codeField = new CodeMemberField(typeof(System.Threading.SendOrPostCallback), messageName + "OperationCompleted");

            codeField.Attributes = MemberAttributes.Private;
            CodeTypeDeclaration.Members.Add(codeField);

            // Event arguments class

            string argsClassName          = classNames.AddUnique(messageName + "CompletedEventArgs", null);
            CodeTypeDeclaration argsClass = new CodeTypeDeclaration(argsClassName);

            argsClass.Attributes |= MemberAttributes.Public;
#if NET_2_0
            argsClass.IsPartial = true;
#endif
            argsClass.BaseTypes.Add(new CodeTypeReference("System.ComponentModel.AsyncCompletedEventArgs"));

            CodeMemberField resultsField = new CodeMemberField(typeof(object[]), "results");
            resultsField.Attributes = MemberAttributes.Private;
            argsClass.Members.Add(resultsField);

            CodeConstructor cc = new CodeConstructor();
            cc.Attributes = MemberAttributes.Assembly;
            cc.Parameters.Add(new CodeParameterDeclarationExpression(typeof(object[]), "results"));
            cc.Parameters.Add(new CodeParameterDeclarationExpression(typeof(System.Exception), "exception"));
            cc.Parameters.Add(new CodeParameterDeclarationExpression(typeof(bool), "cancelled"));
            cc.Parameters.Add(new CodeParameterDeclarationExpression(typeof(object), "userState"));
            cc.BaseConstructorArgs.Add(new CodeVariableReferenceExpression("exception"));
            cc.BaseConstructorArgs.Add(new CodeVariableReferenceExpression("cancelled"));
            cc.BaseConstructorArgs.Add(new CodeVariableReferenceExpression("userState"));
            CodeExpression thisResults = new CodeFieldReferenceExpression(ethis, "results");
            cc.Statements.Add(new CodeAssignStatement(thisResults, new CodeVariableReferenceExpression("results")));
            argsClass.Members.Add(cc);

            int ind = 0;

            if (method.ReturnType.BaseType != "System.Void")
            {
                argsClass.Members.Add(CreateArgsProperty(method.ReturnType, "Result", ind++));
            }

            foreach (CodeParameterDeclarationExpression par in method.Parameters)
            {
                if (par.Direction == FieldDirection.Out || par.Direction == FieldDirection.Ref)
                {
                    argsClass.Members.Add(CreateArgsProperty(par.Type, par.Name, ind++));
                }
            }

            bool needsArgsClass = (ind > 0);
            if (needsArgsClass)
            {
                asyncTypes.Add(argsClass);
            }
            else
            {
                argsClassName = "System.ComponentModel.AsyncCompletedEventArgs";
            }

            // Event delegate type

            CodeTypeDelegate delegateType = new CodeTypeDelegate(messageName + "CompletedEventHandler");
            delegateType.Attributes |= MemberAttributes.Public;
            delegateType.Parameters.Add(new CodeParameterDeclarationExpression(typeof(object), "sender"));
            delegateType.Parameters.Add(new CodeParameterDeclarationExpression(argsClassName, "args"));

            // Event member

            CodeMemberEvent codeEvent = new CodeMemberEvent();
            codeEvent.Attributes = codeEvent.Attributes & ~MemberAttributes.AccessMask | MemberAttributes.Public;
            codeEvent.Name       = messageName + "Completed";
            codeEvent.Type       = new CodeTypeReference(delegateType.Name);
            CodeTypeDeclaration.Members.Add(codeEvent);

            // Async method (without user state param)

            CodeMemberMethod am = new CodeMemberMethod();
            am.Attributes = MemberAttributes.Public | MemberAttributes.Final;
            am.Name       = method.Name + "Async";
            am.ReturnType = new CodeTypeReference(typeof(void));
            CodeMethodInvokeExpression inv;
            inv = new CodeMethodInvokeExpression(ethis, am.Name);
            am.Statements.Add(inv);

            // On...Completed method

            CodeMemberMethod onCompleted = new CodeMemberMethod();
            onCompleted.Name       = "On" + messageName + "Completed";
            onCompleted.Attributes = MemberAttributes.Private | MemberAttributes.Final;
            onCompleted.ReturnType = new CodeTypeReference(typeof(void));
            onCompleted.Parameters.Add(new CodeParameterDeclarationExpression(typeof(object), "arg"));

            CodeConditionStatement anIf = new CodeConditionStatement();

            CodeExpression eventField = new CodeEventReferenceExpression(ethis, codeEvent.Name);
            anIf.Condition = new CodeBinaryOperatorExpression(eventField, CodeBinaryOperatorType.IdentityInequality, enull);
            CodeExpression castedArg  = new CodeCastExpression(typeof(System.Web.Services.Protocols.InvokeCompletedEventArgs), new CodeVariableReferenceExpression("arg"));
            CodeStatement  invokeArgs = new CodeVariableDeclarationStatement(typeof(System.Web.Services.Protocols.InvokeCompletedEventArgs), "invokeArgs", castedArg);
            anIf.TrueStatements.Add(invokeArgs);

            CodeDelegateInvokeExpression delegateInvoke = new CodeDelegateInvokeExpression();
            delegateInvoke.TargetObject = eventField;
            delegateInvoke.Parameters.Add(ethis);
            CodeObjectCreateExpression argsInstance  = new CodeObjectCreateExpression(argsClassName);
            CodeExpression             invokeArgsVar = new CodeVariableReferenceExpression("invokeArgs");
            if (needsArgsClass)
            {
                argsInstance.Parameters.Add(new CodeFieldReferenceExpression(invokeArgsVar, "Results"));
            }
            argsInstance.Parameters.Add(new CodeFieldReferenceExpression(invokeArgsVar, "Error"));
            argsInstance.Parameters.Add(new CodeFieldReferenceExpression(invokeArgsVar, "Cancelled"));
            argsInstance.Parameters.Add(new CodeFieldReferenceExpression(invokeArgsVar, "UserState"));
            delegateInvoke.Parameters.Add(argsInstance);
            anIf.TrueStatements.Add(delegateInvoke);

            onCompleted.Statements.Add(anIf);

            // Async method

            CodeMemberMethod asyncMethod = new CodeMemberMethod();
            asyncMethod.Attributes = MemberAttributes.Public | MemberAttributes.Final;
            asyncMethod.Name       = method.Name + "Async";
            asyncMethod.ReturnType = new CodeTypeReference(typeof(void));

            CodeExpression delegateField = new CodeFieldReferenceExpression(ethis, codeField.Name);
            anIf           = new CodeConditionStatement();
            anIf.Condition = new CodeBinaryOperatorExpression(delegateField, CodeBinaryOperatorType.IdentityEquality, enull);;
            CodeExpression      delegateRef = new CodeMethodReferenceExpression(ethis, onCompleted.Name);
            CodeExpression      newDelegate = new CodeObjectCreateExpression(typeof(System.Threading.SendOrPostCallback), delegateRef);
            CodeAssignStatement cas         = new CodeAssignStatement(delegateField, newDelegate);
            anIf.TrueStatements.Add(cas);
            asyncMethod.Statements.Add(anIf);

            CodeArrayCreateExpression paramsArray = new CodeArrayCreateExpression(typeof(object));

            // Assign parameters

            CodeIdentifiers paramsIds = new CodeIdentifiers();

            foreach (CodeParameterDeclarationExpression par in method.Parameters)
            {
                paramsIds.Add(par.Name, null);
                if (par.Direction == FieldDirection.In || par.Direction == FieldDirection.Ref)
                {
                    CodeParameterDeclarationExpression inpar = new CodeParameterDeclarationExpression(par.Type, par.Name);
                    am.Parameters.Add(inpar);
                    asyncMethod.Parameters.Add(inpar);
                    inv.Parameters.Add(new CodeVariableReferenceExpression(par.Name));
                    paramsArray.Initializers.Add(new CodeVariableReferenceExpression(par.Name));
                }
            }


            inv.Parameters.Add(enull);

            string userStateName = paramsIds.AddUnique("userState", null);
            asyncMethod.Parameters.Add(new CodeParameterDeclarationExpression(typeof(object), userStateName));

            CodeExpression userStateVar = new CodeVariableReferenceExpression(userStateName);
            asyncMethod.Statements.Add(BuildInvokeAsync(messageName, paramsArray, delegateField, userStateVar));

            CodeTypeDeclaration.Members.Add(am);
            CodeTypeDeclaration.Members.Add(asyncMethod);
            CodeTypeDeclaration.Members.Add(onCompleted);

            asyncTypes.Add(delegateType);
        }
Ejemplo n.º 24
0
    public override void BuildTree (CodeDomProvider provider, CodeCompileUnit cu) {

        // GENERATES (C#):
        //
        //  namespace NSPC {
        //      
        //      
        //      public class ClassWithMethod {
        //          
        //          public int TestBasicIterationStatement() {
        //              int i;
        //              for (i = 1; (i < 8); i = (i * 2)) {
        //              }
        //              return i;
        //          }
        //          
        //          public int TestComplexIterationStatement() {
        //              int i;
        //              int a = 7;
        //              int b;
        //              int c = 9;
        //              int d = 2;
        //              for (i = 0; (i < 2); i = (i + 1)) {
        //                  if ((a < 16)) {
        //                      for (b = 0; (b < 2); b = (b + 1)) {
        //                          if ((c < 10)) {
        //                              d = (d - 1);
        //                          }
        //                          d = (d * 2);
        //                      }
        //                  }
        //              }
        //              return d;
        //          }
        //      }
        //  }

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

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

        AddScenario ("CheckTestBasicIterationStatement");
        CodeMemberMethod cmm = new CodeMemberMethod ();
        cmm.Name = "TestBasicIterationStatement";
        cmm.Attributes = MemberAttributes.Public;
        cmm.Statements.Add (new CodeVariableDeclarationStatement (new CodeTypeReference (typeof (int)), "i"));
        cmm.Statements.Add (new CodeIterationStatement (new CodeAssignStatement (new
            CodeVariableReferenceExpression ("i"), new CodePrimitiveExpression (1)),
            new CodeBinaryOperatorExpression (new CodeVariableReferenceExpression ("i"),
            CodeBinaryOperatorType.LessThan, new CodePrimitiveExpression (8)),
            new CodeAssignStatement (new CodeVariableReferenceExpression ("i"),
            new CodeBinaryOperatorExpression (new CodeVariableReferenceExpression ("i"), CodeBinaryOperatorType.Multiply,
            new CodePrimitiveExpression (2)))));
        cmm.ReturnType = new CodeTypeReference (typeof (int));
        cmm.Statements.Add (new CodeMethodReturnStatement (new CodeVariableReferenceExpression ("i")));
        class1.Members.Add (cmm);

        AddScenario ("CheckTestComplexIterationStatement");
        cmm = new CodeMemberMethod ();
        cmm.Name = "TestComplexIterationStatement";
        cmm.Attributes = MemberAttributes.Public;
        cmm.ReturnType = new CodeTypeReference (typeof (int));
        cmm.Statements.Add (new CodeVariableDeclarationStatement (new CodeTypeReference (typeof (int)), "i"));
        cmm.Statements.Add (new CodeVariableDeclarationStatement (new CodeTypeReference (typeof (int)), "a", new CodePrimitiveExpression (7)));
        cmm.Statements.Add (new CodeVariableDeclarationStatement (new CodeTypeReference (typeof (int)), "b"));
        cmm.Statements.Add (new CodeVariableDeclarationStatement (new CodeTypeReference (typeof (int)), "c", new CodePrimitiveExpression (9)));
        cmm.Statements.Add (new CodeVariableDeclarationStatement (new CodeTypeReference (typeof (int)), "d", new CodePrimitiveExpression (2)));
        CodeIterationStatement iteration = new CodeIterationStatement ();
        iteration.IncrementStatement = new CodeAssignStatement (new CodeVariableReferenceExpression ("i")
            , new CodeBinaryOperatorExpression (new CodeVariableReferenceExpression ("i"), CodeBinaryOperatorType.Add,
            new CodePrimitiveExpression (1)));
        iteration.InitStatement = new CodeAssignStatement (new CodeVariableReferenceExpression ("i"), new
            CodePrimitiveExpression (0));
        iteration.TestExpression = (new CodeBinaryOperatorExpression (new CodeVariableReferenceExpression ("i"),
            CodeBinaryOperatorType.LessThan, new CodePrimitiveExpression (2)));
        CodeConditionStatement secondIf = new CodeConditionStatement (new CodeBinaryOperatorExpression (
            new CodeVariableReferenceExpression ("c"), CodeBinaryOperatorType.LessThan, new CodePrimitiveExpression (10)),
            new CodeAssignStatement (new CodeVariableReferenceExpression ("d"), new CodeBinaryOperatorExpression (
            new CodeVariableReferenceExpression ("d"), CodeBinaryOperatorType.Subtract, new CodePrimitiveExpression (1))));

        CodeIterationStatement secondFor = new CodeIterationStatement ();
        secondFor.Statements.Add (secondIf);
        secondFor.IncrementStatement = new CodeAssignStatement (new CodeVariableReferenceExpression ("b")
            , new CodeBinaryOperatorExpression (new CodeVariableReferenceExpression ("b"), CodeBinaryOperatorType.Add,
            new CodePrimitiveExpression (1)));
        secondFor.InitStatement = new CodeAssignStatement (new CodeVariableReferenceExpression ("b"), new
            CodePrimitiveExpression (0));
        secondFor.TestExpression = (new CodeBinaryOperatorExpression (new CodeVariableReferenceExpression ("b"),
            CodeBinaryOperatorType.LessThan, new CodePrimitiveExpression (2)));
        secondFor.Statements.Add (new CodeAssignStatement (new CodeVariableReferenceExpression ("d"),
            new CodeBinaryOperatorExpression (new CodeVariableReferenceExpression ("d"), CodeBinaryOperatorType.Multiply,
            new CodePrimitiveExpression (2))));

        CodeConditionStatement firstIf = new CodeConditionStatement ();
        firstIf.Condition = new CodeBinaryOperatorExpression (new CodeVariableReferenceExpression ("a"), CodeBinaryOperatorType.LessThan,
            new CodePrimitiveExpression (16));
        firstIf.TrueStatements.Add (secondFor);


        iteration.Statements.Add (firstIf);
        cmm.Statements.Add (iteration);
        cmm.Statements.Add (new CodeMethodReturnStatement (new CodeVariableReferenceExpression ("d")));
        class1.Members.Add (cmm);

    }
        /* Utility methods for <object> stuff */
        protected void CreateApplicationOrSessionPropertyForObject(Type type,
                                                                   string propName,
                                                                   bool isApplication,
                                                                   bool isPublic)
        {
            /* if isApplication this generates (the 'cachedapp' field is created earlier):
             * private MyNS.MyClass app {
             *      get {
             *              if ((this.cachedapp == null)) {
             *                      this.cachedapp = ((MyNS.MyClass)
             *                              (this.Application.StaticObjects.GetObject("app")));
             *              }
             *              return this.cachedapp;
             *      }
             * }
             *
             * else, this is for Session:
             * private MyNS.MyClass ses {
             *      get {
             *              return ((MyNS.MyClass) (this.Session.StaticObjects.GetObject("ses")));
             *      }
             * }
             *
             */

            CodeExpression result = null;

            CodeMemberProperty prop = new CodeMemberProperty();

            prop.Type = new CodeTypeReference(type);
            prop.Name = propName;
            if (isPublic)
            {
                prop.Attributes = MemberAttributes.Public | MemberAttributes.Final;
            }
            else
            {
                prop.Attributes = MemberAttributes.Private | MemberAttributes.Final;
            }

            CodePropertyReferenceExpression p1;

            if (isApplication)
            {
                p1 = new CodePropertyReferenceExpression(thisRef, "Application");
            }
            else
            {
                p1 = new CodePropertyReferenceExpression(thisRef, "Session");
            }

            CodePropertyReferenceExpression p2;

            p2 = new CodePropertyReferenceExpression(p1, "StaticObjects");

            CodeMethodReferenceExpression getobject;

            getobject = new CodeMethodReferenceExpression(p2, "GetObject");

            CodeMethodInvokeExpression invoker;

            invoker = new CodeMethodInvokeExpression(getobject,
                                                     new CodePrimitiveExpression(propName));

            CodeCastExpression cast = new CodeCastExpression(prop.Type, invoker);

            if (isApplication)
            {
                CodeFieldReferenceExpression field;
                field = new CodeFieldReferenceExpression(thisRef, "cached" + propName);

                CodeConditionStatement stmt = new CodeConditionStatement();
                stmt.Condition = new CodeBinaryOperatorExpression(field,
                                                                  CodeBinaryOperatorType.IdentityEquality,
                                                                  new CodePrimitiveExpression(null));

                CodeAssignStatement assign = new CodeAssignStatement();
                assign.Left  = field;
                assign.Right = cast;
                stmt.TrueStatements.Add(assign);
                prop.GetStatements.Add(stmt);
                result = field;
            }
            else
            {
                result = cast;
            }

            prop.GetStatements.Add(new CodeMethodReturnStatement(result));
            mainClass.Members.Add(prop);
        }
Ejemplo n.º 26
0
        /// <summary>
        /// Creates a method to handle moving the deleted records from the active data model to the deleted data model.
        /// </summary>
        /// <param name="schema">The data model schema.</param>
        public ReadDataModelMethod(DataModelSchema dataModelSchema)
        {
            // These variable are used to create a connection to the server.
            String clientTypeName     = String.Format("{0}Client", dataModelSchema.Name);
            String endpointName       = String.Format("{0}Endpoint", dataModelSchema.Name);
            String clientVariableName = CommonConversion.ToCamelCase(clientTypeName);

            //		/// <summary>
            //		/// This thread will periodically reconcile the client data model with the server's.
            //		/// </summary>
            //		private static void ReadDataModel()
            //		{
            this.Comments.Add(new CodeCommentStatement("<summary>", true));
            this.Comments.Add(new CodeCommentStatement("This thread will periodically reconcile the client data model with the server's.", true));
            this.Comments.Add(new CodeCommentStatement("</summary>", true));
            this.CustomAttributes.AddRange(new CodeCustomAttributesForMethods());
            this.Attributes = MemberAttributes.Private | MemberAttributes.Static;
            this.Name       = "ReadDataModel";

            //			DataModelClient dataModelClient = new DataModelClient(Teraque.AssetNetwork.Properties.Settings.Default.DataModelEndpoint);
            this.Statements.Add(
                new CodeVariableDeclarationStatement(
                    new CodeTypeReference(clientTypeName),
                    clientVariableName,
                    new CodeObjectCreateExpression(
                        new CodeTypeReference(clientTypeName),
                        new CodePropertyReferenceExpression(
                            new CodePropertyReferenceExpression(
                                new CodePropertyReferenceExpression(
                                    new CodeTypeReferenceExpression(String.Format("{0}.{1}", dataModelSchema.TargetNamespace, "Properties")),
                                    "Settings"),
                                "Default"),
                            String.Format("{0}Endpoint", dataModelSchema.Name)))));

            //			for (
            //			; (DataModel.IsReading == true);
            //			)
            //			{
            CodeIterationStatement whileReconciling = new CodeIterationStatement(
                new CodeSnippetStatement(),
                new CodeBinaryOperatorExpression(
                    new CodePropertyReferenceExpression(new CodeTypeReferenceExpression(dataModelSchema.Name), "IsReading"),
                    CodeBinaryOperatorType.IdentityEquality,
                    new CodePrimitiveExpression(true)),
                new CodeSnippetStatement());

            //				try
            //				{
            CodeTryCatchFinallyStatement tryReading = new CodeTryCatchFinallyStatement();

            //					object[] dataHeader = dataModelClient.Read(DataModel.dataSetId, DataModel.sequence);
            tryReading.TryStatements.Add(
                new CodeVariableDeclarationStatement(
                    new CodeGlobalTypeReference(typeof(Object[])),
                    "dataHeader",
                    new CodeMethodInvokeExpression(
                        new CodeVariableReferenceExpression(clientVariableName),
                        "Read",
                        new CodePropertyReferenceExpression(new CodeTypeReferenceExpression(dataModelSchema.Name), "dataSetId"),
                        new CodePropertyReferenceExpression(new CodeTypeReferenceExpression(dataModelSchema.Name), "sequence"))));

            //					global::System.Guid dataSetId = ((global::System.Guid)(dataHeader[0]));
            tryReading.TryStatements.Add(
                new CodeVariableDeclarationStatement(
                    new CodeGlobalTypeReference(typeof(Guid)),
                    "dataSetId",
                    new CodeCastExpression(
                        new CodeGlobalTypeReference(typeof(Guid)),
                        new CodeIndexerExpression(new CodeVariableReferenceExpression("dataHeader"), new CodePrimitiveExpression(0)))));

            //					DataModel.sequence = ((long)(dataHeader[1]));
            tryReading.TryStatements.Add(
                new CodeAssignStatement(
                    new CodeFieldReferenceExpression(new CodeTypeReferenceExpression(dataModelSchema.Name), "sequence"),
                    new CodeCastExpression(
                        new CodeGlobalTypeReference(typeof(Int64)),
                        new CodeIndexerExpression(new CodeVariableReferenceExpression("dataHeader"), new CodePrimitiveExpression(1)))));

            //					object[] transactionLog = ((object[])(dataHeader[2]));
            tryReading.TryStatements.Add(
                new CodeVariableDeclarationStatement(
                    new CodeGlobalTypeReference(typeof(Object[])),
                    "transactionLog",
                    new CodeCastExpression(
                        new CodeGlobalTypeReference(typeof(Object[])),
                        new CodeIndexerExpression(new CodeVariableReferenceExpression("dataHeader"), new CodePrimitiveExpression(2)))));

            //					if ((dataSetId != DataModel.dataSetId))
            //					{
            CodeConditionStatement ifInvalidDataSet = new CodeConditionStatement(
                new CodeBinaryOperatorExpression(
                    new CodeVariableReferenceExpression("dataSetId"),
                    CodeBinaryOperatorType.IdentityInequality,
                    new CodeFieldReferenceExpression(new CodeTypeReferenceExpression(dataModelSchema.Name), "dataSetId")));

            //						DataModel.dataSetId = dataSetId;
            ifInvalidDataSet.TrueStatements.Add(
                new CodeAssignStatement(
                    new CodeFieldReferenceExpression(new CodeTypeReferenceExpression(dataModelSchema.Name), "dataSetId"),
                    new CodeVariableReferenceExpression("dataSetId")));

            //						DataModel.dataSet.EnforceConstraints = false;
            ifInvalidDataSet.TrueStatements.Add(
                new CodeAssignStatement(
                    new CodePropertyReferenceExpression(
                        new CodeFieldReferenceExpression(
                            new CodeTypeReferenceExpression(dataModelSchema.Name), "dataSet"),
                        "EnforceConstraints"),
                    new CodePrimitiveExpression(false)));

            //						DataModel.dataSet.Clear();
            //							DataModel.dataSet.Clear();
            ifInvalidDataSet.TrueStatements.Add(
                new CodeMethodInvokeExpression(
                    new CodeFieldReferenceExpression(new CodeTypeReferenceExpression(dataModelSchema.Name), "dataSet"),
                    "Clear"));

            //						DataModel.dataSet.EnforceConstraints = true;
            ifInvalidDataSet.TrueStatements.Add(
                new CodeAssignStatement(
                    new CodePropertyReferenceExpression(
                        new CodeFieldReferenceExpression(new CodeTypeReferenceExpression(dataModelSchema.Name), "dataSet"),
                        "EnforceConstraints"),
                    new CodePrimitiveExpression(true)));

            //					}
            tryReading.TryStatements.Add(ifInvalidDataSet);

            //					if ((transactionLog.Length != 0))
            //					{
            CodeConditionStatement ifResults = new CodeConditionStatement(
                new CodeBinaryOperatorExpression(
                    new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("transactionLog"), "Length"),
                    CodeBinaryOperatorType.IdentityInequality,
                    new CodePrimitiveExpression(0)));

            //						System.Windows.Application.Current.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.SystemIdle, new System.Action<object[]>(DataModel.StartMerge), transactionLog);
            //					}
            ifResults.TrueStatements.Add(
                new CodeMethodInvokeExpression(
                    new CodePropertyReferenceExpression(new CodePropertyReferenceExpression(new CodeGlobalTypeReferenceExpression(typeof(Application)), "Current"), "Dispatcher"),
                    "BeginInvoke",
                    new CodePropertyReferenceExpression(new CodeGlobalTypeReferenceExpression(typeof(DispatcherPriority)), "SystemIdle"),
                    new CodeObjectCreateExpression(new CodeTypeReference(typeof(Action <Object[]>)), new CodePropertyReferenceExpression(new CodeTypeReferenceExpression(dataModelSchema.Name), "StartMerge")),
                    new CodeVariableReferenceExpression("transactionLog")));
            tryReading.TryStatements.Add(ifResults);

            //				catch (global::System.ServiceModel.FaultException<Teraque.TenantNotLoadedFault> tenantNotFoundFaultException)
            //				{
            //					if (DataModel.TenantNotLoaded != null)
            //						DataModel.TenantNotLoaded(typeof(DataModel), tenantNotFoundFaultException.Detail.TenantName);
            //				}
            CodeCatchClause tenantNotLoadedFaultCatch = new CodeCatchClause(
                "tenantNotFoundFaultException",
                new CodeGlobalTypeReference(typeof(FaultException <TenantNotLoadedFault>)));

            tenantNotLoadedFaultCatch.Statements.Add(
                new CodeMethodInvokeExpression(
                    new CodeGlobalTypeReferenceExpression(typeof(Log)),
                    "Error",
                    new CodePrimitiveExpression("Tenant {0} not loaded."),
                    new CodePropertyReferenceExpression(
                        new CodePropertyReferenceExpression(new CodeArgumentReferenceExpression("tenantNotFoundFaultException"), "Detail"), "TenantName")));
            tenantNotLoadedFaultCatch.Statements.Add(
                new CodeConditionStatement(
                    new CodeBinaryOperatorExpression(
                        new CodeFieldReferenceExpression(new CodeTypeReferenceExpression(dataModelSchema.Name), "TenantNotLoaded"),
                        CodeBinaryOperatorType.IdentityInequality,
                        new CodePrimitiveExpression(null)),
                    new CodeStatement[] {
                new CodeExpressionStatement(
                    new CodeMethodInvokeExpression(
                        new CodeTypeReferenceExpression(dataModelSchema.Name),
                        "TenantNotLoaded",
                        new CodeTypeOfExpression(new CodeTypeReference(dataModelSchema.Name)),
                        new CodePropertyReferenceExpression(
                            new CodePropertyReferenceExpression(new CodeArgumentReferenceExpression("tenantNotFoundFaultException"), "Detail"), "TenantName")))
            }));

            //				}
            tryReading.CatchClauses.Add(tenantNotLoadedFaultCatch);

            //				catch (global::System.Exception exception)
            //				{
            CodeCatchClause generalCatch = new CodeCatchClause("exception", new CodeGlobalTypeReference(typeof(Exception)));

            //					global::Teraque.Log.Error("{0}, {1}", exception.Message, exception.StackTrace);
            //				}
            generalCatch.Statements.Add(
                new CodeMethodInvokeExpression(
                    new CodeGlobalTypeReferenceExpression(typeof(Log)),
                    "Error",
                    new CodePrimitiveExpression("{0}, {1}"),
                    new CodePropertyReferenceExpression(new CodeArgumentReferenceExpression("exception"), "Message"),
                    new CodePropertyReferenceExpression(new CodeArgumentReferenceExpression("exception"), "StackTrace")));
            tryReading.CatchClauses.Add(generalCatch);
            whileReconciling.Statements.Add(tryReading);

            //				}
            //				finally
            //				{
            //					if ((dataModelClient.State != System.ServiceModel.CommunicationState.Opened))
            //					{
            CodeConditionStatement ifChannelNotOpen = new CodeConditionStatement(
                new CodeBinaryOperatorExpression(
                    new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("dataModelClient"), "State"),
                    CodeBinaryOperatorType.IdentityInequality,
                    new CodePropertyReferenceExpression(new CodeGlobalTypeReferenceExpression(typeof(CommunicationState)), "Opened")));

            //						global::System.Threading.Thread.Sleep(1000);
            ifChannelNotOpen.TrueStatements.Add(new CodeMethodInvokeExpression(
                                                    new CodeGlobalTypeReferenceExpression(typeof(Thread)),
                                                    "Sleep",
                                                    new CodePrimitiveExpression(1000)));

            //						dataModelClient = new DataModelClient(Teraque.AssetNetwork.Properties.Settings.Default.DataModelEndpoint);
            //					}
            //				}
            ifChannelNotOpen.TrueStatements.Add(
                new CodeAssignStatement(
                    new CodeVariableReferenceExpression(clientVariableName),
                    new CodeObjectCreateExpression(
                        new CodeTypeReference(clientTypeName),
                        new CodePropertyReferenceExpression(
                            new CodePropertyReferenceExpression(
                                new CodePropertyReferenceExpression(
                                    new CodeTypeReferenceExpression(String.Format("{0}.{1}", dataModelSchema.TargetNamespace, "Properties")),
                                    "Settings"),
                                "Default"),
                            String.Format("{0}Endpoint", dataModelSchema.Name)))));
            tryReading.FinallyStatements.Add(ifChannelNotOpen);

            //				global::System.Threading.Thread.Sleep(DataModel.refreshInterval);
            //				global::System.Threading.Thread.Sleep(DataModel.refreshInterval);
            whileReconciling.Statements.Add(
                new CodeMethodInvokeExpression(
                    new CodeGlobalTypeReferenceExpression(typeof(Thread)),
                    "Sleep",
                    new CodePropertyReferenceExpression(new CodeTypeReferenceExpression(dataModelSchema.Name), "refreshInterval")));

            //			}
            this.Statements.Add(whileReconciling);

            //		}
        }
Ejemplo n.º 27
0
        /// <summary>
        /// Creates a method to handle moving the deleted records from the active data model to the deleted data model.
        /// </summary>
        /// <param name="schema">The data model schema.</param>
        public ReadMethod(DataModelSchema dataModelSchema)
        {
            //		/// <summary>
            //		/// Collects the set of modified records that will reconcile the client data model to the master data model.
            //		/// </summary>
            //		/// <param name="identifier">A unique identifier of an instance of the data.</param>
            //		/// <param name="sequence">The sequence of the client data model.</param>
            //		/// <returns>An array of records that will reconcile the client data model to the server.</returns>
            //		[global::Teraque.ClaimsPrincipalPermission(global::System.Security.Permissions.SecurityAction.Demand, ClaimType=global::Teraque.ClaimTypes.Read, Resource=global::Teraque.Resources.Application)]
            //		public object[] Read(global::System.Guid identifier, long sequence)
            //		{
            this.Comments.Add(new CodeCommentStatement("<summary>", true));
            this.Comments.Add(new CodeCommentStatement("Collects the set of modified records that will reconcile the client data model to the master data model.", true));
            this.Comments.Add(new CodeCommentStatement("</summary>", true));
            this.Comments.Add(new CodeCommentStatement("<param name=\"identifier\">A unique identifier of an instance of the data.</param>", true));
            this.Comments.Add(new CodeCommentStatement("<param name=\"sequence\">The sequence of the client data model.</param>", true));
            this.Comments.Add(new CodeCommentStatement("<returns>An array of records that will reconcile the client data model to the server.</returns>", true));
            this.Name       = "Read";
            this.Attributes = MemberAttributes.Public | MemberAttributes.Final;
            this.ReturnType = new CodeGlobalTypeReference(typeof(Object[]));
            this.Parameters.Add(new CodeParameterDeclarationExpression(new CodeGlobalTypeReference(typeof(Guid)), "identifier"));
            this.Parameters.Add(new CodeParameterDeclarationExpression(new CodeGlobalTypeReference(typeof(Int64)), "sequence"));

            //			try
            //			{
            CodeTryCatchFinallyStatement tryTransactionLogLock = new CodeTryCatchFinallyStatement();

            //				DataModel.transactionLogLock.EnterReadLock();
            tryTransactionLogLock.TryStatements.Add(
                new CodeMethodInvokeExpression(
                    new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), "transactionLogLock"),
                    "EnterReadLock"));

            //				object[] dataHeader = new object[3];
            tryTransactionLogLock.TryStatements.Add(
                new CodeVariableDeclarationStatement(
                    new CodeGlobalTypeReference(typeof(Object[])),
                    "dataHeader", new CodeArrayCreateExpression(new CodeGlobalTypeReference(typeof(Object[])), 3)));

            //				dataHeader[0] = DataModel.identifier;
            tryTransactionLogLock.TryStatements.Add(
                new CodeAssignStatement(
                    new CodeIndexerExpression(new CodeVariableReferenceExpression("dataHeader"), new CodePrimitiveExpression(0)),
                    new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), "identifier")));

            //				dataHeader[1] = ((long)(this.transactionLog.Last.Value.sequence));
            tryTransactionLogLock.TryStatements.Add(
                new CodeAssignStatement(
                    new CodeIndexerExpression(new CodeVariableReferenceExpression("dataHeader"), new CodePrimitiveExpression(1)),
                    new CodeCastExpression(
                        new CodeTypeReference(typeof(Int64)),
                        new CodeFieldReferenceExpression(
                            new CodePropertyReferenceExpression(
                                new CodePropertyReferenceExpression(
                                    new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), "transactionLog"),
                                    "Last"),
                                "Value"),
                            "sequence"))));

            //				if ((identifier != DataModel.identifier))
            //				{
            CodeConditionStatement ifNewDataModel = new CodeConditionStatement(
                new CodeBinaryOperatorExpression(
                    new CodeArgumentReferenceExpression("identifier"),
                    CodeBinaryOperatorType.IdentityInequality,
                    new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), "identifier")));

            //					sequence = long.MinValue;
            ifNewDataModel.TrueStatements.Add(
                new CodeAssignStatement(
                    new CodeArgumentReferenceExpression("sequence"),
                    new CodePropertyReferenceExpression(new CodeTypeReferenceExpression(typeof(Int64)), "MinValue")));
            tryTransactionLogLock.TryStatements.Add(ifNewDataModel);

            //				}

            //				global::System.Collections.ArrayList data = new global::System.Collections.ArrayList();
            tryTransactionLogLock.TryStatements.Add(
                new CodeVariableDeclarationStatement(
                    new CodeGlobalTypeReference(typeof(ArrayList)), "data", new CodeObjectCreateExpression(new CodeGlobalTypeReference(typeof(ArrayList)))));

            //				global::System.Collections.Generic.LinkedListNode<TransactionLogItem> transactionNode = this.transactionLog.Last;
            tryTransactionLogLock.TryStatements.Add(
                new CodeVariableDeclarationStatement(
                    new CodeTypeReference("global::System.Collections.Generic.LinkedListNode<TransactionLogItem>"),
                    "transactionNode",
                    new CodePropertyReferenceExpression(
                        new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), "transactionLog"),
                        "Last")));

            //			logLoop:
            tryTransactionLogLock.TryStatements.Add(new CodeLabeledStatement("logLoop"));

            //				if ((transactionNode == null))
            //				{
            CodeConditionStatement ifListStart = new CodeConditionStatement(
                new CodeBinaryOperatorExpression(
                    new CodeVariableReferenceExpression("transactionNode"),
                    CodeBinaryOperatorType.IdentityEquality,
                    new CodePrimitiveExpression(null)));

            //					goto endLoop;
            ifListStart.TrueStatements.Add(new CodeGotoStatement("endLoop"));

            //				}
            tryTransactionLogLock.TryStatements.Add(ifListStart);

            //				if ((((long)(transactionNode.Value.sequence)) <= sequence))
            //				{
            CodeConditionStatement ifStale = new CodeConditionStatement(
                new CodeBinaryOperatorExpression(
                    new CodeCastExpression(
                        new CodeGlobalTypeReference(typeof(Int64)),
                        new CodeFieldReferenceExpression(
                            new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("transactionNode"), "Value"),
                            "sequence")),
                    CodeBinaryOperatorType.LessThanOrEqual,
                    new CodeVariableReferenceExpression("sequence")));

            //					goto endLoop;
            ifStale.TrueStatements.Add(new CodeGotoStatement("endLoop"));

            //				}
            tryTransactionLogLock.TryStatements.Add(ifStale);

            //				object[] transactionLogItem = ((object[])(transactionNode.Value.data));
            tryTransactionLogLock.TryStatements.Add(
                new CodeVariableDeclarationStatement(
                    new CodeGlobalTypeReference(typeof(Object[])),
                    "transactionLogItem",
                    new CodeCastExpression(
                        new CodeGlobalTypeReference(typeof(Object[])),
                        new CodeFieldReferenceExpression(
                            new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("transactionNode"), "Value"),
                            "data"))));

            //						global::System.Data.DataTable dataTable = DataModel.dataSet.Tables[((int)(transactionLogItem[1]))];
            tryTransactionLogLock.TryStatements.Add(
                new CodeVariableDeclarationStatement(
                    new CodeGlobalTypeReference(typeof(DataTable)),
                    "dataTable",
                    new CodeIndexerExpression(
                        new CodePropertyReferenceExpression(new CodeThisReferenceExpression(), "Tables"),
                        new CodeCastExpression(
                            new CodeGlobalTypeReference(typeof(Int32)),
                            new CodeIndexerExpression(
                                new CodeVariableReferenceExpression("transactionLogItem"),
                                new CodePrimitiveExpression(1))))));

            //						data.Add(transactionLogItem);
            tryTransactionLogLock.TryStatements.Add(
                new CodeMethodInvokeExpression(new CodeVariableReferenceExpression("data"), "Add", new CodeVariableReferenceExpression("transactionLogItem")));

            //				transactionNode = transactionNode.Previous;
            tryTransactionLogLock.TryStatements.Add(
                new CodeAssignStatement(
                    new CodeVariableReferenceExpression("transactionNode"),
                    new CodeFieldReferenceExpression(new CodeVariableReferenceExpression("transactionNode"), "Previous")));

            //				goto logLoop;
            tryTransactionLogLock.TryStatements.Add(new CodeGotoStatement("logLoop"));

            //			endLoop:
            tryTransactionLogLock.TryStatements.Add(new CodeLabeledStatement("endLoop"));

            //				dataHeader[2] = data.ToArray();
            tryTransactionLogLock.TryStatements.Add(
                new CodeAssignStatement(
                    new CodeIndexerExpression(new CodeVariableReferenceExpression("dataHeader"), new CodePrimitiveExpression(2)),
                    new CodeMethodInvokeExpression(new CodeVariableReferenceExpression("data"), "ToArray")));

            //				return dataHeader;
            tryTransactionLogLock.TryStatements.Add(new CodeMethodReturnStatement(new CodeVariableReferenceExpression("dataHeader")));

            //			finally
            //			{
            //				DataModel.transactionLogLock.ExitReadLock();
            tryTransactionLogLock.FinallyStatements.Add(
                new CodeMethodInvokeExpression(
                    new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), "transactionLogLock"),
                    "ExitReadLock"));

            //			}
            this.Statements.Add(tryTransactionLogLock);

            //		}
        }
Ejemplo n.º 28
0
        CodeExpression GenerateScanfromExpression(CodeTypeDeclaration mainClass)
        {
            CodeMemberMethod method = GenerateScanMethod();

            int    startPosition = scanfrom + skip;
            string match         = matches [0] as string;
            int    matchLength   = match.Length;
            int    minsize       = startPosition + matchLength + 1;

            // if (ualength < minsize)
            //    return false;
            CodeBinaryOperatorExpression uaSizeCheck = new CodeBinaryOperatorExpression();

            uaSizeCheck.Left     = new CodeArgumentReferenceExpression("ualength");
            uaSizeCheck.Operator = CodeBinaryOperatorType.LessThan;
            uaSizeCheck.Right    = new CodePrimitiveExpression(minsize);
            method.Statements.Add(
                new CodeConditionStatement(uaSizeCheck,
                                           new CodeMethodReturnStatement(new CodePrimitiveExpression(false))));

            // int startPosition = 0;
            method.Statements.Add(
                new CodeVariableDeclarationStatement(typeof(int), "startPosition",
                                                     new CodePrimitiveExpression(0)));

            // int endPosition = startPosition + matchLength;
            method.Statements.Add(
                new CodeVariableDeclarationStatement(
                    typeof(int), "endPosition",
                    new CodeBinaryOperatorExpression(
                        new CodeVariableReferenceExpression("startPosition"),
                        CodeBinaryOperatorType.Add,
                        new CodePrimitiveExpression(matchLength - 1))
                    )
                );

            // for (int ualeft = ualength; ualeft >= matchlen; ualeft--) {
            //   if (<condition>) {
            //      hasJavaScript = true;
            //      return true;
            //   }
            //   startPosition++;
            //   endPosition++;
            // }
            CodeIterationStatement iter = new CodeIterationStatement();

            iter.InitStatement = new CodeVariableDeclarationStatement(
                typeof(int), "ualeft", new CodeArgumentReferenceExpression("ualength"));
            iter.IncrementStatement = new CodeAssignStatement(
                new CodeVariableReferenceExpression("ualeft"),
                new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("ualeft"),
                                                 CodeBinaryOperatorType.Subtract,
                                                 new CodePrimitiveExpression(1))
                );
            iter.TestExpression = new CodeBinaryOperatorExpression(
                new CodeVariableReferenceExpression("ualeft"),
                CodeBinaryOperatorType.GreaterThanOrEqual,
                new CodePrimitiveExpression(matchLength)
                );

            CodeConditionStatement cond = new CodeConditionStatement(
                GenerateScanCondition(match, matchLength, startPosition));

            cond.TrueStatements.Add(
                new CodeAssignStatement(new CodeArgumentReferenceExpression("hasJavaScript"),
                                        new CodePrimitiveExpression(true)));
            cond.TrueStatements.Add(new CodeMethodReturnStatement(new CodePrimitiveExpression(true)));
            iter.Statements.Add(cond);
            iter.Statements.Add(
                new CodeAssignStatement(new CodeVariableReferenceExpression("startPosition"),
                                        new CodeBinaryOperatorExpression(
                                            new CodeVariableReferenceExpression("startPosition"),
                                            CodeBinaryOperatorType.Add,
                                            new CodePrimitiveExpression(1)))
                );
            iter.Statements.Add(
                new CodeAssignStatement(new CodeVariableReferenceExpression("endPosition"),
                                        new CodeBinaryOperatorExpression(
                                            new CodeVariableReferenceExpression("endPosition"),
                                            CodeBinaryOperatorType.Add,
                                            new CodePrimitiveExpression(1)))
                );
            method.Statements.Add(iter);
            method.Statements.Add(new CodeMethodReturnStatement(new CodePrimitiveExpression(false)));

            mainClass.Members.Add(method);

            return(new CodeMethodInvokeExpression(
                       new CodeMethodReferenceExpression(new CodeTypeReferenceExpression("UplevelHelper"), method.Name),
                       new CodeExpression[] { new CodeArgumentReferenceExpression("ua"),
                                              new CodeDirectionExpression(
                                                  FieldDirection.Out,
                                                  new CodeArgumentReferenceExpression("hasJavaScript")),
                                              new CodeArgumentReferenceExpression("ualength") }
                       ));
        }
Ejemplo n.º 29
0
        /// <summary>
        /// Generates the private field and public property for a piece of data.
        /// </summary>
        /// <param name="propertyName">Name of the property being generated.</param>
        /// <param name="typeName">Name of the type for the property.</param>
        /// <param name="typeDeclaration">Type declaration into which the field and property should be placed.</param>
        /// <param name="outputXmlMethod">Member method for the OutputXml method.</param>
        /// <param name="enumDeclaration">EnumDeclaration, which is null unless called from a locally defined enum attribute.</param>
        /// <param name="documentation">Comment string to be placed on the property.</param>
        /// <param name="nestedContent">If true, the field will be placed in nested content when outputting to XML.</param>
        /// <param name="requiredField">If true, the generated serialization code will throw if the field is not set.</param>
        private static void GenerateFieldAndProperty(string propertyName, string typeName, CodeTypeDeclaration typeDeclaration, CodeMemberMethod outputXmlMethod, EnumDeclaration enumDeclaration, string documentation, bool nestedContent, bool requiredField)
        {
            string          fieldName    = String.Concat(propertyName.Substring(0, 1).ToLower(), propertyName.Substring(1), "Field");
            string          fieldNameSet = String.Concat(fieldName, "Set");
            Type            type         = GetClrTypeByXmlName(typeName);
            CodeMemberField fieldMember;

            if (type == null)
            {
                fieldMember = new CodeMemberField(typeName, fieldName);
            }
            else
            {
                fieldMember = new CodeMemberField(type, fieldName);
            }
            fieldMember.Attributes = MemberAttributes.Private;
            typeDeclaration.Members.Add(fieldMember);
            typeDeclaration.Members.Add(new CodeMemberField(typeof(bool), fieldNameSet));

            CodeMemberProperty propertyMember = new CodeMemberProperty();

            propertyMember.Attributes = MemberAttributes.Public | MemberAttributes.Final;
            if (documentation != null)
            {
                GenerateSummaryComment(propertyMember.Comments, documentation);
            }
            propertyMember.Name = propertyName;
            if (type == null)
            {
                propertyMember.Type = new CodeTypeReference(typeName);
            }
            else
            {
                propertyMember.Type = new CodeTypeReference(type);
            }

            CodeMethodReturnStatement returnStatement = new CodeMethodReturnStatement();

            returnStatement.Expression = new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), fieldName);
            propertyMember.GetStatements.Add(returnStatement);

            CodeAssignStatement assignmentStatement = new CodeAssignStatement();

            propertyMember.SetStatements.Add(new CodeAssignStatement(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), fieldNameSet), new CodePrimitiveExpression(true)));
            assignmentStatement.Left  = new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), fieldName);
            assignmentStatement.Right = new CodePropertySetValueReferenceExpression();
            propertyMember.SetStatements.Add(assignmentStatement);

            CodeConditionStatement fieldSetStatement = new CodeConditionStatement();

            fieldSetStatement.Condition = new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), fieldNameSet);
            string clrTypeName = (string)simpleTypeNamesToClrTypeNames[typeName];

            switch (clrTypeName)
            {
            case "string":
                if (nestedContent)
                {
                    fieldSetStatement.TrueStatements.Add(new CodeMethodInvokeExpression(new CodeVariableReferenceExpression("writer"), "WriteString", new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), fieldName)));
                }
                else
                {
                    fieldSetStatement.TrueStatements.Add(new CodeMethodInvokeExpression(new CodeVariableReferenceExpression("writer"), "WriteAttributeString", new CodeSnippetExpression(String.Concat("\"", propertyName, "\"")), new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), fieldName)));
                }
                break;

            case "int":
            case "uint":
                if (nestedContent)
                {
                    fieldSetStatement.TrueStatements.Add(new CodeMethodInvokeExpression(new CodeVariableReferenceExpression("writer"), "WriteString", new CodeMethodInvokeExpression(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), fieldName), "ToString")));
                }
                else
                {
                    fieldSetStatement.TrueStatements.Add(new CodeMethodInvokeExpression(new CodeVariableReferenceExpression("writer"), "WriteAttributeString", new CodeSnippetExpression(String.Concat("\"", propertyName, "\"")), new CodeMethodInvokeExpression(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), fieldName), "ToString")));
                }
                break;

            default:
                if (typeName == "DateTime")
                {
                    if (nestedContent)
                    {
                        fieldSetStatement.TrueStatements.Add(new CodeMethodInvokeExpression(new CodeVariableReferenceExpression("writer"), "WriteString", new CodeMethodInvokeExpression(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), fieldName), "ToString")));
                    }
                    else
                    {
                        fieldSetStatement.TrueStatements.Add(new CodeMethodInvokeExpression(new CodeVariableReferenceExpression("writer"), "WriteAttributeString", new CodeSnippetExpression(String.Concat("\"", propertyName, "\"")), new CodeMethodInvokeExpression(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), fieldName), "ToString")));
                    }
                    break;
                }

                if (enumDeclaration == null)
                {
                    GenerateOutputForEnum(fieldSetStatement, (EnumDeclaration)typeNamesToEnumDeclarations[typeName], fieldName, propertyName);
                }
                else
                {
                    GenerateOutputForEnum(fieldSetStatement, enumDeclaration, fieldName, propertyName);
                }
                break;
            }

            // TODO: Add throw to falseStatements if required field not set.
            outputXmlMethod.Statements.Add(fieldSetStatement);

            typeDeclaration.Members.Add(propertyMember);
        }
Ejemplo n.º 30
0
        /*
         * Build the default constructor
         */
        protected override void BuildDefaultConstructor()
        {
            base.BuildDefaultConstructor();

            if (CompilParams.IncludeDebugInformation)
            {
                // If in debug mode, set the timeout to some huge value (ASURT 49427)
                //      Server.ScriptTimeout = 30000000;
                CodeAssignStatement setScriptTimeout = new CodeAssignStatement();
                setScriptTimeout.Left = new CodePropertyReferenceExpression(
                    new CodePropertyReferenceExpression(
                        new CodeThisReferenceExpression(), "Server"),
                    "ScriptTimeout");
                setScriptTimeout.Right = new CodePrimitiveExpression(DebugScriptTimeout);
                InitMethod.Statements.Add(setScriptTimeout);
            }

            if (Parser.TransactionMode != 0 /*TransactionOption.Disabled*/)
            {
                InitMethod.Statements.Add(new CodeAssignStatement(
                                              new CodePropertyReferenceExpression(new CodeThisReferenceExpression(), "TransactionMode"),
                                              new CodePrimitiveExpression(Parser.TransactionMode)));
            }

            if (Parser.AspCompatMode)
            {
                InitMethod.Statements.Add(new CodeAssignStatement(
                                              new CodePropertyReferenceExpression(new CodeThisReferenceExpression(), "AspCompatMode"),
                                              new CodePrimitiveExpression(Parser.AspCompatMode)));
            }

            if (Parser.AsyncMode)
            {
                InitMethod.Statements.Add(new CodeAssignStatement(
                                              new CodePropertyReferenceExpression(new CodeThisReferenceExpression(), "AsyncMode"),
                                              new CodePrimitiveExpression(Parser.AsyncMode)));
            }

            if (Parser.OutputCacheParameters != null)
            {
                OutputCacheParameters cacheSettings = Parser.OutputCacheParameters;
                if ((cacheSettings.CacheProfile != null && cacheSettings.CacheProfile.Length != 0) ||
                    cacheSettings.Duration != 0 ||
                    cacheSettings.Location == OutputCacheLocation.None)
                {
                    // Add the following code snippet as a static on the class:
                    //
                    // private static OutputCacheParameters __outputCacheSettings = null;
                    //
                    CodeMemberField outputCacheSettingsField = new CodeMemberField(typeof(OutputCacheParameters), outputCacheSettingsFieldName);
                    outputCacheSettingsField.Attributes    |= MemberAttributes.Static;
                    outputCacheSettingsField.InitExpression = new CodePrimitiveExpression(null);
                    _sourceDataClass.Members.Add(outputCacheSettingsField);

                    // Then, add the following code to the default constructor:
                    //
                    // if (__outputCacheSettings == null)
                    //     __outputCacheSettings = new OutputCacheParameters(.....)
                    //

                    // This is the "if (__outputCacheSettings == null)" part
                    CodeConditionStatement outputCacheSettingsCondition = new CodeConditionStatement();
                    outputCacheSettingsCondition.Condition = new CodeBinaryOperatorExpression(
                        new CodeFieldReferenceExpression(
                            _classTypeExpr,
                            outputCacheSettingsFieldName),
                        CodeBinaryOperatorType.IdentityEquality,
                        new CodePrimitiveExpression(null));

                    // This is the "__outputCacheSettings = new OutputCacheParameters()" part


                    // e.g. declare local variable: OutputCacheParameters outputCacheSettings;
                    CodeVariableDeclarationStatement outputCacheSettingsDeclaration = new CodeVariableDeclarationStatement();
                    outputCacheSettingsDeclaration.Type = new CodeTypeReference(typeof(OutputCacheParameters));
                    outputCacheSettingsDeclaration.Name = outputCacheSettingsLocalName;
                    outputCacheSettingsCondition.TrueStatements.Insert(0, outputCacheSettingsDeclaration);

                    // e.g. outputCacheSettings = new outputCacheParameters;
                    CodeObjectCreateExpression cacheSettingsObject = new CodeObjectCreateExpression();
                    cacheSettingsObject.CreateType = new CodeTypeReference(typeof(OutputCacheParameters));

                    CodeVariableReferenceExpression outputCacheSettings =
                        new CodeVariableReferenceExpression(outputCacheSettingsLocalName);

                    CodeAssignStatement setOutputCacheObject =
                        new CodeAssignStatement(outputCacheSettings, cacheSettingsObject);

                    // Add the statement to the "true" clause
                    outputCacheSettingsCondition.TrueStatements.Add(setOutputCacheObject);

                    if (cacheSettings.IsParameterSet(OutputCacheParameter.CacheProfile))
                    {
                        CodeAssignStatement setPropertyStatement = new CodeAssignStatement(
                            new CodePropertyReferenceExpression(outputCacheSettings, "CacheProfile"),
                            new CodePrimitiveExpression(cacheSettings.CacheProfile));

                        outputCacheSettingsCondition.TrueStatements.Add(setPropertyStatement);
                    }

                    if (cacheSettings.IsParameterSet(OutputCacheParameter.Duration))
                    {
                        CodeAssignStatement setPropertyStatement = new CodeAssignStatement(
                            new CodePropertyReferenceExpression(outputCacheSettings, "Duration"),
                            new CodePrimitiveExpression(cacheSettings.Duration));

                        outputCacheSettingsCondition.TrueStatements.Add(setPropertyStatement);
                    }

                    if (cacheSettings.IsParameterSet(OutputCacheParameter.Enabled))
                    {
                        CodeAssignStatement setPropertyStatement = new CodeAssignStatement(
                            new CodePropertyReferenceExpression(outputCacheSettings, "Enabled"),
                            new CodePrimitiveExpression(cacheSettings.Enabled));

                        outputCacheSettingsCondition.TrueStatements.Add(setPropertyStatement);
                    }

                    if (cacheSettings.IsParameterSet(OutputCacheParameter.Location))
                    {
                        CodeAssignStatement setPropertyStatement = new CodeAssignStatement(
                            new CodePropertyReferenceExpression(outputCacheSettings, "Location"),
                            new CodeFieldReferenceExpression(
                                new CodeTypeReferenceExpression(typeof(OutputCacheLocation)),
                                cacheSettings.Location.ToString()));

                        outputCacheSettingsCondition.TrueStatements.Add(setPropertyStatement);
                    }

                    if (cacheSettings.IsParameterSet(OutputCacheParameter.NoStore))
                    {
                        CodeAssignStatement setPropertyStatement = new CodeAssignStatement(
                            new CodePropertyReferenceExpression(outputCacheSettings, "NoStore"),
                            new CodePrimitiveExpression(cacheSettings.NoStore));

                        outputCacheSettingsCondition.TrueStatements.Add(setPropertyStatement);
                    }

                    if (cacheSettings.IsParameterSet(OutputCacheParameter.SqlDependency))
                    {
                        CodeAssignStatement setPropertyStatement = new CodeAssignStatement(
                            new CodePropertyReferenceExpression(outputCacheSettings, "SqlDependency"),
                            new CodePrimitiveExpression(cacheSettings.SqlDependency));

                        outputCacheSettingsCondition.TrueStatements.Add(setPropertyStatement);
                    }

                    if (cacheSettings.IsParameterSet(OutputCacheParameter.VaryByControl))
                    {
                        CodeAssignStatement setPropertyStatement = new CodeAssignStatement(
                            new CodePropertyReferenceExpression(outputCacheSettings, "VaryByControl"),
                            new CodePrimitiveExpression(cacheSettings.VaryByControl));

                        outputCacheSettingsCondition.TrueStatements.Add(setPropertyStatement);
                    }

                    if (cacheSettings.IsParameterSet(OutputCacheParameter.VaryByCustom))
                    {
                        CodeAssignStatement setPropertyStatement = new CodeAssignStatement(
                            new CodePropertyReferenceExpression(outputCacheSettings, "VaryByCustom"),
                            new CodePrimitiveExpression(cacheSettings.VaryByCustom));

                        outputCacheSettingsCondition.TrueStatements.Add(setPropertyStatement);
                    }

                    if (cacheSettings.IsParameterSet(OutputCacheParameter.VaryByContentEncoding))
                    {
                        CodeAssignStatement setPropertyStatement = new CodeAssignStatement(
                            new CodePropertyReferenceExpression(outputCacheSettings, "VaryByContentEncoding"),
                            new CodePrimitiveExpression(cacheSettings.VaryByContentEncoding));

                        outputCacheSettingsCondition.TrueStatements.Add(setPropertyStatement);
                    }
                    if (cacheSettings.IsParameterSet(OutputCacheParameter.VaryByHeader))
                    {
                        CodeAssignStatement setPropertyStatement = new CodeAssignStatement(
                            new CodePropertyReferenceExpression(outputCacheSettings, "VaryByHeader"),
                            new CodePrimitiveExpression(cacheSettings.VaryByHeader));

                        outputCacheSettingsCondition.TrueStatements.Add(setPropertyStatement);
                    }

                    if (cacheSettings.IsParameterSet(OutputCacheParameter.VaryByParam))
                    {
                        CodeAssignStatement setPropertyStatement = new CodeAssignStatement(
                            new CodePropertyReferenceExpression(outputCacheSettings, "VaryByParam"),
                            new CodePrimitiveExpression(cacheSettings.VaryByParam));

                        outputCacheSettingsCondition.TrueStatements.Add(setPropertyStatement);
                    }

                    // e.g. __outputCacheSettings = outputCacheSettings;
                    CodeFieldReferenceExpression staticOutputCacheSettings =
                        new CodeFieldReferenceExpression(_classTypeExpr, outputCacheSettingsFieldName);
                    CodeAssignStatement assignOutputCacheSettings =
                        new CodeAssignStatement(staticOutputCacheSettings, outputCacheSettings);
                    // Add the statement to the "true" clause
                    outputCacheSettingsCondition.TrueStatements.Add(assignOutputCacheSettings);

                    InitMethod.Statements.Add(outputCacheSettingsCondition);
                }
            }
        }
Ejemplo n.º 31
0
        private CodeStatement[] ParseFlow(List <CodeLine> lines, int index)
        {
            #region Variables

            var      line  = lines[index];
            string   code  = line.Code.TrimStart(Spaces);
            string[] parts = { string.Empty, string.Empty };

            var delimiters = new char[Spaces.Length + 1];
            delimiters[0] = Multicast;
            Spaces.CopyTo(delimiters, 1);
            int[] d = { code.IndexOfAny(delimiters), code.IndexOfAny(new[] { BlockOpen, ParenOpen }) };

            if (d[0] == -1 && d[1] == -1)
            {
                parts[0] = code;
            }
            else if (d[1] != -1 && (d[1] < d[0] || d[0] == -1))
            {
                parts[0] = code.Substring(0, d[1]);
                parts[1] = code.Substring(d[1], code.Length - d[1]).TrimStart(Spaces);
            }
            else
            {
                parts[0] = code.Substring(0, d[0]);
                parts[1] = code.Substring(d[0] + 1, code.Length - d[0] - 1).TrimStart(Spaces);
            }

            if (parts.Length > 1 && IsEmptyStatement(parts[1]))
            {
                parts = new[] { parts[0] }
            }
            ;

            #endregion Variables

            switch (parts[0].ToLowerInvariant())
            {
                #region If/Else

            case FlowIf:
            {
                if (parts.Length < 1)
                {
                    throw new ParseException("If requires a parameter");
                }

                bool           blockOpen = false;
                CodeExpression condition = ParseFlowParameter(parts[1], true, out blockOpen, false);
                var            ifelse    = new CodeConditionStatement
                {
                    Condition = condition
                };

                var block = new CodeBlock(line, Scope, ifelse.TrueStatements, CodeBlock.BlockKind.IfElse, blocks.Count == 0 ? null : blocks.Peek());
                block.Type = blockOpen ? CodeBlock.BlockType.Within : CodeBlock.BlockType.Expect;
                CloseTopSingleBlock();
                blocks.Push(block);

                elses.Push(ifelse.FalseStatements);
                return(new CodeStatement[] { ifelse });
            }

            case FlowElse:
            {
                if (elses.Count == 0)
                {
                    throw new ParseException("Else with no preceeding if block");
                }

                string next = line.Code.TrimStart(Spaces).Substring(FlowElse.Length).TrimStart(Spaces);

                if (!IsEmptyStatement(next))
                {
                    lines.Insert(index + 1, new CodeLine(lines[index].FileName, lines[index].LineNumber, next));
                }

                var type  = parts.Length > 1 && parts[1][0] == BlockOpen ? CodeBlock.BlockType.Within : CodeBlock.BlockType.Expect;
                var block = new CodeBlock(lines[index], Scope, elses.Pop(), CodeBlock.BlockKind.IfElse, blocks.Count == 0 ? null : blocks.Peek())
                {
                    Type = type
                };
                CloseTopSingleBlock();
                blocks.Push(block);
            }
            break;

                #endregion If/Else

                #region Goto

            case FlowGosub:
            {
                if (parts.Length < 1)
                {
                    throw new ParseException("No label specified");
                }
                return(new CodeStatement[] { new CodeExpressionStatement(LocalLabelInvoke(parts[1])) });
            }

            case FlowGoto:
            {
                if (parts.Length < 1)
                {
                    throw new ParseException("No label specified");
                }
                return(new CodeStatement[] { new CodeExpressionStatement(LocalLabelInvoke(parts[1])), new CodeMethodReturnStatement() });
            }

                #endregion Goto

                #region Loops

            case FlowLoop:
            {
                bool blockOpen = false;
                CodeMethodInvokeExpression iterator;
                bool skip       = true;
                bool checkBrace = true;
                bool byref      = false;

                #region Loop types

                if (parts.Length > 1)
                {
                    string[] sub = parts[1].Split(new[] { Multicast }, 2);
                    sub = new[] { sub[0].Trim(), sub.Length > 1 ? sub[1].Trim() : string.Empty };

                    switch (sub[0].ToUpperInvariant())
                    {
                    case "READ":
                        byref    = true;
                        iterator = (CodeMethodInvokeExpression)InternalMethods.LoopRead;
                        break;

                    case "PARSE":
                        checkBrace = false;
                        byref      = true;
                        iterator   = (CodeMethodInvokeExpression)InternalMethods.LoopParse;
                        break;

                    case "HKEY_LOCAL_MACHINE":
                    case "HKLM":
                    case "HKEY_USERS":
                    case "HKU":
                    case "HKEY_CURRENT_USER":
                    case "HKCU":
                    case "HKEY_CLASSES_ROOT":
                    case "HKCR":
                    case "HKEY_CURRENT_CONFIG":
                    case "HKCC":
                        iterator = (CodeMethodInvokeExpression)InternalMethods.LoopRegistry;
                        break;

                    case "EACH":
                        byref    = true;
                        iterator = (CodeMethodInvokeExpression)InternalMethods.LoopEach;
                        break;

                    default:
                    {
                        var file = false;

                        if (parts[1].IndexOf(Multicast) != -1)
                        {
                            file = true;
                        }

                        // TODO: check file/iteration loop types

                        skip     = false;
                        iterator = (CodeMethodInvokeExpression)(file ? InternalMethods.LoopFile : InternalMethods.Loop);
                    }
                    break;
                    }

                    if (skip)
                    {
                        parts[1] = sub[1];
                    }

                    if (checkBrace)
                    {
                        // TODO: check expression parameters before stripping comments
                        int    x    = parts.Length == 1 ? 0 : 1;
                        string part = StripComment(parts[x]).TrimEnd(Spaces);
                        int    l    = part.Length - 1;
                        if (part.Length > 0 && part[l] == BlockOpen)
                        {
                            blockOpen = true;
                            parts[x]  = part.Substring(0, l);
                        }
                    }

                    if (skip && parts[1].Length == 0)
                    {
                        throw new ParseException("Loop type must have an argument");
                    }

                    foreach (var arg in SplitCommandParameters(parts[1]))
                    {
                        iterator.Parameters.Add(ParseCommandParameter(arg));
                    }

                    if (LegacyLoop && byref)
                    {
                        iterator.Parameters[0] = VarId(iterator.Parameters[0]);
                    }
                }
                else
                {
                    iterator = (CodeMethodInvokeExpression)InternalMethods.Loop;
                    iterator.Parameters.Add(new CodePrimitiveExpression(int.MaxValue));
                }

                #endregion Loop types

                string id = InternalID;

                var init = new CodeVariableDeclarationStatement();
                init.Name           = id;
                init.Type           = new CodeTypeReference(typeof(IEnumerable));
                init.InitExpression = new CodeMethodInvokeExpression(iterator, "GetEnumerator", new CodeExpression[] { });

                var condition = new CodeMethodInvokeExpression();
                condition.Method.TargetObject = new CodeVariableReferenceExpression(id);
                condition.Method.MethodName   = "MoveNext";

                var loop = new CodeIterationStatement();
                loop.InitStatement      = init;
                loop.IncrementStatement = new CodeCommentStatement(string.Empty);                                 // for C# display
                loop.TestExpression     = condition;

                var block = new CodeBlock(line, Scope, loop.Statements, CodeBlock.BlockKind.Loop, blocks.Count == 0 ? null : blocks.Peek(), InternalID, InternalID);
                block.Type = blockOpen ? CodeBlock.BlockType.Within : CodeBlock.BlockType.Expect;
                CloseTopSingleBlock();
                blocks.Push(block);

                return(new CodeStatement[] { loop, new CodeLabeledStatement(block.ExitLabel) });
            }

            case FlowWhile:
            {
                bool           blockOpen = false;
                CodeExpression condition = parts.Length > 1 ? ParseFlowParameter(parts[1], true, out blockOpen, true) : new CodePrimitiveExpression(true);
                var            loop      = new CodeIterationStatement();
                loop.TestExpression = condition;
                loop.InitStatement  = new CodeCommentStatement(string.Empty);

                var block = new CodeBlock(line, Scope, loop.Statements, CodeBlock.BlockKind.Loop, blocks.Count == 0 ? null : blocks.Peek(), InternalID, InternalID);
                block.Type = blockOpen ? CodeBlock.BlockType.Within : CodeBlock.BlockType.Expect;
                CloseTopSingleBlock();
                blocks.Push(block);

                return(new CodeStatement[] { loop, new CodeLabeledStatement(block.ExitLabel) });
            }

            case FlowBreak:
                int b = 1;
                if (parts.Length > 1)
                {
                    parts[1] = StripCommentSingle(parts[1]);
                    if (!int.TryParse(parts[1], out b) || b < 1)
                    {
                        throw new ParseException("Break parameter must be a static integer greater than zero.");
                    }
                }
                string exit = PeekLoopLabel(true, b);
                if (exit == null)
                {
                    throw new ParseException("Cannot break outside a loop");
                }
                return(new CodeStatement[] { new CodeGotoStatement(exit) });

            case FlowContinue:
                int c = 1;
                if (parts.Length > 1)
                {
                    parts[1] = StripCommentSingle(parts[1]);
                    if (!int.TryParse(parts[1], out c) || c < 1)
                    {
                        throw new ParseException("Continue parameter must be a static integer greater than zero.");
                    }
                }
                string cont = PeekLoopLabel(false, c);
                if (cont == null)
                {
                    throw new ParseException("Cannot continue outside a loop");
                }
                return(new CodeStatement[] { new CodeGotoStatement(cont) });

                #endregion Loops

                #region Return

            case FlowReturn:
                if (Scope == mainScope)
                {
                    if (parts.Length > 1)
                    {
                        throw new ParseException("Cannot have return parameter for entry point method");
                    }
                    return(new CodeStatement[] { new CodeMethodReturnStatement() });
                }
                else
                {
                    var result = parts.Length > 1 ? ParseSingleExpression(parts[1]) : new CodePrimitiveExpression(null);
                    return(new CodeStatement[] { new CodeMethodReturnStatement(result) });
                }

                #endregion Return

                #region Function

            case FunctionLocal:
            case FunctionGlobal:
            case FunctionStatic:
                // TODO: function local/global/static scoping modifiers
                break;

                #endregion Function

            default:
                throw new ParseException(ExUnexpected);
            }

            return(null);
        }
Ejemplo n.º 32
0
	protected override void GenerateConditionStatement
				(CodeConditionStatement e)
			{
				Output.Write("If ");
				GenerateExpression(e.Condition);
				Output.WriteLine(" Then");
				++Indent;
				GenerateStatements(e.TrueStatements);
				--Indent;
				CodeStatementCollection stmts = e.FalseStatements;
				if(stmts.Count > 0 || Options.ElseOnClosing)
				{
					Output.WriteLine("Else");
					++Indent;
					GenerateStatements(stmts);
					--Indent;
				}
				Output.WriteLine("End If");
			}
Ejemplo n.º 33
0
 public int VisitIf(CodeConditionStatement cond)
 {
     Analyze(this.path, cond.TrueStatements);
     Analyze(this.path, cond.FalseStatements);
     return(0);
 }
Ejemplo n.º 34
0
		private static CodeTypeMember CreatePropertyOverride(PropertyInfo pi, List<string> additionals)
		{
			CodeMemberProperty mp = new CodeMemberProperty();
			mp.Name = pi.Name;
			mp.Attributes = MemberAttributes.Override | MemberAttributes.Public;
			mp.Type = new CodeTypeReference(pi.PropertyType);
			mp.HasGet = mp.HasSet = true;

			mp.GetStatements.Add(new CodeMethodReturnStatement(new CodePropertyReferenceExpression() { PropertyName = pi.Name, TargetObject = new CodeBaseReferenceExpression() }));

			var conditionForNotify = new CodeMethodInvokeExpression() { Method = new CodeMethodReferenceExpression(new CodePropertyReferenceExpression() { PropertyName = pi.Name, TargetObject = new CodeBaseReferenceExpression() }, "Equals") };
			conditionForNotify.Parameters.Add(new CodePropertySetValueReferenceExpression());
			var setCondition = new CodeConditionStatement()
				{
					Condition = new CodeBinaryOperatorExpression() { Left = new CodePrimitiveExpression(false), Right = conditionForNotify, Operator = CodeBinaryOperatorType.IdentityEquality }

				};
			setCondition.TrueStatements.Add(new CodeAssignStatement() { Left = new CodePropertyReferenceExpression() { PropertyName = pi.Name, TargetObject = new CodeBaseReferenceExpression() }, Right = new CodePropertySetValueReferenceExpression() });

			var invokeMethod = new CodeMethodInvokeExpression() { Method = new CodeMethodReferenceExpression(new CodeThisReferenceExpression(), PropertyChangedFunctionName) };
			invokeMethod.Parameters.Add(new CodePrimitiveExpression(pi.Name));
			setCondition.TrueStatements.Add(invokeMethod);

			foreach (var additional in additionals)
			{
				invokeMethod = new CodeMethodInvokeExpression() { Method = new CodeMethodReferenceExpression(new CodeThisReferenceExpression(), PropertyChangedFunctionName) };
				invokeMethod.Parameters.Add(new CodePrimitiveExpression(additional));
				setCondition.TrueStatements.Add(invokeMethod);
			}

			mp.SetStatements.Add(setCondition);
			return mp;
		}
        public static string GenerateWrapper(WrapperClass wrapperClass, Language language)
        {
            // Namespace
            CodeNamespace _namespace = new CodeNamespace(wrapperClass.Namespace);

            // Comments
            string comment =
                @"------------------------------------------------------------------------------" + Environment.NewLine +
                @" <auto-generated>" + Environment.NewLine +
                @"     This code was generated by '.NET Wrapper Class Generator'" + Environment.NewLine +
                @"     Product Version:" + Assembly.GetExecutingAssembly().GetName().Version + Environment.NewLine + Environment.NewLine +
                @"     Changes to this file may cause incorrect behavior and will be lost if" + Environment.NewLine +
                @"     the code is regenerated." + Environment.NewLine +
                @" </auto-generated>" + Environment.NewLine +
                @" ------------------------------------------------------------------------------";

            _namespace.Comments.Add(new CodeCommentStatement(comment));

            // Class
            CodeTypeDeclaration classDeclaration = new CodeTypeDeclaration(wrapperClass.ClassName);

            classDeclaration.IsPartial = wrapperClass.Partial;
            if (wrapperClass.Sealed)
            {
                classDeclaration.TypeAttributes |= TypeAttributes.Sealed;
            }
            _namespace.Types.Add(classDeclaration);

            // Initialization
            CodeParameterDeclarationExpressionCollection initializationParameters = null;
            CodeStatementCollection initiazationStatements = null;

            if (wrapperClass.Partial)
            {
                // Initialization method
                CodeMemberMethod initializer = new CodeMemberMethod();
                classDeclaration.Members.Add(initializer);
                initializer.Name       = "InitializeWrapper";
                initializer.Attributes = MemberAttributes.Private;
                {
                    comment =
                        @"***************************************************************" + Environment.NewLine +
                        @" This method should be called by the user-provided constructor!" + Environment.NewLine +
                        @"***************************************************************";
                    initializer.Comments.Add(new CodeCommentStatement(comment));
                }
                initializationParameters = initializer.Parameters;
                initiazationStatements   = initializer.Statements;
            }
            else
            {
                // Constructor
                CodeConstructor constructor = new CodeConstructor();
                classDeclaration.Members.Add(constructor);
                constructor.Attributes   = MemberAttributes.Public;
                initializationParameters = constructor.Parameters;
                initiazationStatements   = constructor.Statements;
            }

            // Iterate over the wrapped types
            foreach (WrappedType wrappedType in wrapperClass.WrappedTypes)
            {
                // Fields
                CodeMemberField field = new CodeMemberField(wrappedType.Type, wrappedType.FieldName);
                if (wrappedType.Acquisition != Acquisition.UserManaged)
                {
                    classDeclaration.Members.Add(field);
                }
                string memberPrefix = string.Empty;
                if (wrappedType.PrefixMembers)
                {
                    memberPrefix = wrappedType.FieldName;
                    memberPrefix = memberPrefix.Substring(0, 1).ToUpper() + memberPrefix.Substring(1);
                }


                CodeFieldReferenceExpression fieldReference = new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), wrappedType.FieldName);
                if (wrappedType.Acquisition == Acquisition.Construct)
                {
                    // Instantiation
                    CodeObjectCreateExpression instantiation      = new CodeObjectCreateExpression(wrappedType.Type);
                    CodeAssignStatement        instanceAssignment = new CodeAssignStatement(fieldReference, instantiation);
                    initiazationStatements.Add(instanceAssignment);
                }
                else if (wrappedType.Acquisition == Acquisition.Parameter)
                {
                    // Pass as parameter
                    initializationParameters.Add(new CodeParameterDeclarationExpression(wrappedType.Type, wrappedType.FieldName));
                    initiazationStatements.Add(new CodeAssignStatement(fieldReference, new CodeVariableReferenceExpression(wrappedType.FieldName)));
                }
                else if (wrappedType.Acquisition == Acquisition.Property)
                {
                    // Set as property
                    CodeMemberProperty property = new CodeMemberProperty();
                    property.Attributes = MemberAttributes.Public;
                    property.HasGet     = property.HasSet = true;
                    property.Type       = new CodeTypeReference(wrappedType.Type);
                    property.Name       = wrappedType.Type.Name;
                    property.GetStatements.Add(new CodeMethodReturnStatement(fieldReference));
                    property.SetStatements.Add(new CodeAssignStatement(fieldReference, new CodeVariableReferenceExpression("value")));
                    classDeclaration.Members.Add(property);
                }

                // Methods
                foreach (WrappedMethod wrappedMethod in wrappedType.WrappedMethods)
                {
                    // Method
                    CodeMemberMethod method = new CodeMemberMethod();
                    classDeclaration.Members.Add(method);
                    method.Name       = memberPrefix + wrappedMethod.Method.Name;
                    method.ReturnType = new CodeTypeReference(wrappedMethod.Method.ReturnType);

                    Generator.SetMember(method, wrappedMethod);

                    if (!string.IsNullOrEmpty(wrappedMethod.Interface))
                    {
                        method.PrivateImplementationType = new CodeTypeReference(wrappedMethod.Interface);
                    }

                    // Parameters
                    List <CodeExpression> arguments = Generator.SetParameters(method, wrappedMethod.Method.GetParameters());

                    // Statement
                    CodeMethodInvokeExpression invocation = null;
                    if (!wrappedMethod.Method.IsStatic)
                    {
                        invocation = new CodeMethodInvokeExpression(fieldReference, wrappedMethod.Method.Name, arguments.ToArray());
                    }
                    else
                    {
                        invocation         = new CodeMethodInvokeExpression(new CodeTypeReferenceExpression(wrappedType.Type), wrappedMethod.Method.Name, arguments.ToArray());
                        method.Attributes |= MemberAttributes.Static;
                    }

                    if (wrappedMethod.Method.ReturnType == typeof(void))
                    {
                        method.Statements.Add(invocation);
                    }
                    else
                    {
                        method.Statements.Add(new CodeMethodReturnStatement(invocation));
                    }
                }

                // Properties
                foreach (WrappedProperty wrappedProperty in wrappedType.WrappedProperties)
                {
                    // Property
                    CodeMemberProperty property = new CodeMemberProperty();
                    classDeclaration.Members.Add(property);
                    property.Name = memberPrefix + wrappedProperty.Property.Name;
                    property.Type = new CodeTypeReference(wrappedProperty.Property.PropertyType);

                    Generator.SetMember(property, wrappedProperty);

                    if (!string.IsNullOrEmpty(wrappedProperty.Interface))
                    {
                        property.PrivateImplementationType = new CodeTypeReference(wrappedProperty.Interface);
                    }

                    CodePropertyReferenceExpression invocation = null;
                    if (true)                     // TODO: check if property is static
                    {
                        invocation = new CodePropertyReferenceExpression(fieldReference, wrappedProperty.Property.Name);
                    }
                    else
                    {
                    }

                    // Get statement
                    if (wrappedProperty.Get)
                    {
                        property.GetStatements.Add(new CodeMethodReturnStatement(invocation));
                    }

                    // Set statement
                    if (wrappedProperty.Set)
                    {
                        property.SetStatements.Add(new CodeAssignStatement(invocation, new CodeVariableReferenceExpression("value")));
                    }
                }

                // Events
                foreach (WrappedEvent wrappedEvent in wrappedType.WrappedEvents)
                {
                    // Event
                    MethodInfo eventDelegate = wrappedEvent.Event.EventHandlerType.GetMethod("Invoke");

                    CodeMemberEvent _event = new CodeMemberEvent();
                    classDeclaration.Members.Add(_event);
                    _event.Name = memberPrefix + wrappedEvent.Event.Name;
                    _event.Type = new CodeTypeReference(wrappedEvent.Event.EventHandlerType);

                    Generator.SetMember(_event, wrappedEvent);

                    if (!string.IsNullOrEmpty(wrappedEvent.Interface))
                    {
                        _event.PrivateImplementationType = new CodeTypeReference(wrappedEvent.Interface);
                    }

                    // Event handler/raiser
                    CodeMemberMethod eventHandler = new CodeMemberMethod();
                    classDeclaration.Members.Add(eventHandler);
                    eventHandler.Name       = string.Format("On{0}", _event.Name);
                    eventHandler.ReturnType = new CodeTypeReference(eventDelegate.ReturnType);
                    eventHandler.Attributes = MemberAttributes.Private;

                    List <CodeExpression> arguments = Generator.SetParameters(eventHandler, eventDelegate.GetParameters());

                    CodeEventReferenceExpression eventReference = new CodeEventReferenceExpression(new CodeThisReferenceExpression(), _event.Name);
                    CodeConditionStatement       conditional    = new CodeConditionStatement();
                    eventHandler.Statements.Add(conditional);
                    conditional.Condition = new CodeBinaryOperatorExpression(eventReference, CodeBinaryOperatorType.IdentityInequality, new CodePrimitiveExpression(null));

                    CodeDelegateInvokeExpression eventInvocation = new CodeDelegateInvokeExpression(eventReference, arguments.ToArray());
                    if (eventDelegate.ReturnType == typeof(void))
                    {
                        conditional.TrueStatements.Add(eventInvocation);
                    }
                    else
                    {
                        conditional.TrueStatements.Add(new CodeMethodReturnStatement(eventInvocation));
                    }

                    // Event registration
                    CodeEventReferenceExpression  wrappedEventReference = new CodeEventReferenceExpression(fieldReference, wrappedEvent.Event.Name);
                    CodeMethodReferenceExpression eventRaiserReference  = new CodeMethodReferenceExpression(new CodeThisReferenceExpression(), eventHandler.Name);
                    CodeAttachEventStatement      eventRegistration     = new CodeAttachEventStatement(wrappedEventReference, eventRaiserReference);
                    initiazationStatements.Add(eventRegistration);
                }
            }

            // Generate the code
            StringWriter    stringWriter = new StringWriter();
            CodeDomProvider codeProvider = null;

            if (language == Language.CSharp)
            {
                codeProvider = new CSharpCodeProvider();
            }
            else if (language == Language.VBNet)
            {
                codeProvider = new VBCodeProvider();
            }
            else
            {
                throw new ArgumentException("Specified language is not supported: " + language);
            }
            CodeGeneratorOptions options = new CodeGeneratorOptions();

            options.BracingStyle = "C";
            codeProvider.GenerateCodeFromNamespace(_namespace, stringWriter, options);
            return(stringWriter.ToString());
        }
Ejemplo n.º 36
0
    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.GotoStatements))  {
            // create first method to test gotos that jump ahead to a defined label with statement
            //     GENERATE (C#):
            //            public static int FirstMethod(int i) {
            //                if ((i < 1)) {
            //                    goto comehere;
            //                }
            //                return 6;
            //            comehere:
            //                return 7;
            //            }
            AddScenario ("CheckFirstMethod");
            CodeMemberMethod cmm = new CodeMemberMethod ();
            cmm.Name = "FirstMethod";
            cmm.ReturnType = new CodeTypeReference (typeof (int));
            cmm.Attributes = MemberAttributes.Public | MemberAttributes.Static;
            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))));
            class1.Members.Add (cmm);

            // create second method to test gotos that jump ahead to a defined label without a statement attached to it
            //     GENERATE (C#):
            //            public static int SecondMethod(int i) {
            //                if ((i < 1)) {
            //                    goto comehere;
            //                    return 5;
            //                }
            //                return 6;
            //            comehere:
            //                return 7;
            //            }
            AddScenario ("CheckSecondMethod");
            cmm = new CodeMemberMethod ();
            cmm.Name = "SecondMethod";
            cmm.ReturnType = new CodeTypeReference (typeof (int));
            cmm.Attributes = MemberAttributes.Public | MemberAttributes.Static;
            param = new CodeParameterDeclarationExpression (typeof (int), "i");
            cmm.Parameters.Add (param);
            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"));
            cmm.Statements.Add (new CodeMethodReturnStatement (new CodePrimitiveExpression (7)));
            class1.Members.Add (cmm);

            // create third method to test gotos that jump to a previously defined label
            //  GENERATE (C#):   
            //    public static int ThirdMethod(int i) {
            //    label:
            //        i = (i + 5);
            //        if ((i < 1)) {
            //            goto label;
            //        }
            //        return i;
            //    }
            AddScenario ("CheckThirdMethod");
            cmm = new CodeMemberMethod ();
            cmm.Name = "ThirdMethod";
            cmm.ReturnType = new CodeTypeReference (typeof (int));
            cmm.Attributes = MemberAttributes.Public | MemberAttributes.Static;
            param = new CodeParameterDeclarationExpression (typeof (int), "i");
            cmm.Parameters.Add (param);
            CodeAssignStatement assignmt = new CodeAssignStatement (new CodeArgumentReferenceExpression ("i"),
                new CodeBinaryOperatorExpression
                (new CodeArgumentReferenceExpression ("i"), CodeBinaryOperatorType.Add,
                new CodePrimitiveExpression (5)));
            cmm.Statements.Add (new CodeLabeledStatement ("label", assignmt));
            condstmt = new CodeConditionStatement (new CodeBinaryOperatorExpression (
                new CodeArgumentReferenceExpression ("i"), CodeBinaryOperatorType.LessThan, new CodePrimitiveExpression (1)),
                new CodeGotoStatement ("label"));
            cmm.Statements.Add (condstmt);
            cmm.Statements.Add (new CodeMethodReturnStatement (new CodeArgumentReferenceExpression ("i")));
            class1.Members.Add (cmm);
        }
    }
Ejemplo n.º 37
0
        /// <summary>
        /// See <see cref="CodeProcessor.ProcessGeneratedCode"/>.
        /// </summary>
        /// <param name="domainServiceDescription">The domainServiceDescription</param>
        /// <param name="codeCompileUnit">The codeCompileUnit</param>
        /// <param name="typeMapping">The typeMapping</param>
        public override void ProcessGeneratedCode(DomainServiceDescription domainServiceDescription, CodeCompileUnit codeCompileUnit, IDictionary <Type, CodeTypeDeclaration> typeMapping)
        {
            // Make sure the provider extends IAuthentication<T>
            Type genericDomainServiceType;

            AuthenticationCodeProcessor.CheckIAuthentication(domainServiceDescription, out genericDomainServiceType);

            Type userEntityType = genericDomainServiceType.GetGenericArguments()[0];

            AuthenticationCodeProcessor.CheckIUser(userEntityType);

            // Implement IPrincipal and IIdentity in the user type
            CodeTypeDeclaration entityTypeDeclaration;

            typeMapping.TryGetValue(userEntityType, out entityTypeDeclaration);

            if (entityTypeDeclaration != null)
            {
                CodeTypeReference identityInterfaceTypeReference =
                    new CodeTypeReference(typeof(IIdentity))
                {
                    Options = CodeTypeReferenceOptions.GlobalReference
                };
                CodeTypeReference principalInterfaceTypeReference =
                    new CodeTypeReference(typeof(IPrincipal))
                {
                    Options = CodeTypeReferenceOptions.GlobalReference
                };

                entityTypeDeclaration.BaseTypes.Add(identityInterfaceTypeReference);
                entityTypeDeclaration.BaseTypes.Add(principalInterfaceTypeReference);

                ////
                //// private string IIdentitiy.AuthenticationType
                ////
                CodeMemberProperty authenticationTypeProperty = new CodeMemberProperty()
                {
                    Attributes = MemberAttributes.Private | MemberAttributes.Final,
                    HasGet     = true,
                    Name       = "AuthenticationType",
                    Type       = new CodeTypeReference(typeof(string))
                };

                // get { return string.Empty; }
                authenticationTypeProperty.GetStatements.Add(new CodeMethodReturnStatement(
                                                                 new CodePropertyReferenceExpression(
                                                                     new CodeTypeReferenceExpression(typeof(string)),
                                                                     "Empty")));

                authenticationTypeProperty.PrivateImplementationType = identityInterfaceTypeReference;
                entityTypeDeclaration.Members.Add(authenticationTypeProperty);

                ////
                //// public bool IsAuthenticated
                ////
                CodeMemberProperty isAuthenticatedProperty = new CodeMemberProperty()
                {
                    Attributes = MemberAttributes.Public | MemberAttributes.Final,
                    HasGet     = true,
                    Name       = "IsAuthenticated",
                    Type       = new CodeTypeReference(typeof(bool))
                };

                // get { return (true != string.IsNullOrEmpty(this.Name)); }
                isAuthenticatedProperty.GetStatements.Add(
                    new CodeMethodReturnStatement(
                        new CodeBinaryOperatorExpression(
                            new CodePrimitiveExpression(true),
                            CodeBinaryOperatorType.IdentityInequality,
                            new CodeMethodInvokeExpression(
                                new CodeTypeReferenceExpression(typeof(string)),
                                "IsNullOrEmpty",
                                new CodePropertyReferenceExpression(
                                    new CodeThisReferenceExpression(),
                                    "Name")))));

                isAuthenticatedProperty.Comments.AddRange(
                    AuthenticationCodeProcessor.GetDocComments(Resources.ApplicationServices_CommentIsAuth));
                isAuthenticatedProperty.ImplementationTypes.Add(identityInterfaceTypeReference);
                entityTypeDeclaration.Members.Add(isAuthenticatedProperty);

                ////
                //// private string IIdentity.Name
                ////
                // VB Codegen requires us to implement a ReadOnly version of Name as well
                CodeMemberProperty namePropertyExp = new CodeMemberProperty()
                {
                    Attributes = MemberAttributes.Private | MemberAttributes.Final,
                    HasGet     = true,
                    Name       = "Name",
                    Type       = new CodeTypeReference(typeof(string))
                };

                // get { return this.Name; }
                namePropertyExp.GetStatements.Add(
                    new CodeMethodReturnStatement(
                        new CodePropertyReferenceExpression(
                            new CodeThisReferenceExpression(),
                            "Name")));

                namePropertyExp.PrivateImplementationType = identityInterfaceTypeReference;
                entityTypeDeclaration.Members.Add(namePropertyExp);

                ////
                //// private IIdentity IPrincipal.Identity
                ////
                CodeMemberProperty identityProperty = new CodeMemberProperty()
                {
                    Attributes = MemberAttributes.Private | MemberAttributes.Final,
                    HasGet     = true,
                    Name       = "Identity",
                    Type       = identityInterfaceTypeReference,
                };

                // get { return this; }
                identityProperty.GetStatements.Add(
                    new CodeMethodReturnStatement(
                        new CodeThisReferenceExpression()));

                identityProperty.PrivateImplementationType = principalInterfaceTypeReference;
                entityTypeDeclaration.Members.Add(identityProperty);

                ////
                //// public bool IsInRole(string role)
                ////
                CodeMemberMethod isInRoleMethod = new CodeMemberMethod()
                {
                    Attributes = MemberAttributes.Public | MemberAttributes.Final,
                    Name       = "IsInRole",
                    ReturnType = new CodeTypeReference(typeof(bool))
                };
                isInRoleMethod.Parameters.Add(
                    new CodeParameterDeclarationExpression(
                        new CodeTypeReference(typeof(string)),
                        "role"));

                // if (this.Roles == null)
                // {
                //     return false;
                // }
                // return this.Roles.Contains(role);
                CodeConditionStatement ifRolesNullStatement = new CodeConditionStatement();
                ifRolesNullStatement.Condition = new CodeBinaryOperatorExpression(
                    new CodePropertyReferenceExpression(
                        new CodeThisReferenceExpression(),
                        "Roles"),
                    CodeBinaryOperatorType.IdentityEquality,
                    new CodePrimitiveExpression(null));
                ifRolesNullStatement.TrueStatements.Add(
                    new CodeMethodReturnStatement(new CodePrimitiveExpression(false)));

                isInRoleMethod.Statements.Add(ifRolesNullStatement);
                isInRoleMethod.Statements.Add(
                    new CodeMethodReturnStatement(
                        new CodeMethodInvokeExpression(
                            new CodeTypeReferenceExpression(
                                new CodeTypeReference(typeof(Enumerable))
                {
                    Options = CodeTypeReferenceOptions.GlobalReference
                }),
                            "Contains",
                            new CodePropertyReferenceExpression(new CodeThisReferenceExpression(), "Roles"),
                            new CodeVariableReferenceExpression("role"))));

                isInRoleMethod.Comments.AddRange(
                    AuthenticationCodeProcessor.GetDocComments(Resources.ApplicationServices_CommentIsInRole));
                isInRoleMethod.ImplementationTypes.Add(principalInterfaceTypeReference);
                entityTypeDeclaration.Members.Add(isInRoleMethod);

                // Changes to Name need to raise change notification for IsAuthenticated. To accomplish this,
                // we'll insert a change event at the end of the "if (this._name != value)" block.
                //
                // >> this.RaisePropertyChanged("IsAuthenticated");
                CodeMemberProperty nameProperty = entityTypeDeclaration.Members.OfType <CodeMemberProperty>().Where(c => c.Name == "Name").First();
                nameProperty.SetStatements.OfType <CodeConditionStatement>().First().TrueStatements.Add(
                    new CodeExpressionStatement(
                        new CodeMethodInvokeExpression(
                            new CodeThisReferenceExpression(),
                            "RaisePropertyChanged",
                            new CodePrimitiveExpression("IsAuthenticated"))));

                // Name should be set to string.Empty by default
                CodeMemberField nameField = entityTypeDeclaration.Members.OfType <CodeMemberField>().Where(c => c.Name == "_name").Single();
                nameField.InitExpression =
                    new CodePropertyReferenceExpression(
                        new CodeTypeReferenceExpression(typeof(string)),
                        "Empty");
            }

            // Set context base type
            CodeTypeDeclaration providerTypeDeclaration;

            typeMapping.TryGetValue(domainServiceDescription.DomainServiceType, out providerTypeDeclaration);

            if (providerTypeDeclaration != null)
            {
                providerTypeDeclaration.BaseTypes.Clear();
                providerTypeDeclaration.BaseTypes.Add(
                    new CodeTypeReference(AuthenticationCodeProcessor.AuthenticationDomainContextBaseName)
                {
                    Options = CodeTypeReferenceOptions.GlobalReference
                });
            }
        }
Ejemplo n.º 38
0
			public void Visit(CodeConditionStatement o)
			{
				g.GenerateConditionStatement(o);
			}
Ejemplo n.º 39
0
        /// <summary>
        /// Create a static constructor for the data model.
        /// </summary>
        /// <param name="dataModelSchema">A description of the data model.</param>
        public LoadDataMethod(DataModelSchema dataModelSchema)
        {
            //		/// <summary>
            //		/// Loads data from the persistent store into the data model.
            //		/// </summary>
            //		private static void LoadData()
            //		{
            this.Comments.Add(new CodeCommentStatement("<summary>", true));
            this.Comments.Add(new CodeCommentStatement("Loads data from the persistent store into the data model.", true));
            this.Comments.Add(new CodeCommentStatement("</summary>", true));
            this.Name       = "LoadData";
            this.Attributes = MemberAttributes.Public | MemberAttributes.Final;

            //            try {
            CodeTryCatchFinallyStatement tryLoadData = new CodeTryCatchFinallyStatement();

            //				this.dataLock.EnterWriteLock();
            tryLoadData.TryStatements.Add(new CodeMethodInvokeExpression(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), "dataLock"), "EnterWriteLock"));

            //                global::System.Configuration.ConnectionStringSettings connectionStringSettings = global::System.Configuration.ConfigurationManager.ConnectionStrings["DataModel"];
            //                global::System.Data.SqlClient.SqlConnection sqlConnection = new global::System.Data.SqlClient.SqlConnection(connectionStringSettings.ConnectionString);
            //                sqlConnection.Open();
            tryLoadData.TryStatements.Add(new CodeVariableDeclarationStatement(new CodeGlobalTypeReference(typeof(SqlConnection)), "sqlConnection", new CodeObjectCreateExpression(new CodeGlobalTypeReference(typeof(SqlConnection)), new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), "connectionString"))));
            tryLoadData.TryStatements.Add(new CodeMethodInvokeExpression(new CodeVariableReferenceExpression("sqlConnection"), "Open"));

            //                this.EnforceConstraints = false;
            tryLoadData.TryStatements.Add(new CodeAssignStatement(new CodePropertyReferenceExpression(new CodeThisReferenceExpression(), "EnforceConstraints"), new CodePrimitiveExpression(false)));

            //                for (int tableIndex = 0; (tableIndex < this.Tables.Count); tableIndex = (tableIndex + 1)) {
            CodeIterationStatement tableLoop1 = new CodeIterationStatement(
                new CodeVariableDeclarationStatement(
                    new CodeGlobalTypeReference(typeof(Int32)),
                    "tableIndex",
                    new CodePrimitiveExpression(0)),
                new CodeBinaryOperatorExpression(
                    new CodeVariableReferenceExpression("tableIndex"),
                    CodeBinaryOperatorType.LessThan,
                    new CodePropertyReferenceExpression(new CodePropertyReferenceExpression(new CodeThisReferenceExpression(), "Tables"), "Count")),
                new CodeAssignStatement(
                    new CodeVariableReferenceExpression("tableIndex"),
                    new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("tableIndex"), CodeBinaryOperatorType.Add, new CodePrimitiveExpression(1))));

            //                    global::System.Data.DataTable dataTable = Teraque.UnitTest.Server.DataModel.Tables[tableIndex];
            tableLoop1.Statements.Add(new CodeVariableDeclarationStatement(new CodeGlobalTypeReference(typeof(DataTable)), "dataTable", new CodeIndexerExpression(new CodePropertyReferenceExpression(new CodeThisReferenceExpression(), "Tables"), new CodeVariableReferenceExpression("tableIndex"))));

            //                    global::System.Data.DataColumn rowVersionColumn = dataTable.Columns["RowVersion"];
            tableLoop1.Statements.Add(new CodeVariableDeclarationStatement(new CodeGlobalTypeReference(typeof(DataColumn)), "rowVersionColumn",
                                                                           new CodeIndexerExpression(new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("dataTable"), "Columns"), new CodePrimitiveExpression("RowVersion"))));

            //                    if (((bool)(dataTable.ExtendedProperties["IsPersistent"]))) {
            CodeConditionStatement ifPersistent = new CodeConditionStatement();

            ifPersistent.Condition = new CodeCastExpression(new CodeGlobalTypeReference(typeof(Boolean)), new CodeIndexerExpression(new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("dataTable"), "ExtendedProperties"), new CodePrimitiveExpression("IsPersistent")));

            //                        string columnList = "\"IsArchived\", \"IsDeleted\"";
            //                        for (int columnIndex = 0; (columnIndex < dataTable.Columns.Count); columnIndex = (columnIndex + 1)) {
            //                            global::System.Data.DataColumn dataColumn = dataTable.Columns[columnIndex];
            //                            if (((bool)(dataColumn.ExtendedProperties["IsPersistent"]))) {
            //                                columnList = (columnList
            //                                            + (",\""
            //                                            + (dataColumn.ColumnName + "\"")));
            //                            }
            //                        }
            ifPersistent.TrueStatements.Add(new CodeVariableDeclarationStatement(new CodeGlobalTypeReference(typeof(String)), "columnList", new CodePrimitiveExpression("\"IsArchived\", \"IsDeleted\"")));
            CodeIterationStatement columnLoop1 = new CodeIterationStatement(new CodeVariableDeclarationStatement(new CodeGlobalTypeReference(typeof(Int32)), "columnIndex", new CodePrimitiveExpression(0)), new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("columnIndex"), CodeBinaryOperatorType.LessThan, new CodePropertyReferenceExpression(new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("dataTable"), "Columns"), "Count")), new CodeAssignStatement(new CodeVariableReferenceExpression("columnIndex"), new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("columnIndex"), CodeBinaryOperatorType.Add, new CodePrimitiveExpression(1))));

            columnLoop1.Statements.Add(new CodeVariableDeclarationStatement(new CodeGlobalTypeReference(typeof(DataColumn)), "dataColumn", new CodeIndexerExpression(new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("dataTable"), "Columns"), new CodeVariableReferenceExpression("columnIndex"))));
            columnLoop1.Statements.Add(new CodeConditionStatement(new CodeCastExpression(new CodeGlobalTypeReference(typeof(Boolean)), new CodeIndexerExpression(new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("dataColumn"), "ExtendedProperties"), new CodePrimitiveExpression("IsPersistent"))),
                                                                  new CodeAssignStatement(new CodeVariableReferenceExpression("columnList"), new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("columnList"), CodeBinaryOperatorType.Add, new CodeBinaryOperatorExpression(new CodePrimitiveExpression(",\""), CodeBinaryOperatorType.Add, new CodeBinaryOperatorExpression(new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("dataColumn"), "ColumnName"), CodeBinaryOperatorType.Add, new CodePrimitiveExpression("\"")))))));
            ifPersistent.TrueStatements.Add(columnLoop1);

            //                        string selectCommand = String.Format("select {0} from \"{1}\"", columnList, dataTable.TableName);
            //                        System.Data.SqlClient.SqlCommand sqlCommand = new System.Data.SqlClient.SqlCommand(selectCommand);
            //                        sqlCommand.Connection = sqlConnection;
            //                        System.Data.SqlClient.SqlDataReader sqlDataReader = sqlCommand.ExecuteReader();
            ifPersistent.TrueStatements.Add(new CodeVariableDeclarationStatement(new CodeGlobalTypeReference(typeof(String)), "selectCommand", new CodeMethodInvokeExpression(new CodeGlobalTypeReferenceExpression(typeof(String)), "Format", new CodePrimitiveExpression("select {0} from \"{1}\""), new CodeVariableReferenceExpression("columnList"), new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("dataTable"), "TableName"))));
            ifPersistent.TrueStatements.Add(new CodeVariableDeclarationStatement(new CodeGlobalTypeReference(typeof(SqlCommand)), "sqlCommand", new CodeObjectCreateExpression(new CodeGlobalTypeReference(typeof(SqlCommand)), new CodeVariableReferenceExpression("selectCommand"))));
            ifPersistent.TrueStatements.Add(new CodeAssignStatement(new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("sqlCommand"), "Connection"), new CodeVariableReferenceExpression("sqlConnection")));
            ifPersistent.TrueStatements.Add(new CodeVariableDeclarationStatement(new CodeGlobalTypeReference(typeof(SqlDataReader)), "sqlDataReader", new CodeMethodInvokeExpression(new CodeVariableReferenceExpression("sqlCommand"), "ExecuteReader")));

            //                        for (
            //                        ; (sqlDataReader.Read() == true);
            //                        ) {
            CodeIterationStatement readLoop = new CodeIterationStatement(new CodeSnippetStatement(""), new CodeBinaryOperatorExpression(new CodeMethodInvokeExpression(new CodeVariableReferenceExpression("sqlDataReader"), "Read"), CodeBinaryOperatorType.IdentityEquality, new CodePrimitiveExpression(true)), new CodeSnippetStatement(""));

            //                            if (((((bool)(sqlDataReader["IsArchived"])) == true)
            //                                        || (((bool)(sqlDataReader["IsDeleted"])) == true))) {
            //                                long rowVersion = ((long)(sqlDataReader["RowVersion"]));
            //                                if ((rowVersion > Teraque.UnitTest.Server.DataModel.masterRowVersion)) {
            //                                    Teraque.UnitTest.Server.DataModel.masterRowVersion = rowVersion;
            //                                }
            //                            }
            CodeConditionStatement activeRecords = new CodeConditionStatement(new CodeBinaryOperatorExpression(new CodeBinaryOperatorExpression(new CodeCastExpression(typeof(Boolean), new CodeIndexerExpression(new CodeVariableReferenceExpression("sqlDataReader"), new CodePrimitiveExpression("IsArchived"))), CodeBinaryOperatorType.IdentityEquality, new CodePrimitiveExpression(true)), CodeBinaryOperatorType.BooleanOr, new CodeBinaryOperatorExpression(new CodeCastExpression(typeof(Boolean), new CodeIndexerExpression(new CodeVariableReferenceExpression("sqlDataReader"), new CodePrimitiveExpression("IsDeleted"))), CodeBinaryOperatorType.IdentityEquality, new CodePrimitiveExpression(true))));

            activeRecords.TrueStatements.Add(new CodeVariableDeclarationStatement(new CodeGlobalTypeReference(typeof(Int64)), "rowVersion", new CodeCastExpression(typeof(Int64), new CodeIndexerExpression(new CodeVariableReferenceExpression("sqlDataReader"), new CodePrimitiveExpression("RowVersion")))));
            CodeConditionStatement ifRowVersionUpdate = new CodeConditionStatement(
                new CodeBinaryOperatorExpression(
                    new CodeVariableReferenceExpression("rowVersion"),
                    CodeBinaryOperatorType.GreaterThan,
                    new CodePropertyReferenceExpression(new CodeThisReferenceExpression(), "rowVersion")));

            ifRowVersionUpdate.TrueStatements.Add(
                new CodeAssignStatement(
                    new CodePropertyReferenceExpression(new CodeThisReferenceExpression(), "rowVersion"),
                    new CodeVariableReferenceExpression("rowVersion")));
            activeRecords.TrueStatements.Add(ifRowVersionUpdate);

            //                            else {
            //                                global::System.Data.DataRow dataRow = dataTable.NewRow();
            activeRecords.FalseStatements.Add(new CodeVariableDeclarationStatement(new CodeGlobalTypeReference(typeof(DataRow)), "dataRow", new CodeMethodInvokeExpression(new CodeVariableReferenceExpression("dataTable"), "NewRow")));

            //                                for (int ordinal = 0; (ordinal < sqlDataReader.FieldCount); ordinal = (ordinal + 1)) {
            //                                    global::System.Data.DataColumn destinationColumn = dataTable.Columns[sqlDataReader.GetName(ordinal)];
            //                                    if ((destinationColumn != null)) {
            //                                        dataRow[destinationColumn] = sqlDataReader.GetValue(ordinal);
            //                                    }
            //                                }
            CodeIterationStatement ordinalLoop = new CodeIterationStatement(new CodeVariableDeclarationStatement(new CodeGlobalTypeReference(typeof(Int32)), "ordinal", new CodePrimitiveExpression(0)), new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("ordinal"), CodeBinaryOperatorType.LessThan, new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("sqlDataReader"), "FieldCount")), new CodeAssignStatement(new CodeVariableReferenceExpression("ordinal"), new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("ordinal"), CodeBinaryOperatorType.Add, new CodePrimitiveExpression(1))));

            ordinalLoop.Statements.Add(new CodeVariableDeclarationStatement(new CodeGlobalTypeReference(typeof(DataColumn)), "destinationColumn", new CodeIndexerExpression(new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("dataTable"), "Columns"), new CodeMethodInvokeExpression(new CodeVariableReferenceExpression("sqlDataReader"), "GetName", new CodeVariableReferenceExpression("ordinal")))));
            ordinalLoop.Statements.Add(new CodeConditionStatement(new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("destinationColumn"), CodeBinaryOperatorType.IdentityInequality, new CodePrimitiveExpression(null)),
                                                                  new CodeAssignStatement(new CodeIndexerExpression(new CodeVariableReferenceExpression("dataRow"), new CodeVariableReferenceExpression("destinationColumn")), new CodeMethodInvokeExpression(new CodeVariableReferenceExpression("sqlDataReader"), "GetValue", new CodeVariableReferenceExpression("ordinal")))));
            activeRecords.FalseStatements.Add(ordinalLoop);

            //                                dataTable.Rows.Add(dataRow);
            //                                if ((((long)(dataRow["RowVersion"])) > Teraque.UnitTest.Server.DataModel.masterRowVersion)) {
            //                                    Teraque.UnitTest.Server.DataModel.masterRowVersion = ((long)(dataRow["RowVersion"]));
            //                                }
            activeRecords.FalseStatements.Add(new CodeMethodInvokeExpression(new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("dataTable"), "Rows"), "Add", new CodeVariableReferenceExpression("dataRow")));
            CodeConditionStatement ifBiggerRowVersion = new CodeConditionStatement(
                new CodeBinaryOperatorExpression(
                    new CodeCastExpression(
                        new CodeGlobalTypeReference(typeof(Int64)),
                        new CodeIndexerExpression(new CodeVariableReferenceExpression("dataRow"), new CodePrimitiveExpression("RowVersion"))),
                    CodeBinaryOperatorType.GreaterThan,
                    new CodePropertyReferenceExpression(new CodeThisReferenceExpression(), "rowVersion")));

            ifBiggerRowVersion.TrueStatements.Add(
                new CodeAssignStatement(
                    new CodePropertyReferenceExpression(new CodeThisReferenceExpression(), "rowVersion"),
                    new CodeCastExpression(
                        new CodeGlobalTypeReference(typeof(Int64)),
                        new CodeIndexerExpression(new CodeVariableReferenceExpression("dataRow"), new CodePrimitiveExpression("RowVersion")))));
            activeRecords.FalseStatements.Add(ifBiggerRowVersion);

            //                            }
            readLoop.Statements.Add(activeRecords);

            //                        }
            //                        sqlDataReader.Close();
            ifPersistent.TrueStatements.Add(readLoop);
            ifPersistent.TrueStatements.Add(new CodeMethodInvokeExpression(new CodeVariableReferenceExpression("sqlDataReader"), "Close"));

            //                    }
            tableLoop1.Statements.Add(ifPersistent);

            //                }
            tryLoadData.TryStatements.Add(tableLoop1);

            //                Teraque.UnitTest.Server.DataModel.dataSet.EnforceConstraints = true;
            tryLoadData.TryStatements.Add(
                new CodeAssignStatement(new CodePropertyReferenceExpression(new CodeThisReferenceExpression(), "EnforceConstraints"), new CodePrimitiveExpression(true)));

            //				global::System.Collections.Generic.List<object> transactionLogItem = new global::System.Collections.Generic.List<object>();
            tryLoadData.TryStatements.Add(
                new CodeVariableDeclarationStatement(
                    new CodeGlobalTypeReference(typeof(List <Object>)),
                    "transactionLogItem",
                    new CodeObjectCreateExpression(
                        new CodeGlobalTypeReference(typeof(List <Object>)))));

            //				for (int tableIndex = 0; (tableIndex < DataModel.Tables.Count); tableIndex = (tableIndex + 1))
            //				{
            CodeIterationStatement tableLoop = new CodeIterationStatement(
                new CodeVariableDeclarationStatement(
                    new CodeGlobalTypeReference(typeof(Int32)), "tableIndex", new CodePrimitiveExpression(0)),
                new CodeBinaryOperatorExpression(
                    new CodeVariableReferenceExpression("tableIndex"),
                    CodeBinaryOperatorType.LessThan,
                    new CodePropertyReferenceExpression(
                        new CodePropertyReferenceExpression(new CodeThisReferenceExpression(), "Tables"), "Count")),
                new CodeAssignStatement(
                    new CodeVariableReferenceExpression("tableIndex"),
                    new CodeBinaryOperatorExpression(
                        new CodeVariableReferenceExpression("tableIndex"),
                        CodeBinaryOperatorType.Add,
                        new CodePrimitiveExpression(1))));

            //					global::System.Data.DataTable dataTable = DataModel.dataSet.Tables[tableIndex];
            tableLoop.Statements.Add(
                new CodeVariableDeclarationStatement(
                    new CodeGlobalTypeReference(typeof(DataTable)),
                    "dataTable",
                    new CodeIndexerExpression(
                        new CodePropertyReferenceExpression(new CodeThisReferenceExpression(), "Tables"),
                        new CodeVariableReferenceExpression("tableIndex"))));

            //					for (int rowIndex = 0; (rowIndex < dataTable.Rows.Count); rowIndex = (rowIndex + 1))
            //					{
            CodeIterationStatement rowLoop = new CodeIterationStatement(
                new CodeVariableDeclarationStatement(
                    new CodeGlobalTypeReference(typeof(Int32)), "rowIndex", new CodePrimitiveExpression(0)),
                new CodeBinaryOperatorExpression(
                    new CodeVariableReferenceExpression("rowIndex"),
                    CodeBinaryOperatorType.LessThan,
                    new CodePropertyReferenceExpression(
                        new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("dataTable"), "Rows"),
                        "Count")),
                new CodeAssignStatement(
                    new CodeVariableReferenceExpression("rowIndex"),
                    new CodeBinaryOperatorExpression(
                        new CodeVariableReferenceExpression("rowIndex"),
                        CodeBinaryOperatorType.Add,
                        new CodePrimitiveExpression(1))));

            //						DataModel.Initialize(((global::Teraque.IRow)(dataTable.Rows[rowIndex])), transactionLogItem);
            rowLoop.Statements.Add(
                new CodeMethodInvokeExpression(
                    new CodeThisReferenceExpression(),
                    "SequenceRecord",
                    new CodeCastExpression(new CodeGlobalTypeReference(typeof(IRow)),
                                           new CodeIndexerExpression(
                                               new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("dataTable"), "Rows"),
                                               new CodeVariableReferenceExpression("rowIndex"))),
                    new CodeVariableReferenceExpression("transactionLogItem")));

            //					}
            tableLoop.Statements.Add(rowLoop);

            //				}
            tryLoadData.TryStatements.Add(tableLoop);

            //            }

            //            catch (global::System.Data.ConstraintException constraintException) {
            //                for (int tableIndex = 0; (tableIndex < Teraque.UnitTest.Server.DataModel.Tables.Count); tableIndex = (tableIndex + 1)) {
            //                    global::System.Data.DataTable dataTable = Teraque.UnitTest.Server.DataModel.Tables[tableIndex];
            //                    for (int rowIndex = 0; (rowIndex < dataTable.Rows.Count); rowIndex = (rowIndex + 1)) {
            //                        global::System.Data.DataRow dataRow = dataTable.Rows[rowIndex];
            //                        if ((dataRow.HasErrors == true)) {
            //                            Log.Error("Error in \'{0}\': {1}", dataRow.Table.TableName, dataRow.RowError);
            //                        }
            //                    }
            //                }
            //                throw constraintException;
            //            }
            CodeCatchClause        catchConstraint     = new CodeCatchClause("constraintException", new CodeGlobalTypeReference(typeof(ConstraintException)));
            CodeIterationStatement constraintTableLoop = new CodeIterationStatement(new CodeVariableDeclarationStatement(new CodeGlobalTypeReference(typeof(Int32)), "tableIndex", new CodePrimitiveExpression(0)), new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("tableIndex"), CodeBinaryOperatorType.LessThan, new CodePropertyReferenceExpression(new CodePropertyReferenceExpression(new CodeThisReferenceExpression(), "Tables"), "Count")), new CodeAssignStatement(new CodeVariableReferenceExpression("tableIndex"), new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("tableIndex"), CodeBinaryOperatorType.Add, new CodePrimitiveExpression(1))));

            constraintTableLoop.Statements.Add(new CodeVariableDeclarationStatement(new CodeGlobalTypeReference(typeof(DataTable)), "dataTable", new CodeIndexerExpression(new CodePropertyReferenceExpression(new CodeThisReferenceExpression(), "Tables"), new CodeVariableReferenceExpression("tableIndex"))));
            CodeIterationStatement constraintRowLoop = new CodeIterationStatement(new CodeVariableDeclarationStatement(new CodeGlobalTypeReference(typeof(Int32)), "rowIndex", new CodePrimitiveExpression(0)), new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("rowIndex"), CodeBinaryOperatorType.LessThan, new CodePropertyReferenceExpression(new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("dataTable"), "Rows"), "Count")), new CodeAssignStatement(new CodeVariableReferenceExpression("rowIndex"), new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("rowIndex"), CodeBinaryOperatorType.Add, new CodePrimitiveExpression(1))));

            constraintRowLoop.Statements.Add(new CodeVariableDeclarationStatement(new CodeGlobalTypeReference(typeof(DataRow)), "dataRow", new CodeIndexerExpression(new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("dataTable"), "Rows"), new CodeVariableReferenceExpression("rowIndex"))));
            constraintRowLoop.Statements.Add(new CodeConditionStatement(new CodeBinaryOperatorExpression(new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("dataRow"), "HasErrors"), CodeBinaryOperatorType.IdentityEquality, new CodePrimitiveExpression(true)),
                                                                        new CodeExpressionStatement(new CodeMethodInvokeExpression(new CodeGlobalTypeReferenceExpression(typeof(Log)), "Error", new CodePrimitiveExpression("Error in '{0}': {1}"), new CodePropertyReferenceExpression(new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("dataRow"), "Table"), "TableName"), new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("dataRow"), "RowError")))));
            constraintTableLoop.Statements.Add(constraintRowLoop);
            catchConstraint.Statements.Add(constraintTableLoop);
            catchConstraint.Statements.Add(new CodeThrowExceptionStatement(new CodeVariableReferenceExpression("constraintException")));
            tryLoadData.CatchClauses.Add(catchConstraint);

            //            catch (global::System.Data.SqlClient.SqlException sqlException) {
            //                for (int errorIndex = 0; (errorIndex < sqlException.Errors.Count); errorIndex = (errorIndex + 1)) {
            //                    Log.Error(sqlException.Errors[errorIndex].Message);
            //                }
            //                throw sqlException;
            //            }
            CodeCatchClause        catchSqlException = new CodeCatchClause("sqlException", new CodeGlobalTypeReference(typeof(SqlException)));
            CodeIterationStatement sqlErrorLoop      = new CodeIterationStatement(new CodeVariableDeclarationStatement(new CodeGlobalTypeReference(typeof(Int32)), "errorIndex", new CodePrimitiveExpression(0)), new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("errorIndex"), CodeBinaryOperatorType.LessThan, new CodePropertyReferenceExpression(new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("sqlException"), "Errors"), "Count")), new CodeAssignStatement(new CodeVariableReferenceExpression("errorIndex"), new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("errorIndex"), CodeBinaryOperatorType.Add, new CodePrimitiveExpression(1))));

            sqlErrorLoop.Statements.Add(new CodeMethodInvokeExpression(new CodeGlobalTypeReferenceExpression(typeof(Log)), "Error", new CodePropertyReferenceExpression(new CodeIndexerExpression(new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("sqlException"), "Errors"), new CodeVariableReferenceExpression("errorIndex")), "Message")));
            catchSqlException.Statements.Add(sqlErrorLoop);
            catchSqlException.Statements.Add(new CodeThrowExceptionStatement(new CodeVariableReferenceExpression("sqlException")));
            tryLoadData.CatchClauses.Add(catchSqlException);
            this.Statements.Add(tryLoadData);

            //			}
            //			finally
            //			{
            //				DataModel.dataLock.ExitWriteLock();
            //			}
            tryLoadData.FinallyStatements.Add(
                new CodeMethodInvokeExpression(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), "dataLock"), "ExitWriteLock"));

            //        }
        }
Ejemplo n.º 40
0
        public void ForLoops()
        {
            var nspace = new CodeNamespace("NSPC");

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

            var cmm = new CodeMemberMethod();
            cmm.Name = "TestBasicIterationStatement";
            cmm.Attributes = MemberAttributes.Public | MemberAttributes.Static;
            cmm.Statements.Add(new CodeVariableDeclarationStatement(new CodeTypeReference(typeof(int)), "i"));
            cmm.Statements.Add(new CodeIterationStatement(new CodeAssignStatement(new
                CodeVariableReferenceExpression("i"), new CodePrimitiveExpression(1)),
                new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("i"),
                CodeBinaryOperatorType.LessThan, new CodePrimitiveExpression(8)),
                new CodeAssignStatement(new CodeVariableReferenceExpression("i"),
                new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("i"), CodeBinaryOperatorType.Multiply,
                new CodePrimitiveExpression(2)))));
            cmm.ReturnType = new CodeTypeReference(typeof(int));
            cmm.Statements.Add(new CodeMethodReturnStatement(new CodeVariableReferenceExpression("i")));
            class1.Members.Add(cmm);

            cmm = new CodeMemberMethod();
            cmm.Name = "TestComplexIterationStatement";
            cmm.Attributes = MemberAttributes.Public | MemberAttributes.Static;
            cmm.ReturnType = new CodeTypeReference(typeof(int));
            cmm.Statements.Add(new CodeVariableDeclarationStatement(new CodeTypeReference(typeof(int)), "i"));
            cmm.Statements.Add(new CodeVariableDeclarationStatement(new CodeTypeReference(typeof(int)), "a", new CodePrimitiveExpression(7)));
            cmm.Statements.Add(new CodeVariableDeclarationStatement(new CodeTypeReference(typeof(int)), "b"));
            cmm.Statements.Add(new CodeVariableDeclarationStatement(new CodeTypeReference(typeof(int)), "c", new CodePrimitiveExpression(9)));
            cmm.Statements.Add(new CodeVariableDeclarationStatement(new CodeTypeReference(typeof(int)), "d", new CodePrimitiveExpression(2)));
            CodeIterationStatement iteration = new CodeIterationStatement();
            iteration.IncrementStatement = new CodeAssignStatement(new CodeVariableReferenceExpression("i"),
                new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("i"), CodeBinaryOperatorType.Add,
                new CodePrimitiveExpression(1)));
            iteration.InitStatement = new CodeAssignStatement(new CodeVariableReferenceExpression("i"), new
                CodePrimitiveExpression(0));
            iteration.TestExpression = (new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("i"),
                CodeBinaryOperatorType.LessThan, new CodePrimitiveExpression(2)));
            CodeConditionStatement secondIf = new CodeConditionStatement(new CodeBinaryOperatorExpression(
                new CodeVariableReferenceExpression("c"), CodeBinaryOperatorType.LessThan, new CodePrimitiveExpression(10)),
                new CodeAssignStatement(new CodeVariableReferenceExpression("d"), new CodeBinaryOperatorExpression(
                new CodeVariableReferenceExpression("d"), CodeBinaryOperatorType.Subtract, new CodePrimitiveExpression(1))));

            CodeIterationStatement secondFor = new CodeIterationStatement();
            secondFor.Statements.Add(secondIf);
            secondFor.IncrementStatement = new CodeAssignStatement(new CodeVariableReferenceExpression("b"),
                new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("b"), CodeBinaryOperatorType.Add,
                new CodePrimitiveExpression(1)));
            secondFor.InitStatement = new CodeAssignStatement(new CodeVariableReferenceExpression("b"), new
                CodePrimitiveExpression(0));
            secondFor.TestExpression = (new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("b"),
                CodeBinaryOperatorType.LessThan, new CodePrimitiveExpression(2)));
            secondFor.Statements.Add(new CodeAssignStatement(new CodeVariableReferenceExpression("d"),
                new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("d"), CodeBinaryOperatorType.Multiply,
                new CodePrimitiveExpression(2))));

            CodeConditionStatement firstIf = new CodeConditionStatement();
            firstIf.Condition = new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("a"), CodeBinaryOperatorType.LessThan,
                new CodePrimitiveExpression(16));
            firstIf.TrueStatements.Add(secondFor);

            iteration.Statements.Add(firstIf);
            cmm.Statements.Add(iteration);
            cmm.Statements.Add(new CodeMethodReturnStatement(new CodeVariableReferenceExpression("d")));
            class1.Members.Add(cmm);

            AssertEqual(nspace,
                @"namespace NSPC {
                      public class ClassWithMethod {
                          public static int TestBasicIterationStatement() {
                              int i;
                              for (i = 1; (i < 8); i = (i * 2)) {
                              }
                              return i;
                          }
                          public static int TestComplexIterationStatement() {
                              int i;
                              int a = 7;
                              int b;
                              int c = 9;
                              int d = 2;
                              for (i = 0; (i < 2); i = (i + 1)) {
                                  if ((a < 16)) {
                                      for (b = 0; (b < 2); b = (b + 1)) {
                                          if ((c < 10)) {
                                              d = (d - 1);
                                          }
                                          d = (d * 2);
                                      }
                                  }
                              }
                              return d;
                          }
                      }
                  }");
        }
        private static CodeNamespace CreateMimsyNamespace()
        {
            var mimsyNamespace = new CodeNamespace("Mimsy");

            mimsyNamespace.Imports.AddRange(new[]
            {
                new CodeNamespaceImport("System"),
                new CodeNamespaceImport("System.Text"),
                new CodeNamespaceImport("System.Collections")
            });

            var jubjubClass = new CodeTypeDeclaration("Jubjub")
            {
                TypeAttributes = TypeAttributes.Public
            };
            var wabeCountFld = new CodeMemberField(typeof(int), "_wabeCount")
            {
                Attributes = MemberAttributes.Private
            };

            jubjubClass.Members.Add(wabeCountFld);

            var typrefArrayList = new CodeTypeReference("ArrayList");
            var updatesFld      = new CodeMemberField(typrefArrayList, "_updates");

            jubjubClass.Members.Add(updatesFld);
            mimsyNamespace.Types.Add(jubjubClass);
            var jubjubCtor = new CodeConstructor {
                Attributes = MemberAttributes.Public
            };
            var jubjubCtorParam = new CodeParameterDeclarationExpression(typeof(int), "wabeCount");

            jubjubCtor.Parameters.Add(jubjubCtorParam);

            var refUpdatesFld = new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), "_updates");
            var newArrayList  = new CodeObjectCreateExpression(typrefArrayList);
            var assignUpdates = new CodeAssignStatement(refUpdatesFld, newArrayList);

            jubjubCtor.Statements.Add(assignUpdates);

            var refWabeCountFld  = new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), "_wabeCount");
            var refWabeCountProp = new CodePropertyReferenceExpression(new CodeThisReferenceExpression(), "WabeCount");
            var refWabeCountArg  = new CodeArgumentReferenceExpression("wabeCount");
            var assignWabeCount  = new CodeAssignStatement(refWabeCountProp, refWabeCountArg);

            jubjubCtor.Statements.Add(assignWabeCount);
            jubjubClass.Members.Add(jubjubCtor);
            var wabeCountProp = new CodeMemberProperty
            {
                Attributes = (MemberAttributes)24578,
                Type       = new CodeTypeReference(typeof(int)),
                Name       = "WabeCount"
            };

            wabeCountProp.GetStatements.Add(new CodeMethodReturnStatement(refWabeCountFld));
            var suppliedPropertyValue = new CodePropertySetValueReferenceExpression();
            var zero = new CodePrimitiveExpression(0);
            var suppliedPropValIsLessThanZero = new CodeBinaryOperatorExpression(suppliedPropertyValue,
                                                                                 CodeBinaryOperatorType.LessThan, zero);
            var testSuppliedPropValAndAssign = new CodeConditionStatement(suppliedPropValIsLessThanZero,
                                                                          new CodeStatement[] { new CodeAssignStatement(refWabeCountFld, zero) },
                                                                          new CodeStatement[] { new CodeAssignStatement(refWabeCountFld, suppliedPropertyValue) });

            wabeCountProp.SetStatements.Add(testSuppliedPropValAndAssign);
            wabeCountProp.SetStatements.Add(
                new CodeMethodInvokeExpression(new CodeMethodReferenceExpression(refUpdatesFld, "Add"), refWabeCountFld));
            jubjubClass.Members.Add(wabeCountProp);
            var methGetWabeCountHistory = new CodeMemberMethod
            {
                Attributes = (MemberAttributes)24578,
                Name       = "GetWabeCountHistory",
                ReturnType = new CodeTypeReference(typeof(string))
            };

            jubjubClass.Members.Add(methGetWabeCountHistory);
            methGetWabeCountHistory.Statements.Add(new CodeVariableDeclarationStatement("StringBuilder", "result"));
            var refResultVar = new CodeVariableReferenceExpression("result");

            methGetWabeCountHistory.Statements.Add(new CodeAssignStatement(refResultVar,
                                                                           new CodeObjectCreateExpression("StringBuilder")));
            methGetWabeCountHistory.Statements.Add(new CodeVariableDeclarationStatement(typeof(int), "ndx"));
            var refNdxVar = new CodeVariableReferenceExpression("ndx");

            methGetWabeCountHistory.Statements.Add(
                new CodeIterationStatement(new CodeAssignStatement(refNdxVar, new CodePrimitiveExpression(0)),
                                           new CodeBinaryOperatorExpression(refNdxVar, CodeBinaryOperatorType.LessThan,
                                                                            new CodePropertyReferenceExpression(refUpdatesFld, "Count")),
                                           new CodeAssignStatement(refNdxVar,
                                                                   new CodeBinaryOperatorExpression(refNdxVar, CodeBinaryOperatorType.Add, new CodePrimitiveExpression(1))),
                                           new CodeConditionStatement(
                                               new CodeBinaryOperatorExpression(refNdxVar, CodeBinaryOperatorType.ValueEquality,
                                                                                new CodePrimitiveExpression(0)),
                                               new CodeStatement[]
            {
                new CodeExpressionStatement(
                    new CodeMethodInvokeExpression(new CodeMethodReferenceExpression(refResultVar, "AppendFormat"),
                                                   new CodePrimitiveExpression("{0}"), new CodeArrayIndexerExpression(refUpdatesFld, refNdxVar)))
            },
                                               new CodeStatement[]
            {
                new CodeExpressionStatement(
                    new CodeMethodInvokeExpression(new CodeMethodReferenceExpression(refResultVar, "AppendFormat"),
                                                   new CodePrimitiveExpression(", {0}"),
                                                   new CodeArrayIndexerExpression(refUpdatesFld, refNdxVar)))
            })));

            methGetWabeCountHistory.Statements.Add(
                new CodeMethodReturnStatement(
                    new CodeMethodInvokeExpression(new CodeMethodReferenceExpression(refResultVar, "ToString"))));

            return(mimsyNamespace);
        }
Ejemplo n.º 42
0
        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) {
                          }
                      }
                  }");
        }
Ejemplo n.º 43
0
        private void AddObjectItems(CodeTypeDeclaration codeType, string withEnumChoice, bool useSingular, CodeMemberProperty codeTypeMember, IList <string> nameOrder)
        {
            var propertyName          = "Object" + codeTypeMember.Name;
            var fieldName             = "object" + codeTypeMember.Name;
            var returnName            = "ObjectItem";
            var constructorParameters = new List <CodeExpression> {
                new CodeThisReferenceExpression(), new CodePrimitiveExpression(codeTypeMember.Name)
            };

            if (!useSingular)
            {
                returnName += "s";

                if (nameOrder != null)
                {
                    var stringArray = new List <CodeExpression>();
                    stringArray.AddRange(nameOrder.Select(m => new CodePrimitiveExpression(m)));
                    var newOrderArray = new CodeArrayCreateExpression(typeof(string), stringArray.ToArray());
                    constructorParameters.Add(newOrderArray);
                }
            }

            var codeMethodReferenceExpression = new CodeMethodReferenceExpression(null, "ObjectItems");
            var returnType = new CodeTypeReference(returnName);

            List <CodeStatement> trueStatements = null;

            if (string.IsNullOrEmpty(withEnumChoice))
            {
                trueStatements = new List <CodeStatement>
                {
                    new CodeVariableDeclarationStatement(typeof(Dictionary <System.Type, string>), "typeMapping",
                                                         new CodeObjectCreateExpression(typeof(Dictionary <System.Type, string>)))
                };

                // We need to add a type mapping since we have not access to a choice name.
                foreach (var customAttribute in codeTypeMember.CustomAttributes.OfType <CodeAttributeDeclaration>())
                {
                    if (customAttribute.Name == xmlElementAttributeString)
                    {
                        var name = ((CodePrimitiveExpression)customAttribute.Arguments[0].Value).Value;
                        var type = ((CodeTypeOfExpression)customAttribute.Arguments[1].Value).Type.BaseType;
                        trueStatements.Add(
                            new CodeExpressionStatement(
                                new CodeMethodInvokeExpression(
                                    new CodeVariableReferenceExpression("typeMapping"),
                                    "Add",
                                    new CodeSnippetExpression("typeof(" + type + ")"),
                                    new CodePrimitiveExpression(name)
                                    )
                                )
                            );
                    }
                }

                constructorParameters.Add(new CodeVariableReferenceExpression("typeMapping"));
            }
            else
            {
                var typeArgument = new CodeTypeReference(new CodeTypeParameter(withEnumChoice));
                codeMethodReferenceExpression.TypeArguments.Add(typeArgument);
                returnType.TypeArguments.Add(typeArgument);
            }

            var property = new CodeMemberProperty
            {
                Name = propertyName,
                Type = returnType
            };
            var assignment1 =
                new CodeConditionStatement(
                    new CodeBinaryOperatorExpression(
                        new CodeVariableReferenceExpression(fieldName),
                        CodeBinaryOperatorType.ValueEquality,
                        new CodePrimitiveExpression()
                        )
                    );

            if (trueStatements != null)
            {
                assignment1.TrueStatements.AddRange(trueStatements.ToArray());
            }

            assignment1.TrueStatements.Add(
                new CodeAssignStatement(
                    new CodeVariableReferenceExpression(fieldName),
                    new CodeObjectCreateExpression(
                        returnType,
                        constructorParameters.ToArray()
                        )
                    ));

            property.GetStatements.Add(assignment1);
            property.GetStatements.Add(new CodeMethodReturnStatement(new CodeVariableReferenceExpression(fieldName)));

            codeType.Members.Add(property);
            codeType.Members.Add(new CodeMemberField(returnType, fieldName));
        }
	protected override void GenerateConditionStatement
				(CodeConditionStatement e)
			{
				Output.Write("if (");
				GenerateExpression(e.Condition);
				Output.Write(")");
				StartBlock();
				GenerateStatements(e.TrueStatements);
				EndBlock();
				CodeStatementCollection stmts = e.FalseStatements;
				if(stmts.Count > 0 || Options.ElseOnClosing)
				{
					Output.Write("else");
					StartBlock();
					GenerateStatements(stmts);
					EndBlock();
				}
			}
Ejemplo n.º 45
0
        /// <summary>
        /// Creates the CodeDOM for a method to insert a record into a table using transacted logic.
        /// </summary>
        /// <param name="tableSchema">A description of the table.</param>
        public CreateMethod(TableSchema tableSchema)
        {
            // Create a matrix of parameters for this operation.
            CreateParameterMatrix createParameterMatrix = new CreateParameterMatrix(tableSchema);

            //        /// <summary>
            //        /// Creates a Employee record.
            //        /// </summary>
            //        /// <param name="age">The required value for the Age column.</param>
            //        /// <param name="departmentId">The required value for the DepartmentId column.</param>
            //        /// <param name="employeeId">The required value for the EmployeeId column.</param>
            //        /// <param name="raceCode">The optional value for the RaceCode column.</param>
            //        [global::System.ServiceModel.OperationBehaviorAttribute(TransactionScopeRequired=true)]
            //        [Teraque.ClaimsPrincipalPermission(System.Security.Permissions.SecurityAction.Demand, ClaimType=Teraque.ClaimTypes.Create, Resource=Teraque.Resources.Application)]
            //        public void CreateEmployee(int age, int departmentId, int employeeId, object raceCode) {
            this.Comments.Add(new CodeCommentStatement("<summary>", true));
            this.Comments.Add(new CodeCommentStatement(String.Format("Creates a {0} record.", tableSchema.Name), true));
            this.Comments.Add(new CodeCommentStatement("</summary>", true));
            foreach (KeyValuePair <string, ExternalParameterItem> parameterPair in createParameterMatrix.ExternalParameterItems)
            {
                this.Comments.Add(new CodeCommentStatement(String.Format("<param name=\"{0}\">{1}</param>", parameterPair.Value.Name, parameterPair.Value.Description), true));
            }
            this.Attributes = MemberAttributes.Public | MemberAttributes.Final;
            this.Name       = String.Format("Create{0}", tableSchema.Name);
            foreach (KeyValuePair <string, ExternalParameterItem> parameterPair in createParameterMatrix.ExternalParameterItems)
            {
                this.Parameters.Add(parameterPair.Value.CodeParameterDeclarationExpression);
            }

            //			DataModelTransaction o1881 = DataModel.CurrentTransaction;
            CodeVariableReferenceExpression transactionExpression = new CodeRandomVariableReferenceExpression();

            this.Statements.Add(new CodeCreateTransactionStatement(tableSchema.DataModel, transactionExpression));

            //			if ((configurationId == null))
            //			{
            //				configurationId = "";
            //			}
            //			if ((indexName == null))
            //			{
            //				indexName = "";
            //			}
            foreach (ColumnSchema columnSchema in tableSchema.Columns.Values)
            {
                if (columnSchema.IsNullable || columnSchema.DefaultValue != DBNull.Value)
                {
                    //			if ((indexName == null))
                    //			{
                    //				indexName = "";
                    //			}
                    CodeConditionStatement ifIsNull = new CodeConditionStatement(
                        new CodeBinaryOperatorExpression(
                            new CodeArgumentReferenceExpression(CommonConversion.ToCamelCase(columnSchema.Name)),
                            CodeBinaryOperatorType.IdentityEquality,
                            new CodePrimitiveExpression(null)));
                    ifIsNull.TrueStatements.Add(
                        new CodeAssignStatement(new CodeArgumentReferenceExpression(CommonConversion.ToCamelCase(columnSchema.Name)), CodeConvert.CreateConstantExpression(columnSchema.DefaultValue)));
                    this.Statements.Add(ifIsNull);
                }
            }

            //            Teraque.UnitTest.Server.DataModel.DepartmentRow departmentRowByFK_Department_Employee = Teraque.UnitTest.Server.DataModel.Department.FindByDepartmentId(new object[] {
            //                        departmentId});
            //            if ((departmentRowByFK_Department_Employee == null)) {
            //                throw new global::System.ServiceModel.FaultException<RecordNotFoundFault>(new global::Teraque.RecordNotFoundFault("Attempt to access a Department record ({0}) that doesn\'t exist", departmentId));
            //            }
            //            // This record locked for reading for the duration of the transaction.
            //            departmentRowByFK_Department_Employee.AcquireReaderLock(middleTierTransaction.AdoResourceManager.Guid, Teraque.UnitTest.Server.DataModel.lockTimeout);
            //            middleTierTransaction.AdoResourceManager.AddLock(departmentRowByFK_Department_Employee);
            //            // This makes sure the record wasn't deleted in the time between when it was found and the time it was locked.
            //            if ((departmentRowByFK_Department_Employee.RowState == System.Data.DataRowState.Detached)) {
            //                throw new global::System.ServiceModel.FaultException<RecordNotFoundFault>(new global::Teraque.RecordNotFoundFault("Attempt to access a Department record ({0}) that doesn\'t exist", departmentId));
            //            }
            //            // Find the parent Object record if it is required for a foreign key constraint.
            //            Teraque.UnitTest.Server.DataModel.ObjectRow objectRowByFK_Object_Employee = Teraque.UnitTest.Server.DataModel.Object.FindByObjectId(new object[] {
            //                        employeeId});
            //            if ((objectRowByFK_Object_Employee == null)) {
            //                throw new global::System.ServiceModel.FaultException<RecordNotFoundFault>(new global::Teraque.RecordNotFoundFault("Attempt to access a Object record ({0}) that doesn\'t exist", employeeId));
            //            }
            //            // This record locked for reading for the duration of the transaction.
            //            objectRowByFK_Object_Employee.AcquireReaderLock(middleTierTransaction.AdoResourceManager.Guid, Teraque.UnitTest.Server.DataModel.lockTimeout);
            //            middleTierTransaction.AdoResourceManager.AddLock(objectRowByFK_Object_Employee);
            //            // This makes sure the record wasn't deleted in the time between when it was found and the time it was locked.
            //            if ((objectRowByFK_Object_Employee.RowState == System.Data.DataRowState.Detached)) {
            //                throw new global::System.ServiceModel.FaultException<RecordNotFoundFault>(new global::Teraque.RecordNotFoundFault("Attempt to access a Object record ({0}) that doesn\'t exist", employeeId));
            //            }
            //            // Find the parent Race record if it is required for a foreign key constraint.
            //            if ((raceCode != System.DBNull.Value)) {
            //                Teraque.UnitTest.Server.DataModel.RaceRow raceRowByFK_Race_Employee = Teraque.UnitTest.Server.DataModel.Race.FindByRaceCode(new object[] {
            //                            raceCode});
            //                if ((raceRowByFK_Race_Employee == null)) {
            //                    throw new global::System.ServiceModel.FaultException<RecordNotFoundFault>(new global::Teraque.RecordNotFoundFault("Attempt to access a Race record ({0}) that doesn\'t exist", raceCode));
            //                }
            //                // This record locked for reading for the duration of the transaction.
            //                raceRowByFK_Race_Employee.AcquireReaderLock(middleTierTransaction.AdoResourceManager.Guid, Teraque.UnitTest.Server.DataModel.lockTimeout);
            //                middleTierTransaction.AdoResourceManager.AddLock(raceRowByFK_Race_Employee);
            //                // This makes sure the record wasn't deleted in the time between when it was found and the time it was locked.
            //                if ((raceRowByFK_Race_Employee.RowState == System.Data.DataRowState.Detached)) {
            //                    throw new global::System.ServiceModel.FaultException<RecordNotFoundFault>(new global::Teraque.RecordNotFoundFault("Attempt to access a Race record ({0}) that doesn\'t exist", raceCode));
            //                }
            //            }
            foreach (KeyValuePair <string, RelationSchema> relationPair in tableSchema.ParentRelations)
            {
                if (tableSchema != relationPair.Value.ParentTable)
                {
                    // This is the table containing the parent record that is to be locked for the transaction.
                    TableSchema parentTable = relationPair.Value.ParentTable;

                    // The varible name for the parent row is decorated with the foreign key name thus making it unique.
                    CodeVariableReferenceExpression parentRowVariableExpression = new CodeRandomVariableReferenceExpression();
                    CodeTypeReference parentRowType = new CodeTypeReference(String.Format("{0}.{1}Row", tableSchema.DataModelSchema.Name, parentTable.Name));

                    // This chains all the non-null values of the primary key into an expression that tests if the given key values to the parent table have been
                    // provided in the input arguments to this method.  If the provided values are null, and the columns allow nulls, then there is no need to find
                    // the parent record.
                    CodeExpression lockConditions = null;
                    foreach (ColumnSchema columnSchema in relationPair.Value.ChildColumns)
                    {
                        if (columnSchema.IsNullable)
                        {
                            lockConditions =
                                lockConditions == null ?
                                new CodeBinaryOperatorExpression(
                                    new CodeArgumentReferenceExpression(CommonConversion.ToCamelCase(columnSchema.Name)),
                                    CodeBinaryOperatorType.IdentityInequality,
                                    new CodePropertyReferenceExpression(new CodeGlobalTypeReferenceExpression(typeof(DBNull)), "Value")) :
                                new CodeBinaryOperatorExpression(
                                    new CodeBinaryOperatorExpression(
                                        new CodeArgumentReferenceExpression(CommonConversion.ToCamelCase(columnSchema.Name)),
                                        CodeBinaryOperatorType.IdentityInequality,
                                        new CodePrimitiveExpression(null)),
                                    CodeBinaryOperatorType.BitwiseAnd,
                                    lockConditions);
                        }
                    }

                    // The statements to lock the row are added conditionally when the column is nullable.  They are added to the main part of the method when the
                    // constraint is required to match up with a parent record.
                    CodeStatementCollection codeStatementCollection;
                    if (lockConditions == null)
                    {
                        codeStatementCollection = this.Statements;
                    }
                    else
                    {
                        CodeConditionStatement ifParentKeyExists = new CodeConditionStatement(lockConditions);
                        this.Statements.Add(ifParentKeyExists);
                        codeStatementCollection = ifParentKeyExists.TrueStatements;
                    }

                    //			Teraque.UnitTest.Server.DataModel.DepartmentRow departmentRowByFK_Department_Employee = Teraque.UnitTest.Server.DataModel.Department.FindByDepartmentId(new object[] {
                    //						departmentId});
                    //			if ((departmentRowByFK_Department_Employee == null))
                    //			{
                    //				throw new Teraque.RecordNotFoundException("Attempt to access a Department record ({0}) that doesn\'t exist", departmentId);
                    //			}
                    CodeVariableReferenceExpression parentKeyExpression = new CodeRandomVariableReferenceExpression();
                    codeStatementCollection.Add(
                        new CodeVariableDeclarationStatement(
                            new CodeGlobalTypeReference(typeof(Object[])), parentKeyExpression.VariableName, new CodeKeyCreateExpression(relationPair.Value.ChildColumns)));
                    if (tableSchema.PrimaryKey == null)
                    {
                        codeStatementCollection.Add(
                            new CodeVariableDeclarationStatement(parentRowType, parentRowVariableExpression.VariableName, new CodeFindByRowExpression(parentTable, parentKeyExpression, new CodeThisReferenceExpression())));
                    }
                    else
                    {
                        codeStatementCollection.Add(
                            new CodeVariableDeclarationStatement(parentRowType, parentRowVariableExpression.VariableName, new CodeFindByIndexExpression(parentTable, parentKeyExpression, new CodeThisReferenceExpression())));
                    }
                    codeStatementCollection.Add(new CodeCheckRecordExistsStatement(parentTable, parentRowVariableExpression, parentKeyExpression));

                    //			// This record locked for reading for the duration of the transaction.
                    //			departmentRowByFK_Department_Employee.AcquireReaderLock(middleTierTransaction.AdoResourceManager.Guid, Teraque.UnitTest.Server.DataModel.lockTimeout);
                    //			middleTierTransaction.AdoResourceManager.AddLock(departmentRowByFK_Department_Employee);
                    codeStatementCollection.Add(new CodeAcquireRecordReaderLockExpression(transactionExpression, parentRowVariableExpression, parentTable.DataModel));
                    codeStatementCollection.Add(new CodeAddLockToTransactionExpression(transactionExpression, parentRowVariableExpression));

                    //			// This makes sure the record wasn't deleted in the time between when it was found and the time it was locked.
                    //			if ((departmentRowByFK_Department_Employee.RowState == System.Data.DataRowState.Detached))
                    //			{
                    //				throw new Teraque.RecordNotFoundException("Attempt to access a Department record ({0}) that doesn\'t exist", departmentId);
                    //			}
                    codeStatementCollection.Add(new CodeCheckRecordDetachedStatement(parentTable, parentRowVariableExpression, parentKeyExpression));
                }
            }

            //			ConfigurationRow q1641;
            //			try
            //			{
            //				l420.dataLock.EnterWriteLock();
            //				i425 = ((AccountRow)(l420.tableAccount.NewRow()));
            //			}
            //			finally
            //			{
            //				l420.dataLock.ExitWriteLock();
            //			}
            CodeVariableReferenceExpression rowVariableExpression = new CodeRandomVariableReferenceExpression();

            this.Statements.Add(new CodeVariableDeclarationStatement(String.Format("{0}.{1}Row", tableSchema.DataModelSchema.Name, tableSchema.Name), rowVariableExpression.VariableName));
            CodeTryCatchFinallyStatement tryCreateRecord = new CodeTryCatchFinallyStatement();

            tryCreateRecord.TryStatements.Add(new CodeMethodInvokeExpression(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), "dataLock"), "EnterWriteLock"));
            tryCreateRecord.TryStatements.Add(
                new CodeAssignStatement(
                    rowVariableExpression,
                    new CodeCastExpression(new CodeTypeReference(String.Format("{0}.{1}Row", tableSchema.DataModelSchema.Name, tableSchema.Name)),
                                           new CodeMethodInvokeExpression(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), String.Format("table{0}", tableSchema.Name)), "NewRow"))));
            tryCreateRecord.FinallyStatements.Add(new CodeMethodInvokeExpression(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), "dataLock"), "ExitWriteLock"));
            this.Statements.Add(tryCreateRecord);

            //            // This record is locked for writing for the duration of the transaction.
            //            employeeRow.AcquireWriterLock(middleTierTransaction.AdoResourceManager.Guid, Teraque.UnitTest.Server.DataModel.lockTimeout);
            //            middleTierTransaction.AdoResourceManager.AddLock(employeeRow);
            this.Statements.Add(new CodeAcquireRecordWriterLockExpression(transactionExpression, rowVariableExpression, tableSchema));
            this.Statements.Add(new CodeAddLockToTransactionExpression(transactionExpression, rowVariableExpression));

            //            // Create the Employee record in the ADO data model.
            //            middleTierTransaction.AdoResourceManager.AddRecord(employeeRow);
            this.Statements.Add(new CodeAddRecordToTransactionExpression(transactionExpression, rowVariableExpression));

            //            try {
            //                // Lock the owner table and any parent tables while the record is populated.  Note that table locks are always held
            //                // momentarily.
            //                Teraque.UnitTest.Server.DataModel.ReaderWriterLock.EnterReadLock();
            //                employeeRow.BeginEdit();
            //                employeeRow[Teraque.UnitTest.Server.DataModel.Employee.AgeColumn] = age;
            //                employeeRow[Teraque.UnitTest.Server.DataModel.Employee.DepartmentIdColumn] = departmentId;
            //                employeeRow[Teraque.UnitTest.Server.DataModel.Employee.EmployeeIdColumn] = employeeId;
            //                employeeRow[Teraque.UnitTest.Server.DataModel.Employee.RaceCodeColumn] = raceCode;
            //                employeeRow[Teraque.UnitTest.Server.DataModel.Employee.RowVersionColumn] = System.Threading.Interlocked.Increment(ref Teraque.UnitTest.Server.DataModel.masterRowVersion);
            //                Teraque.UnitTest.Server.DataModel.Employee.Rows.Add(employeeRow);
            //            }
            //            finally {
            //                // The record create is finished and the momentary table locks are no longer needed.
            //                employeeRow.EndEdit();
            //                Teraque.UnitTest.Server.DataModel.ReaderWriterLock.ExitWriteLock();
            //            }
            CodeTryCatchFinallyStatement tryFinallyStatement = new CodeTryCatchFinallyStatement();

            tryFinallyStatement.TryStatements.Add(new CodeMethodInvokeExpression(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), "dataLock"), "EnterWriteLock"));
            tryFinallyStatement.TryStatements.Add(new CodeMethodInvokeExpression(rowVariableExpression, "BeginEdit"));
            foreach (ColumnSchema columnSchema in tableSchema.Columns.Values)
            {
                if (!columnSchema.IsAutoIncrement)
                {
                    CodeExpression sourceExpression;
                    if (columnSchema.IsRowVersion)
                    {
                        sourceExpression = new CodeMethodInvokeExpression(new CodeThisReferenceExpression(), "IncrementRowVersion");
                    }
                    else
                    {
                        sourceExpression = new CodeArgumentReferenceExpression(CommonConversion.ToCamelCase(columnSchema.Name));
                    }
                    tryFinallyStatement.TryStatements.Add(new CodeAssignStatement(new CodeIndexerExpression(rowVariableExpression, new CodePropertyReferenceExpression(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), String.Format("table{0}", tableSchema.Name)), String.Format("{0}Column", columnSchema.Name))), sourceExpression));
                }
            }
            tryFinallyStatement.TryStatements.Add(
                new CodeMethodInvokeExpression(
                    new CodePropertyReferenceExpression(
                        new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), String.Format("table{0}", tableSchema.Name)), "Rows"), "Add", rowVariableExpression));
            tryFinallyStatement.FinallyStatements.Add(new CodeMethodInvokeExpression(rowVariableExpression, "EndEdit"));
            tryFinallyStatement.FinallyStatements.Add(new CodeMethodInvokeExpression(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), "dataLock"), "ExitWriteLock"));
            this.Statements.Add(tryFinallyStatement);

            //            // Add the Employee record to the SQL data model.
            //            System.Data.SqlClient.SqlCommand sqlCommand = new global::System.Data.SqlClient.SqlCommand("insert \"Employee\" (\"Age\",\"DepartmentId\",\"EmployeeId\",\"RaceCode\",\"RowVersion\",\"Row" +
            //                    "Version\") values (@age,@departmentId,@employeeId,@raceCode,@rowVersion,@rowVersi" +
            //                    "on)", middleTierTransaction.SqlConnection);
            //            sqlCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@age", System.Data.SqlDbType.Int, 0, System.Data.ParameterDirection.Input, false, 0, 0, null, System.Data.DataRowVersion.Current, age));
            //            sqlCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@departmentId", System.Data.SqlDbType.Int, 0, System.Data.ParameterDirection.Input, false, 0, 0, null, System.Data.DataRowVersion.Current, departmentId));
            //            sqlCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@employeeId", System.Data.SqlDbType.Int, 0, System.Data.ParameterDirection.Input, false, 0, 0, null, System.Data.DataRowVersion.Current, employeeId));
            //            sqlCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@raceCode", System.Data.SqlDbType.Int, 0, System.Data.ParameterDirection.Input, false, 0, 0, null, System.Data.DataRowVersion.Current, raceCode));
            //            sqlCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@rowVersion", System.Data.SqlDbType.BigInt, 0, System.Data.ParameterDirection.Input, false, 0, 0, null, System.Data.DataRowVersion.Current, employeeRow[Teraque.UnitTest.Server.DataModel.Employee.RowVersionColumn]));
            //            sqlCommand.ExecuteNonQuery();
            if (tableSchema.IsPersistent)
            {
                CodeVariableReferenceExpression sqlCommandExpression = new CodeRandomVariableReferenceExpression();
                string columnList   = string.Empty;
                string variableList = string.Empty;
                int    columnIndex  = 0;
                foreach (ColumnSchema columnSchema in tableSchema.Columns.Values)
                {
                    if (columnSchema.IsPersistent)
                    {
                        columnList   += String.Format(columnIndex < tableSchema.Columns.Count - 1 ? "\"{0}\"," : "\"{0}\"", columnSchema.Name);
                        variableList += String.Format(columnIndex < tableSchema.Columns.Count - 1 ? "@{0}," : "@{0}", CommonConversion.ToCamelCase(columnSchema.Name));
                        columnIndex++;
                    }
                }
                string insertCommandText = String.Format("insert \"{0}\" ({1}) values ({2})", tableSchema.Name, columnList, variableList);
                this.Statements.Add(new CodeVariableDeclarationStatement(new CodeGlobalTypeReference(typeof(SqlCommand)), sqlCommandExpression.VariableName, new CodeObjectCreateExpression(new CodeGlobalTypeReference(typeof(SqlCommand)), new CodePrimitiveExpression(insertCommandText), new CodePropertyReferenceExpression(transactionExpression, "SqlConnection"))));
                foreach (ColumnSchema columnSchema in tableSchema.Columns.Values)
                {
                    if (columnSchema.IsPersistent)
                    {
                        string variableName = CommonConversion.ToCamelCase(columnSchema.Name);
                        if (columnSchema.IsAutoIncrement)
                        {
                            CodeExpression codeExpression = new CodeIndexerExpression(rowVariableExpression, new CodePropertyReferenceExpression(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), String.Format("table{0}", tableSchema.Name)), String.Format("{0}Column", columnSchema.Name)));
                            this.Statements.Add(new CodeMethodInvokeExpression(new CodePropertyReferenceExpression(sqlCommandExpression, "Parameters"), "Add", new CodeObjectCreateExpression(new CodeGlobalTypeReference(typeof(SqlParameter)), new CodePrimitiveExpression(String.Format("@{0}", variableName)), TypeConverter.Convert(columnSchema.DataType), new CodePrimitiveExpression(0), new CodePropertyReferenceExpression(new CodeGlobalTypeReferenceExpression(typeof(ParameterDirection)), "Input"), new CodePrimitiveExpression(false), new CodePrimitiveExpression(0), new CodePrimitiveExpression(0), new CodePrimitiveExpression(null), new CodePropertyReferenceExpression(new CodeGlobalTypeReferenceExpression(typeof(DataRowVersion)), "Current"), codeExpression)));
                        }
                        else
                        {
                            CodeExpression sourceExpression = columnSchema.IsRowVersion ?
                                                              (CodeExpression) new CodeIndexerExpression(rowVariableExpression, new CodePropertyReferenceExpression(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), String.Format("table{0}", tableSchema.Name)), "RowVersionColumn")) :
                                                              (CodeExpression) new CodeArgumentReferenceExpression(variableName);
                            this.Statements.Add(new CodeMethodInvokeExpression(new CodePropertyReferenceExpression(sqlCommandExpression, "Parameters"), "Add", new CodeObjectCreateExpression(new CodeGlobalTypeReference(typeof(SqlParameter)), new CodePrimitiveExpression(String.Format("@{0}", variableName)), TypeConverter.Convert(columnSchema.DataType), new CodePrimitiveExpression(0), new CodePropertyReferenceExpression(new CodeGlobalTypeReferenceExpression(typeof(ParameterDirection)), "Input"), new CodePrimitiveExpression(false), new CodePrimitiveExpression(0), new CodePrimitiveExpression(0), new CodePrimitiveExpression(null), new CodePropertyReferenceExpression(new CodeGlobalTypeReferenceExpression(typeof(DataRowVersion)), "Current"), sourceExpression)));
                        }
                    }
                }
                this.Statements.Add(new CodeMethodInvokeExpression(transactionExpression, "Execute", sqlCommandExpression));
            }

            //			DataModel.DestinationOrder.OnRowValidate(new DestinationOrderRowChangeEventArgs(pe9564f2717374e96a76d5222e2258784, System.Data.DataRowAction.Add));
            this.Statements.Add(
                new CodeMethodInvokeExpression(
                    new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), String.Format("table{0}", tableSchema.Name)),
                    "OnRowValidate",
                    new CodeObjectCreateExpression(
                        String.Format("{0}.{1}RowChangeEventArgs", tableSchema.DataModelSchema.Name, tableSchema.Name),
                        rowVariableExpression,
                        new CodePropertyReferenceExpression(new CodeGlobalTypeReferenceExpression(typeof(DataRowAction)), "Add"))));


            // Cast the Auto-Increment values back to their native types when returning from this method.
            foreach (KeyValuePair <string, ColumnSchema> columnPair in tableSchema.Columns)
            {
                ColumnSchema columnSchema = columnPair.Value;
                if (columnSchema.IsAutoIncrement)
                {
                    this.Statements.Add(new CodeAssignStatement(new CodeArgumentReferenceExpression(CommonConversion.ToCamelCase(columnSchema.Name)),
                                                                new CodeCastExpression(new CodeGlobalTypeReference(columnSchema.DataType), new CodeIndexerExpression(rowVariableExpression, new CodePropertyReferenceExpression(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), String.Format("table{0}", tableSchema.Name)), String.Format("{0}Column", columnSchema.Name))))));
                }
            }

            //        }
        }
Ejemplo n.º 46
0
    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
        }
    }
        /// <summary>
        /// Generates a property getter/setter pair into the given proxy class to match the given property info.
        /// </summary>
        /// <param name="propertyDescriptor">PropertyDescriptor for the property to generate for.</param>
        protected virtual void GenerateProperty(PropertyDescriptor propertyDescriptor)
        {
            string propertyName = propertyDescriptor.Name;
            Type   propertyType = CodeGenUtilities.TranslateType(propertyDescriptor.PropertyType);

            // ----------------------------------------------------------------
            // Property type ref
            // ----------------------------------------------------------------
            var propTypeReference = CodeGenUtilities.GetTypeReference(propertyType, ClientProxyGenerator, ProxyClass);

            // ----------------------------------------------------------------
            // Property decl
            // ----------------------------------------------------------------
            var property = new CodeMemberProperty();

            property.Name       = propertyName;
            property.Type       = propTypeReference;
            property.Attributes = MemberAttributes.Public | MemberAttributes.Final; // final needed, else becomes virtual
            List <Attribute> propertyAttributes = propertyDescriptor.ExplicitAttributes().Cast <Attribute>().ToList();

            // Generate <summary> for property
            string comment = string.Format(CultureInfo.CurrentCulture, Resource.CodeGen_Entity_Property_Summary_Comment, propertyName);

            property.Comments.AddRange(CodeGenUtilities.GenerateSummaryCodeComment(comment, ClientProxyGenerator.IsCSharp));

            // ----------------------------------------------------------------
            // [DataMember] -> Add if not already present.
            // ----------------------------------------------------------------
            // Add if not already present.

            if (!propertyAttributes.OfType <DataMemberAttribute>().Any())
            {
                CodeAttributeDeclaration dataMemberAtt = CodeGenUtilities.CreateAttributeDeclaration(typeof(DataMemberAttribute), ClientProxyGenerator, ProxyClass);
                property.CustomAttributes.Add(dataMemberAtt);
            }

            // Here, we check for the existence of [ReadOnly(true)] attributes generated when
            // the property does not not have a setter.  We want to inject an [Editable(false)]
            // attribute into the pipeline.
            ReadOnlyAttribute readOnlyAttr = propertyAttributes.OfType <ReadOnlyAttribute>().SingleOrDefault();

            if (readOnlyAttr != null && !propertyAttributes.OfType <EditableAttribute>().Any())
            {
                propertyAttributes.Add(new EditableAttribute(!readOnlyAttr.IsReadOnly));

                // REVIEW:  should we strip out [ReadOnly] attributes here?
            }

            // Here, we check for the presence of a complex type. If it exists we need to add a DisplayAttribute
            // if not already there. DataSources windows do not handle complex types
            if (TypeUtility.IsSupportedComplexType(propertyType) && !propertyAttributes.OfType <DisplayAttribute>().Any())
            {
                CodeAttributeDeclaration displayAttribute = CodeGenUtilities.CreateDisplayAttributeDeclaration(ClientProxyGenerator, ProxyClass);
                property.CustomAttributes.Add(displayAttribute);
            }

            // ----------------------------------------------------------------
            // Propagate the custom attributes
            // ----------------------------------------------------------------

            CustomAttributeGenerator.GenerateCustomAttributes(
                ClientProxyGenerator,
                ProxyClass,
                ex => string.Format(CultureInfo.CurrentCulture, Resource.ClientCodeGen_Attribute_ThrewException_CodeTypeMember, ex.Message, property.Name, ProxyClass.Name, ex.InnerException.Message),
                propertyAttributes.Cast <Attribute>(),
                property.CustomAttributes,
                property.Comments);

            // ----------------------------------------------------------------
            // backing private field (CodeDom doesn't yet know about auto properties)
            // ----------------------------------------------------------------
            string fieldName = CodeGenUtilities.MakeCompliantFieldName(propertyName);
            var    field     = new CodeMemberField(propTypeReference, fieldName);

            ProxyClass.Members.Add(field);
            var fieldRef = new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), fieldName);
            var valueRef = new CodePropertySetValueReferenceExpression();

            // ----------------------------------------------------------------
            // getter body
            // ----------------------------------------------------------------
            property.GetStatements.Add(new CodeMethodReturnStatement(fieldRef));

            // ----------------------------------------------------------------
            // setter body
            // ----------------------------------------------------------------
            List <CodeStatement> bodyStatements = new List <CodeStatement>();

            // this.OnPropertyXxxChanging(PropType value);
            bodyStatements.Add(NotificationMethodGen.GetMethodInvokeExpressionStatementFor(propertyName + "Changing"));

            bool propertyIsReadOnly = IsPropertyReadOnly(propertyDescriptor);

            if (!propertyIsReadOnly)
            {
                bodyStatements.Add(new CodeExpressionStatement(new CodeMethodInvokeExpression(new CodeThisReferenceExpression(), "RaiseDataMemberChanging", new CodePrimitiveExpression(propertyDescriptor.Name))));
            }

            // Generate the validation tests.
            CodeStatement validationCode = GeneratePropertySetterValidation(propertyDescriptor.Name);

            bodyStatements.Add(validationCode);

            // this._field = value
            bodyStatements.Add(new CodeAssignStatement(fieldRef, valueRef));

            if (!propertyIsReadOnly)
            {
                bodyStatements.Add(new CodeExpressionStatement(new CodeMethodInvokeExpression(new CodeThisReferenceExpression(), "RaiseDataMemberChanged", new CodePrimitiveExpression(propertyDescriptor.Name))));
            }
            else
            {
                // even read-only members need to raise PropertyChanged
                bodyStatements.Add(new CodeExpressionStatement(new CodeMethodInvokeExpression(new CodeThisReferenceExpression(), "RaisePropertyChanged", new CodePrimitiveExpression(propertyDescriptor.Name))));
            }

            // this.OnPropertyXxxChanged();
            bodyStatements.Add(NotificationMethodGen.GetMethodInvokeExpressionStatementFor(propertyName + "Changed"));

            // if (this._field != value)...
            CodeExpression valueTest = CodeGenUtilities.MakeNotEqual(propertyType, fieldRef, valueRef, ClientProxyGenerator.IsCSharp);

            CodeConditionStatement body = new CodeConditionStatement(valueTest, bodyStatements.ToArray <CodeStatement>());

            property.SetStatements.Add(body);

            // add property
            ProxyClass.Members.Add(property);
        }
Ejemplo n.º 48
0
 void CreateTestFile(String[] values)
   {
   StreamWriter sw = new StreamWriter("test.cs");
   CSharpCodeProvider cdp = new CSharpCodeProvider();
   ICodeGenerator cg = cdp.CreateGenerator();
   CodeNamespace cnspace = new CodeNamespace("N");
   cnspace.Imports.Add(new CodeNamespaceImport("System"));
   CodeTypeDeclaration co = new CodeTypeDeclaration ("C");
   co.IsClass = true;
   cnspace.Types.Add (co);
   co.TypeAttributes  = TypeAttributes.Public;
   CodeMemberMethod cmm = new CodeMemberMethod();
   cmm.Name = "Main";
   cmm.ReturnType = null;
   cmm.Attributes = MemberAttributes.Public | MemberAttributes.Static;
   CodeVariableDeclarationStatement cvar = new CodeVariableDeclarationStatement(typeof(String[]), "args", new CodeMethodInvokeExpression(new CodeTypeReferenceExpression("Environment"), "GetCommandLineArgs"));
   cmm.Statements.Add(cvar);  
   cvar = new CodeVariableDeclarationStatement(typeof(Int32), "exitCode", new CodeSnippetExpression("0"));
   cmm.Statements.Add(cvar);
   String strArgLength = (values.Length + 1).ToString();
   CodeConditionStatement ccs1 = new CodeConditionStatement(new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("args.Length"), CodeBinaryOperatorType.IdentityInequality, new CodeSnippetExpression(strArgLength)), new CodeStatement []{new CodeAssignStatement(new CodeVariableReferenceExpression("exitCode"), new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("exitCode"), CodeBinaryOperatorType.Add, new CodeSnippetExpression("1")))});
   cmm.Statements.Add(ccs1);
   ccs1 = new CodeConditionStatement(new CodeSnippetExpression("!args[0].ToLower().EndsWith(\"test.exe\")"), new CodeStatement []{new CodeAssignStatement(new CodeVariableReferenceExpression("exitCode"), new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("exitCode"), CodeBinaryOperatorType.Add, new CodeSnippetExpression("1")))});
   cmm.Statements.Add(ccs1);
   for(int i=0; i<values.Length; i++){
   ccs1 = new CodeConditionStatement(new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("args[" + (i+1).ToString() + "]"), CodeBinaryOperatorType.IdentityInequality, new CodePrimitiveExpression(values[i])), new CodeStatement []{new CodeAssignStatement(new CodeVariableReferenceExpression("exitCode"), new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("exitCode"), CodeBinaryOperatorType.Add, new CodeSnippetExpression("1")))});
   cmm.Statements.Add(ccs1);
   }
   cmm.Statements.Add(new CodeAssignStatement(new CodeVariableReferenceExpression("Environment.ExitCode"), new CodeVariableReferenceExpression("exitCode")));
   co.Members.Add(cmm);
   cg.GenerateCodeFromNamespace(cnspace, sw, null);
   sw.Flush();
   sw.Close();		
   }
Ejemplo n.º 49
0
 /// <summary>
 /// 条件语句
 /// </summary>
 public void AddConditionStatement(CodeConditionStatement inStatement)
 {
     methodList[0].Method.Statements.Add(inStatement);
 }
Ejemplo n.º 50
0
 protected abstract void GenerateConditionStatement(CodeConditionStatement e);
 protected override void GenerateConditionStatement(CodeConditionStatement e)
 {
     Output.WriteLine("[GenerateConditionStatement: {0}]", e.ToString());
 }
Ejemplo n.º 52
0
        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 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
        }
    }