예제 #1
0
        private static void ProvideWriteLineMethod1(CodeTypeMemberCollection members, CodeMemberField endsWithNewline, CodeMemberProperty GenerationEnvironment, CodeVariableReferenceExpression textToAppend)
        {
            CodeMemberMethod codeMemberMethod = CodeDomHelpers.CreateMethod(null, "WriteLine", "Write text directly into the generated output", (MemberAttributes)24578, CodeDomHelpers.Call("Write", textToAppend), GenerationEnvironment.Ref().CallS("AppendLine"), endsWithNewline.Ref().Assign(true.Prim()));

            codeMemberMethod.Parameters.Add(new CodeParameterDeclarationExpression(new CodeTypeReference(typeof(string)), textToAppend.VariableName));
            members.Add(codeMemberMethod);
        }
예제 #2
0
        private static void ProvideErrorMethod(CodeTypeMemberCollection members, CodeMemberProperty Errors, CodeVariableReferenceExpression error)
        {
            CodeMemberMethod codeMemberMethod = CodeDomHelpers.CreateMethod(null, "Error", "Raise an error", (MemberAttributes)24578, new CodeVariableDeclarationStatement(typeof(CompilerError), "error", typeof(CompilerError).New()), error.Prop("ErrorText").Assign(new CodeVariableReferenceExpression("message")), Errors.Ref().CallS("Add", error));

            codeMemberMethod.Parameters.Add(new CodeParameterDeclarationExpression(new CodeTypeReference(typeof(string)), "message"));
            members.Add(codeMemberMethod);
        }
예제 #3
0
        private static void ProvideWarningMethod(CodeTypeMemberCollection members, CodeMemberProperty Errors, CodeVariableReferenceExpression error)
        {
            CodeMemberMethod method = CodeDomHelpers.CreateMethod(null, "Warning", "Raise a warning", MemberAttributes.Public | MemberAttributes.Final, new CodeObject[] { new CodeVariableDeclarationStatement(typeof(CompilerError), "error", typeof(CompilerError).New()), error.Prop("ErrorText").Assign(new CodeVariableReferenceExpression("message")), error.Prop("IsWarning").Assign(true.Prim()), Errors.Ref().CallS("Add", new CodeExpression[] { error }) });

            method.Parameters.Add(new CodeParameterDeclarationExpression(new CodeTypeReference(typeof(string)), "message"));
            members.Add(method);
        }
예제 #4
0
        private static void ProvideClearIndentMethod(CodeTypeMemberCollection members, CodeMemberField currentIndent, CodeMemberProperty indentLengths)
        {
            CodeMemberMethod codeMemberMethod = CodeDomHelpers.CreateMethod(null, "ClearIndent", "Remove any indentation", (MemberAttributes)24578, indentLengths.Ref().CallS("Clear"), currentIndent.Ref().Assign(string.Empty.Prim()));

            codeMemberMethod.EndDirectives.Add(new CodeRegionDirective(CodeRegionMode.End, "Transform-time helpers"));
            members.Add(codeMemberMethod);
        }
예제 #5
0
        private static void ProvideClearIndentMethod(CodeTypeMemberCollection members, CodeMemberField currentIndent, CodeMemberProperty indentLengths)
        {
            CodeMemberMethod method = CodeDomHelpers.CreateMethod(null, "ClearIndent", "Remove any indentation", MemberAttributes.Public | MemberAttributes.Final, new CodeObject[] { indentLengths.Ref().CallS("Clear", new CodeExpression[0]), currentIndent.Ref().Assign(string.Empty.Prim()) });

            method.EndDirectives.Add(new CodeRegionDirective(CodeRegionMode.End, "Transform-time helpers"));
            members.Add(method);
        }
예제 #6
0
        private static void ProvidePushIndentMethod(CodeTypeMemberCollection members, CodeMemberField currentIndent, CodeMemberProperty indentLengths)
        {
            CodeVariableReferenceExpression lhs = new CodeVariableReferenceExpression("indent");
            CodeMemberMethod method             = CodeDomHelpers.CreateMethod(null, "PushIndent", "Increase the indent", MemberAttributes.Public | MemberAttributes.Final, new CodeObject[] { new CodeConditionStatement(lhs.VEquals(CodeDomHelpers.nullEx), new CodeStatement[] { new CodeThrowExceptionStatement(typeof(ArgumentNullException).New(new CodeExpression[] { "indent".Prim() })) }), currentIndent.Ref().Assign(currentIndent.Ref().Add(lhs)), indentLengths.Ref().CallS("Add", new CodeExpression[] { lhs.Prop("Length") }) });

            method.Parameters.Add(new CodeParameterDeclarationExpression(new CodeTypeReference(typeof(string)), "indent"));
            members.Add(method);
        }
