コード例 #1
0
        public static CodeCompileUnit TestSimpleClassCompileUnit()
        {
            CodeCommentStatement docComment = new CodeCommentStatement("this is a doc comment", true);
            CodeCommentStatement comment    = new CodeCommentStatement("this is a comment", false);

            CodeCompileUnit     compileUnit      = new CodeCompileUnit();
            CodeNamespace       codeNamespace    = new CodeNamespace("Test.Namespace");
            CodeTypeDeclaration classDeclaration = new CodeTypeDeclaration("TestClass")
            {
                IsClass = true
            };

            classDeclaration.TypeAttributes =
                (classDeclaration.TypeAttributes & ~TypeAttributes.VisibilityMask) | TypeAttributes.NotPublic;

            var field1 = new CodeMemberField(typeof(int), "count");

            field1.Attributes = (field1.Attributes & ~MemberAttributes.AccessMask) | MemberAttributes.Private;
            var field2 = new CodeMemberField(typeof(int), "increment");

            field2.Attributes = (field2.Attributes & ~MemberAttributes.AccessMask) | MemberAttributes.FamilyAndAssembly;

            classDeclaration.Members.Add(field1);
            classDeclaration.Members.Add(field2);

            var prop1 = new CodeMemberProperty()
            {
                Name       = "Prop",
                HasGet     = true,
                HasSet     = true,
                Type       = Types.Int,
                Attributes = MemberAttributes.Public | MemberAttributes.Final
            };
            var prop2 = new CodeMemberProperty()
            {
                Name       = "Prop2",
                HasSet     = true,
                Type       = Types.Int,
                Attributes = MemberAttributes.Public
            };

            prop1.GetStatements.Add(new CodeMethodReturnStatement(FieldReferenceExpression.Default("increment")));
            prop1.SetStatements.Add(
                new CodeAssignStatement(FieldReferenceExpression.Default("increment"),
                                        new CodePropertySetValueReferenceExpression()));
            prop2.SetStatements.Add(new CodeThrowExceptionStatement(
                                        new CodeObjectCreateExpression(new CodeTypeReference("Exception"))));

            classDeclaration.Members.Add(prop1);
            classDeclaration.Members.Add(prop2);

            var constructor = new CodeConstructor();

            constructor.Attributes = (constructor.Attributes & ~MemberAttributes.AccessMask) | MemberAttributes.Family;

            constructor.Parameters.Add(new CodeParameterDeclarationExpression(typeof(int), "count"));
            constructor.Parameters.Add(new CodeParameterDeclarationExpression(typeof(int), "increment"));

            constructor.Statements.Add(new CodeAssignStatement(
                                           FieldReferenceExpression.This("count"),
                                           new CodeArgumentReferenceExpression("count")));
            constructor.Statements.Add(new CodeAssignStatement(
                                           FieldReferenceExpression.This("increment"),
                                           new CodeArgumentReferenceExpression("increment")));

            classDeclaration.Members.Add(constructor);
            classDeclaration.Attributes = (classDeclaration.Attributes & ~MemberAttributes.AccessMask) |
                                          MemberAttributes.FamilyOrAssembly;

            var method = new CodeMemberMethod()
            {
                Name       = "IncrementAndGet",
                ReturnType = Types.Int,
                Attributes = MemberAttributes.FamilyOrAssembly | MemberAttributes.Final
            };

            method.Statements.Add(comment);
            method.Statements.Add(
                new CodeOperationAssignmentStatement(
                    FieldReferenceExpression.Default("count"),
                    CodeBinaryOperatorTypeMore.Add,
                    FieldReferenceExpression.Default("increment")).AsAssignStatement());
            method.Statements.Add(new CodeMethodReturnStatement(FieldReferenceExpression.Default("count")));

            classDeclaration.Members.Add(method);

            codeNamespace.Types.Add(classDeclaration);
            compileUnit.Namespaces.Add(codeNamespace);

            codeNamespace.Comments.Add(comment);
            codeNamespace.Comments.Add(docComment);

            classDeclaration.Comments.Add(docComment);
            classDeclaration.Comments.Add(docComment);

            method.Comments.Add(comment);

            return(compileUnit);
        }
