package autodagger.compiler; import com.squareup.javapoet.AnnotationSpec; import com.squareup.javapoet.ClassName; import com.squareup.javapoet.JavaFile; import com.squareup.javapoet.MethodSpec; import com.squareup.javapoet.TypeName; import com.squareup.javapoet.TypeSpec; import java.util.List; import javax.annotation.Generated; import javax.lang.model.element.Modifier; import dagger.Component; import processorworkflow.AbstractComposer; /** * @author Lukasz Piliszczuk - lukasz.pili@gmail.com */ public class ComponentComposer extends AbstractComposer<ComponentSpec> { public ComponentComposer(List<ComponentSpec> specs) { super(specs); } @Override protected JavaFile compose(ComponentSpec componentSpec) { AnnotationSpec.Builder annotationSpecBuilder = AnnotationSpec.builder(Component.class); for (TypeName typeName : componentSpec.getDependenciesTypeNames()) { annotationSpecBuilder.addMember("dependencies", "$T.class", typeName); } for (TypeName typeName : componentSpec.getModulesTypeNames()) { annotationSpecBuilder.addMember("modules", "$T.class", typeName); } TypeSpec.Builder builder = TypeSpec.interfaceBuilder(componentSpec.getClassName().simpleName()) .addModifiers(Modifier.PUBLIC) .addAnnotation(AnnotationSpec.builder(Generated.class) .addMember("value", "$S", AnnotationProcessor.class.getName()) .build()) .addAnnotation(annotationSpecBuilder.build()); for (TypeName typeName : componentSpec.getSuperinterfacesTypeNames()) { builder.addSuperinterface(typeName); } if (componentSpec.getScopeAnnotationSpec() != null) { builder.addAnnotation(componentSpec.getScopeAnnotationSpec()); } for (AdditionSpec additionSpec : componentSpec.getInjectorSpecs()) { builder.addMethod(MethodSpec.methodBuilder("inject") .addModifiers(Modifier.PUBLIC, Modifier.ABSTRACT) .addParameter(additionSpec.getTypeName(), additionSpec.getName()) .build()); } for (AdditionSpec additionSpec : componentSpec.getExposeSpecs()) { MethodSpec.Builder exposeBuilder = MethodSpec.methodBuilder(additionSpec.getName()) .addModifiers(Modifier.PUBLIC, Modifier.ABSTRACT) .returns(additionSpec.getTypeName()); if (additionSpec.getQualifierAnnotationSpec() != null) { exposeBuilder.addAnnotation(additionSpec.getQualifierAnnotationSpec()); } builder.addMethod(exposeBuilder.build()); } if (!componentSpec.getSubcomponentsSpecs().isEmpty()) { builder.addMethods(componentSpec.getSubcomponentsSpecs()); } TypeSpec typeSpec = builder.build(); return JavaFile.builder(componentSpec.getClassName().packageName(), typeSpec).build(); } }