예제 #7
0
        private static void ProvidePopIndentMethod(CodeTypeMemberCollection members, CodeMemberField currentIndent, CodeMemberProperty indentLengths)
        {
            CodeVariableReferenceExpression lhs         = new CodeVariableReferenceExpression("indentLength");
            CodeVariableReferenceExpression expression2 = new CodeVariableReferenceExpression("returnValue");
            CodeMemberMethod method = CodeDomHelpers.CreateMethod(typeof(string), "PopIndent", "Remove the last indent that was added with PushIndent", MemberAttributes.Public | MemberAttributes.Final, new CodeObject[] { new CodeVariableDeclarationStatement(typeof(string), expression2.VariableName, string.Empty.Prim()), new CodeConditionStatement(indentLengths.Ref().Prop("Count").Gt(0.Prim()), new CodeStatement[] { new CodeVariableDeclarationStatement(typeof(int), lhs.VariableName, indentLengths.Ref().Index(new CodeExpression[] { indentLengths.Ref().Prop("Count").Subtract(1.Prim()) })), indentLengths.Ref().CallS("RemoveAt", new CodeExpression[] { indentLengths.Ref().Prop("Count").Subtract(1.Prim()) }), new CodeConditionStatement(lhs.Gt(0.Prim()), new CodeStatement[] { expression2.Assign(currentIndent.Ref().Call("Substring", new CodeExpression[] { currentIndent.Ref().Prop("Length").Subtract(lhs) })), currentIndent.Ref().Assign(currentIndent.Ref().Call("Remove", new CodeExpression[] { currentIndent.Ref().Prop("Length").Subtract(lhs) })) }) }), new CodeMethodReturnStatement(expression2) });

            members.Add(method);
        }
예제 #8
0
        private static void ProvidePopIndentMethod(CodeTypeMemberCollection members, CodeMemberField currentIndent, CodeMemberProperty indentLengths)
        {
            CodeVariableReferenceExpression codeVariableReferenceExpression  = new CodeVariableReferenceExpression("indentLength");
            CodeVariableReferenceExpression codeVariableReferenceExpression2 = new CodeVariableReferenceExpression("returnValue");
            CodeMemberMethod value = CodeDomHelpers.CreateMethod(typeof(string), "PopIndent", "Remove the last indent that was added with PushIndent", (MemberAttributes)24578, new CodeVariableDeclarationStatement(typeof(string), codeVariableReferenceExpression2.VariableName, string.Empty.Prim()), new CodeConditionStatement(indentLengths.Ref().Prop("Count").Gt(0.Prim()), new CodeVariableDeclarationStatement(typeof(int), codeVariableReferenceExpression.VariableName, indentLengths.Ref().Index(indentLengths.Ref().Prop("Count").Subtract(1.Prim()))), indentLengths.Ref().CallS("RemoveAt", indentLengths.Ref().Prop("Count").Subtract(1.Prim())), new CodeConditionStatement(codeVariableReferenceExpression.Gt(0.Prim()), codeVariableReferenceExpression2.Assign(currentIndent.Ref().Call("Substring", currentIndent.Ref().Prop("Length").Subtract(codeVariableReferenceExpression))), currentIndent.Ref().Assign(currentIndent.Ref().Call("Remove", currentIndent.Ref().Prop("Length").Subtract(codeVariableReferenceExpression))))), new CodeMethodReturnStatement(codeVariableReferenceExpression2));

            members.Add(value);
        }
예제 #9
0
        private static void ProvideWriteLineMethod2(CodeTypeMemberCollection members, CodeParameterDeclarationExpression argsParam)
        {
            CodeMemberMethod codeMemberMethod = CodeDomHelpers.CreateMethod(null, "WriteLine", "Write formatted text directly into the generated output", (MemberAttributes)24578, CodeDomHelpers.Call("WriteLine", CodeDomHelpers.Call(typeof(string), "Format", typeof(CultureInfo).Expr().Prop("CurrentCulture"), new CodeVariableReferenceExpression("format"), new CodeVariableReferenceExpression("args"))));

            codeMemberMethod.Parameters.Add(new CodeParameterDeclarationExpression(new CodeTypeReference(typeof(string)), "format"));
            codeMemberMethod.Parameters.Add(argsParam);
            members.Add(codeMemberMethod);
        }
