Ejemplo n.º 1
0
        private void GenerateICausesInterfaceImplementation(ClassGenerator @class, GenerationContext context)
        {
            if (ImplementsICauses(out string?eventClassName) &&
                context.GetSourceClass(eventClassName) is Some <SourceClass> eventClassValue)
            {
                SourceClass eventClass = eventClassValue;


                List <ParameterInfo> builderParams = new List <ParameterInfo>();
                eventClass.GetBuilderConstructorParameters(builderParams);
                int parameterCount = builderParams.Count;

                MethodDeclarationSyntax buildEventMethod = MethodDeclaration(returnType: eventClass.NameSyntax, Identifier("BuildEvent"))
                                                           .AddModifiers(Token(SyntaxKind.PublicKeyword))
                                                           .AddBodyStatements(
                    ReturnStatement(
                        InvocationExpression(
                            MemberAccessExpression(
                                SyntaxKind.SimpleMemberAccessExpression,
                                ObjectCreationExpression(IdentifierName(eventClass.BuilderClassName))
                                .AddArgumentListArguments(
                                    Enumerable.Repeat(Argument(ThisExpression()), parameterCount).ToArray()),
                                IdentifierName("Build")))));

                @class.AddMembers(buildEventMethod);
            }
        }
Ejemplo n.º 2
0
        private void GenerateIBuildsInterfaceImplementation(ClassGenerator @class)
        {
            @class.AddBaseType(GenericName("IBuilds").AddTypeArgumentListArguments(NameSyntax));

            MethodDeclarationSyntax buildMethod = MethodDeclaration(returnType: NameSyntax, Identifier("Build"))
                                                  .AddModifiers(Token(SyntaxKind.PublicKeyword))
                                                  .AddBodyStatements(
                ReturnStatement(
                    ObjectCreationExpression(NameSyntax)
                    .AddArgumentListArguments(Argument(ThisExpression()))));

            ConversionOperatorDeclarationSyntax implicitCastOperator =
                ConversionOperatorDeclaration(Token(SyntaxKind.ImplicitKeyword), NameSyntax)
                .AddModifiers(Token(SyntaxKind.PublicKeyword), Token(SyntaxKind.StaticKeyword))
                .AddParameterListParameters(
                    Parameter(Identifier("builder"))
                    .WithType(IdentifierName(BuilderClassName)))
                .AddBodyStatements(
                    ReturnStatement(
                        InvocationExpression(
                            MemberAccessExpression(
                                SyntaxKind.SimpleMemberAccessExpression,
                                IdentifierName("builder"),
                                IdentifierName("Build")))));

            if (BaseClass != null)
            {
                buildMethod = buildMethod.AddModifiers(Token(SyntaxKind.NewKeyword));
            }

            @class.AddMembers(buildMethod, implicitCastOperator);
        }
Ejemplo n.º 3
0
        private void GenerateAdditionalConstructors(ClassGenerator @class)
        {
            List <ParameterInfo> parameters = new List <ParameterInfo>();

            var ctor = @class
                       .AddConstructor();

            if (BaseClass != null)
            {
                BaseClass.GetBuilderConstructorParameters(parameters);

                foreach (ParameterInfo p in parameters)
                {
                    ctor.AddOptionalParameter(p.Type, p.Name).PassToBaseConstructor();
                }
            }

            ParameterInfo[] additionalParams = GetAdditionalBuilderConstructorParameters().ToArray();

            foreach (ParameterInfo p in additionalParams)
            {
                ctor.AddOptionalParameter(p.Type, p.Name).AddPropertyAssignmentBlock(AssignmentTarget.BuilderClass);
            }

            if (parameters.Any() || additionalParams.Any())
            {
                // Default constructor
                @class.AddConstructor();
            }
        }
Ejemplo n.º 4
0
        private void GenerateBuilderConstructor(ClassGenerator @class)
        {
            var ctor = @class
                       .AddConstructor();

            var p = ctor
                    .AddOptionalParameter(this, "source")
                    .AddPropertyAssignmentBlock(AssignmentTarget.BuilderClass);

            if (BaseClass != null)
            {
                p.PassToBaseConstructor();
            }
        }
Ejemplo n.º 5
0
        private ClassDeclarationSyntax GenerateBuilderClass(GenerationContext context)
        {
            ClassGenerator @class = new ClassGenerator(Declaration, BuilderClassName);

            @class.AddMembers(
                Properties.SelectMany(p => PropertyRule
                                      .GetRule(p)
                                      .GenerateBuilderPropertyDeclarations(p))
                .ToArray());

            if (BaseClass != null)
            {
                @class.AddBaseType(IdentifierName(BaseClass.BuilderClassName));
            }

            GenerateIBuildsInterfaceImplementation(@class);

            GenerateBuilderConstructor(@class);
            GenerateAdditionalConstructors(@class);

            return(@class.Generate());
        }
Ejemplo n.º 6
0
        private ClassDeclarationSyntax GeneratePartialClassCompletion(GenerationContext context)
        {
            ClassGenerator classGen = new ClassGenerator(Declaration);

            var p = classGen.AddConstructor()
                    .AddRequiredParameter(this, BuilderClassName, "source")
                    .AddPropertyAssignmentBlock(AssignmentTarget.SourceClass);

            if (BaseClass != null)
            {
                p.PassToBaseConstructor();
            }

            p = classGen.AddConstructor()
                .AddRequiredParameter(this, Name, "source")
                .AddPropertyAssignmentBlock(AssignmentTarget.SourceToSource);

            if (BaseClass != null)
            {
                p.PassToBaseConstructor();
            }

            classGen.AddAttribute(
                Attribute(IdentifierName("Builder")).AddArgumentListArguments(
                    AttributeArgument(
                        TypeOfExpression(IdentifierName(BuilderClassName)))));

            classGen.AddMembers(GenerateMutateMethod());

            foreach (SourceInterface i in Interfaces)
            {
                classGen.ImplementInterface(i);
            }

            GenerateICausesInterfaceImplementation(classGen, context);
            return(classGen.Generate());
        }