package com.josketres.builderator; import com.squareup.javapoet.*; import javax.lang.model.element.Modifier; class Renderer { public static final String BUILDER_SUFFIX = "Builder"; public String render(final TargetClass target) { ClassName builderType = ClassName.get(target.getPackageName(), target.getName() + BUILDER_SUFFIX); TypeSpec.Builder builderBuilder = TypeSpec.classBuilder(target.getName() + BUILDER_SUFFIX) .addModifiers(Modifier.PUBLIC, Modifier.FINAL) .addMethod(MethodSpec.constructorBuilder().addModifiers(Modifier.PRIVATE).build()) .addMethod(MethodSpec.methodBuilder("a" + target.getName()) .addModifiers(Modifier.PUBLIC, Modifier.STATIC) .returns(builderType) .addStatement("return new $T()", builderType) .build()); for (Property property : target.getProperties()) { builderBuilder.addField(FieldSpec.builder( property.getTypeClass(), property.getName()) .addModifiers(Modifier.PRIVATE) .build()); MethodSpec setter = MethodSpec.methodBuilder(property.getName()) .addModifiers(Modifier.PUBLIC) .addParameter(property.getTypeClass(), property.getName()) .returns(builderType) .addStatement("this.$N = $N", property.getName(), property.getName()) .addStatement("return this") .build(); builderBuilder.addMethod(setter); } builderBuilder.addMethod(createBuildMethod(target)); return JavaFile.builder(target.getPackageName(), builderBuilder.build()).build().toString(); } private MethodSpec createBuildMethod(TargetClass target) { ClassName returnType = ClassName.get(target.getPackageName(), target.getName()); MethodSpec.Builder method = MethodSpec.methodBuilder("build") .addModifiers(Modifier.PUBLIC) .returns(returnType); method.addStatement("$T $N = new $T()", returnType, "object", returnType); for (Property property : target.getProperties()) { method.addStatement("object.$N($N)", property.getSetterName(), property.getName()); } method.addStatement("return object"); return method.build(); } }