예제 #10
0
        private static void ProvidePushIndentMethod(CodeTypeMemberCollection members, CodeMemberField currentIndent, CodeMemberProperty indentLengths)
        {
            CodeVariableReferenceExpression codeVariableReferenceExpression = new CodeVariableReferenceExpression("indent");
            CodeMemberMethod codeMemberMethod = CodeDomHelpers.CreateMethod(null, "PushIndent", "Increase the indent", (MemberAttributes)24578, new CodeConditionStatement(codeVariableReferenceExpression.VEquals(CodeDomHelpers.nullEx), new CodeThrowExceptionStatement(typeof(ArgumentNullException).New("indent".Prim()))), currentIndent.Ref().Assign(currentIndent.Ref().Add(codeVariableReferenceExpression)), indentLengths.Ref().CallS("Add", codeVariableReferenceExpression.Prop("Length")));

            codeMemberMethod.Parameters.Add(new CodeParameterDeclarationExpression(new CodeTypeReference(typeof(string)), "indent"));
            members.Add(codeMemberMethod);
        }
예제 #11
0
        private static void ProvideWriteMethod1(CodeTypeMemberCollection members, CodeMemberField currentIndent, CodeMemberField endsWithNewline, CodeMemberProperty GenerationEnvironment, CodeVariableReferenceExpression textToAppend)
        {
            CodeExpression   lhs    = typeof(Environment).Expr().Prop("NewLine");
            CodeMemberMethod method = CodeDomHelpers.CreateMethod(null, "Write", "Write text directly into the generated output", MemberAttributes.Public | MemberAttributes.Final, new CodeObject[] { new CodeConditionStatement(CodeDomHelpers.Call(typeof(string), "IsNullOrEmpty", new CodeExpression[] { textToAppend }), new CodeStatement[] { new CodeMethodReturnStatement() }), new CodeCommentStatement("If we're starting off, or if the previous text ended with a newline,"), new CodeCommentStatement("we have to append the current indent first."), new CodeConditionStatement(new CodeBinaryOperatorExpression(GenerationEnvironment.Ref().Prop("Length").VEquals(0.Prim()), CodeBinaryOperatorType.BooleanOr, endsWithNewline.Ref()), new CodeStatement[] { GenerationEnvironment.Ref().CallS("Append", new CodeExpression[] { currentIndent.Ref() }), endsWithNewline.Ref().Assign(false.Prim()) }), new CodeCommentStatement("Check if the current text ends with a newline"), new CodeConditionStatement(textToAppend.Call("EndsWith", new CodeExpression[] { lhs, typeof(StringComparison).Expr().Prop("CurrentCulture") }), new CodeStatement[] { new CodeAssignStatement(endsWithNewline.Ref(), true.Prim()) }), new CodeCommentStatement("This is an optimization. If the current indent is \"\", then we don't have to do any"), new CodeCommentStatement("of the more complex stuff further down."), new CodeConditionStatement(currentIndent.Ref().Prop("Length").VEquals(0.Prim()), new CodeStatement[] { GenerationEnvironment.Ref().CallS("Append", new CodeExpression[] { textToAppend }), new CodeMethodReturnStatement() }), new CodeCommentStatement("Everywhere there is a newline in the text, add an indent after it"), textToAppend.Assign(textToAppend.Call("Replace", new CodeExpression[] { lhs, lhs.Add(currentIndent.Ref()) })), new CodeCommentStatement("If the text ends with a newline, then we should strip off the indent added at the very end"), new CodeCommentStatement("because the appropriate indent will be added when the next time Write() is called"), new CodeConditionStatement(endsWithNewline.Ref(), new CodeStatement[] { GenerationEnvironment.Ref().CallS("Append", new CodeExpression[] { textToAppend, 0.Prim(), textToAppend.Prop("Length").Subtract(currentIndent.Ref().Prop("Length")) }) }, new CodeStatement[] { GenerationEnvironment.Ref().CallS("Append", new CodeExpression[] { textToAppend }) }) });

            method.StartDirectives.Add(new CodeRegionDirective(CodeRegionMode.Start, "Transform-time helpers"));
            method.Parameters.Add(new CodeParameterDeclarationExpression(new CodeTypeReference(typeof(string)), textToAppend.VariableName));
            members.Add(method);
        }
