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); }
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()); }