コード例 #2
0
        public static CodeCompileUnit TestStatementsAndExpressionsCompileUnit()
        {
            CodeCompileUnit     compileUnit      = new CodeCompileUnit();
            CodeNamespace       codeNamespace    = new CodeNamespace("Test.Namespace");
            CodeTypeDeclaration classDeclaration = new CodeTypeDeclaration("TestClass")
            {
                IsClass = true
            };

            classDeclaration.TypeAttributes =
                (classDeclaration.TypeAttributes & ~TypeAttributes.VisibilityMask) | TypeAttributes.Public;


            var method = new CodeMemberMethod()
            {
                Name       = "Method",
                Attributes = MemberAttributes.Public | MemberAttributes.Final
            };


            CodeFieldReferenceExpression    fieldRef = FieldReferenceExpression.This("field");
            CodeArgumentReferenceExpression argRef   = new CodeArgumentReferenceExpression("arg");
            CodeVariableReferenceExpression varRef   = new CodeVariableReferenceExpression("avar");

            method.Statements.Add(new CodeArrayCreateExpression(new CodeTypeReference("Class"),
                                                                new CodeObjectCreateExpression(new CodeTypeReference("A")),
                                                                new CodeObjectCreateExpression(new CodeTypeReference("A"), fieldRef, argRef)));
            method.Statements.Add(new CodeArrayCreateExpression(Types.Double,
                                                                new CodeBinaryOperatorExpression(argRef, CodeBinaryOperatorType.Multiply, varRef)));
            method.Statements.Add(new CodeArrayIndexerExpression(varRef,
                                                                 new CodeCastExpression(typeof(int), Primitives.Float(5.5f)),
                                                                 new CodeMethodInvokeExpression(new CodeTypeReferenceExpression("Math"), "Abs", Primitives.Int(-2))));
            method.Statements.Add(new CodeDefaultValueExpression(Types.UInt));
            method.Statements.Add(new CodeTypeOfExpression(Types.Int));
            method.Statements.Add(new CodeIterationStatement(
                                      new CodeVariableDeclarationStatement(
                                          Types.Int, "i", Primitives.Int(0)),
                                      new CodeBinaryOperatorExpression(
                                          new CodeVariableReferenceExpression("i"),
                                          CodeBinaryOperatorType.LessThan,
                                          Primitives.Int(10)),
                                      new CodeAssignStatement(
                                          new CodeVariableReferenceExpression("i"),
                                          new CodeBinaryOperatorExpression(
                                              new CodeVariableReferenceExpression("i"),
                                              CodeBinaryOperatorType.Add,
                                              Primitives.Int(1))),
                                      new CodeTryCatchFinallyStatement(
                                          new CodeStatement[] { new CodeAttachEventStatement(
                                                                    new CodeEventReferenceExpression(PropertyReferenceExpression.Base("EventsHolder"), "AnEvent"),
                                                                    DelegateCreateExpression.This(new CodeTypeReference("Action"), "Method")
                                                                    ) },
                                          new CodeCatchClause[]
            {
                new CodeCatchClause("e", new CodeTypeReference("Exception")),
                new CodeCatchClause("e", new CodeTypeReference("AnotherException"))
            })));

            classDeclaration.Members.Add(method);
            codeNamespace.Types.Add(classDeclaration);
            compileUnit.Namespaces.Add(codeNamespace);

            return(compileUnit);
        }
コード例 #3
0
        public static CodeCompileUnit TestSimpleStructCompileUnit()
        {
            CodeCompileUnit     compileUnit      = new CodeCompileUnit();
            CodeNamespace       codeNamespace    = new CodeNamespace("Test.Namespace");
            CodeTypeDeclaration classDeclaration = new CodeTypeDeclaration("TestClass")
            {
                IsStruct = true
            };

            classDeclaration.TypeAttributes =
                (classDeclaration.TypeAttributes & ~TypeAttributes.VisibilityMask) | TypeAttributes.NotPublic;

            var field1 = new CodeMemberField(typeof(int), "count");

            field1.Attributes = (field1.Attributes & ~MemberAttributes.AccessMask) | MemberAttributes.Private;
            var field2 = new CodeMemberField(typeof(int), "increment");

            field2.Attributes = (field2.Attributes & ~MemberAttributes.AccessMask) | MemberAttributes.Private;

            classDeclaration.Members.Add(field1);
            classDeclaration.Members.Add(field2);

            var constructor = new CodeConstructor();

            constructor.Attributes = (constructor.Attributes & ~MemberAttributes.AccessMask) | MemberAttributes.Public;

            constructor.Parameters.Add(new CodeParameterDeclarationExpression(typeof(int), "count"));
            constructor.Parameters.Add(new CodeParameterDeclarationExpression(typeof(int), "increment"));

            constructor.Statements.Add(new CodeAssignStatement(
                                           FieldReferenceExpression.This("count"),
                                           new CodeArgumentReferenceExpression("count")));
            constructor.Statements.Add(new CodeAssignStatement(
                                           FieldReferenceExpression.This("increment"),
                                           new CodeArgumentReferenceExpression("increment")));

            classDeclaration.Members.Add(constructor);
            classDeclaration.Attributes = (classDeclaration.Attributes & ~MemberAttributes.AccessMask) |
                                          MemberAttributes.Assembly;

            var method = new CodeMemberMethod()
            {
                Name       = "IncrementAndGet",
                ReturnType = Types.Int,
                Attributes = MemberAttributes.Assembly | MemberAttributes.Final
            };

            method.Statements.Add(
                new CodeOperationAssignmentStatement(
                    FieldReferenceExpression.Default("count"),
                    CodeBinaryOperatorTypeMore.Add,
                    FieldReferenceExpression.Default("increment")).AsAssignStatement());
            method.Statements.Add(new CodeMethodReturnStatement(FieldReferenceExpression.Default("count")));

            classDeclaration.Members.Add(method);

            codeNamespace.Types.Add(classDeclaration);
            compileUnit.Namespaces.Add(codeNamespace);

            return(compileUnit);
        }