예제 #12
0
        private static void ProvideWriteMethod2(CodeTypeMemberCollection members, CodeParameterDeclarationExpression argsParam)
        {
            CodeMemberMethod method = CodeDomHelpers.CreateMethod(null, "Write", "Write formatted text directly into the generated output", MemberAttributes.Public | MemberAttributes.Final, new CodeObject[] { CodeDomHelpers.Call("Write", new CodeExpression[] { CodeDomHelpers.Call(typeof(string), "Format", new CodeExpression[] { typeof(CultureInfo).Expr().Prop("CurrentCulture"), new CodeVariableReferenceExpression("format"), new CodeVariableReferenceExpression("args") }) }) });

            method.Parameters.Add(new CodeParameterDeclarationExpression(new CodeTypeReference(typeof(string)), "format"));
            argsParam.CustomAttributes.Add(new CodeAttributeDeclaration("System.ParamArrayAttribute"));
            method.Parameters.Add(argsParam);
            members.Add(method);
        }
예제 #13
0
        private static void ProvideNestedToStringWithCultureMethod(CodeTypeDeclaration nest, CodeFieldReferenceExpression formatProviderRef)
        {
            CodeParameterDeclarationExpression parameter = new CodeParameterDeclarationExpression(typeof(object), "objectToConvert");
            CodeVariableReferenceExpression    callSite  = new CodeVariableReferenceExpression("t");
            CodeVariableReferenceExpression    left      = new CodeVariableReferenceExpression("method");
            CodeMemberMethod method = CodeDomHelpers.CreateMethod(typeof(string), "ToStringWithCulture", "This is called from the compile/run appdomain to convert objects within an expression block to a string", MemberAttributes.Public | MemberAttributes.Final, new CodeObject[] { CodeDomHelpers.CheckNullParameter(parameter.Name), new CodeVariableDeclarationStatement(typeof(Type), callSite.VariableName, parameter.Ref().Call("GetType", new CodeExpression[0])), new CodeVariableDeclarationStatement(typeof(MethodInfo), left.VariableName, callSite.Call("GetMethod", new CodeExpression[] { "ToString".Prim(), new CodeArrayCreateExpression(typeof(Type), new CodeExpression[] { new CodeTypeOfExpression(typeof(IFormatProvider)) }) })), new CodeConditionStatement(new CodeBinaryOperatorExpression(left, CodeBinaryOperatorType.IdentityEquality, CodeDomHelpers.nullEx), new CodeStatement[] { new CodeMethodReturnStatement(parameter.Ref().Call("ToString", new CodeExpression[0])) }, new CodeStatement[] { new CodeMethodReturnStatement(new CodeCastExpression(typeof(string), left.Call("Invoke", new CodeExpression[] { parameter.Ref(), new CodeArrayCreateExpression(typeof(object), new CodeExpression[] { formatProviderRef }) }))) }) });

            method.Parameters.Add(parameter);
            nest.Members.Add(method);
        }
예제 #14
0
        private static CodeMemberProperty ProvideErrorsProperty(CodeTypeMemberCollection members, CodeMemberField errors)
        {
            CodeMemberProperty codeMemberProperty = new CodeMemberProperty();

            codeMemberProperty.Type = new CodeTypeReference(typeof(CompilerErrorCollection));
            codeMemberProperty.Name = "Errors";
            codeMemberProperty.AddSummaryComment("The error collection for the generation process");
            codeMemberProperty.Attributes = (MemberAttributes)24578;
            codeMemberProperty.GetStatements.Add(CodeDomHelpers.IfVariableNullThenInstantiateType(errors.Ref(), typeof(CompilerErrorCollection)));
            codeMemberProperty.GetStatements.Add(new CodeMethodReturnStatement(errors.Ref()));
            members.Add(codeMemberProperty);
            return(codeMemberProperty);
        }
예제 #15
0
        private static CodeMemberProperty ProvideIndentLengthsProperty(CodeTypeMemberCollection members, CodeMemberField indentLengthsField)
        {
            CodeMemberProperty codeMemberProperty = new CodeMemberProperty();

            codeMemberProperty.Type = new CodeTypeReference(typeof(List <int>));
            codeMemberProperty.Name = "indentLengths";
            codeMemberProperty.AddSummaryComment("A list of the lengths of each indent that was added with PushIndent");
            codeMemberProperty.Attributes = MemberAttributes.Private;
            codeMemberProperty.GetStatements.Add(CodeDomHelpers.IfVariableNullThenInstantiateType(indentLengthsField.Ref(), typeof(List <int>)));
            codeMemberProperty.GetStatements.Add(new CodeMethodReturnStatement(indentLengthsField.Ref()));
            members.Add(codeMemberProperty);
            return(codeMemberProperty);
        }
예제 #16
0
        private static CodeMemberProperty ProvideErrorsProperty(CodeTypeMemberCollection members, CodeMemberField errors)
        {
            CodeMemberProperty member = new CodeMemberProperty {
                Type = new CodeTypeReference(typeof(CompilerErrorCollection)),
                Name = "Errors"
            };

            member.AddSummaryComment("The error collection for the generation process");
            member.Attributes = MemberAttributes.Public | MemberAttributes.Final;
            member.GetStatements.Add(CodeDomHelpers.IfVariableNullThenInstantiateType(errors.Ref(), typeof(CompilerErrorCollection)));
            member.GetStatements.Add(new CodeMethodReturnStatement(errors.Ref()));
            members.Add(member);
            return(member);
        }
예제 #17
0
        private static CodeMemberProperty ProvideGenerationEnvironmentProperty(CodeTypeMemberCollection members, CodeMemberField generationTimeBuilder)
        {
            CodeMemberProperty codeMemberProperty = new CodeMemberProperty();

            codeMemberProperty.StartDirectives.Add(new CodeRegionDirective(CodeRegionMode.Start, "Properties"));
            codeMemberProperty.Type = new CodeTypeReference(typeof(StringBuilder));
            codeMemberProperty.Name = "GenerationEnvironment";
            codeMemberProperty.AddSummaryComment("The string builder that generation-time code is using to assemble generated output");
            codeMemberProperty.Attributes = (MemberAttributes)12290;
            codeMemberProperty.GetStatements.Add(CodeDomHelpers.IfVariableNullThenInstantiateType(generationTimeBuilder.Ref(), typeof(StringBuilder)));
            codeMemberProperty.GetStatements.Add(new CodeMethodReturnStatement(generationTimeBuilder.Ref()));
            codeMemberProperty.SetStatements.Add(new CodeAssignStatement(generationTimeBuilder.Ref(), new CodePropertySetValueReferenceExpression()));
            members.Add(codeMemberProperty);
            return(codeMemberProperty);
        }
예제 #18
0
        private static void ProvideNestedToStringWithCultureMethod(CodeTypeDeclaration nest, CodeFieldReferenceExpression formatProviderRef)
        {
            CodeParameterDeclarationExpression codeParameterDeclarationExpression = new CodeParameterDeclarationExpression(typeof(object), "objectToConvert");
            CodeVariableReferenceExpression    codeVariableReferenceExpression    = new CodeVariableReferenceExpression("t");
            CodeVariableReferenceExpression    codeVariableReferenceExpression2   = new CodeVariableReferenceExpression("method");
            CodeMemberMethod codeMemberMethod = CodeDomHelpers.CreateMethod(typeof(string), "ToStringWithCulture", "This is called from the compile/run appdomain to convert objects within an expression block to a string", (MemberAttributes)24578, CodeDomHelpers.CheckNullParameter(codeParameterDeclarationExpression.Name), new CodeVariableDeclarationStatement(typeof(Type), codeVariableReferenceExpression.VariableName, codeParameterDeclarationExpression.Ref().Call("GetType")), new CodeVariableDeclarationStatement(typeof(MethodInfo), codeVariableReferenceExpression2.VariableName, codeVariableReferenceExpression.Call("GetMethod", "ToString".Prim(), new CodeArrayCreateExpression(typeof(Type), new CodeExpression[1]
            {
                new CodeTypeOfExpression(typeof(IFormatProvider))
            }))), new CodeConditionStatement(new CodeBinaryOperatorExpression(codeVariableReferenceExpression2, CodeBinaryOperatorType.IdentityEquality, CodeDomHelpers.nullEx), new CodeStatement[1]
            {
                new CodeMethodReturnStatement(codeParameterDeclarationExpression.Ref().Call("ToString"))
            }, new CodeStatement[1]
            {
                new CodeMethodReturnStatement(new CodeCastExpression(typeof(string), codeVariableReferenceExpression2.Call("Invoke", codeParameterDeclarationExpression.Ref(), new CodeArrayCreateExpression(typeof(object), new CodeExpression[1]
                {
                    formatProviderRef
                }))))
            }));

            codeMemberMethod.Parameters.Add(codeParameterDeclarationExpression);
            nest.Members.Add(codeMemberMethod);
        }