package autodagger.compiler;
import com.squareup.javapoet.AnnotationSpec;
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 dagger.Subcomponent;
import processorworkflow.AbstractComposer;
/**
* @author Lukasz Piliszczuk - lukasz.pili@gmail.com
*/
public class SubcomponentComposer extends AbstractComposer<SubcomponentSpec> {
public SubcomponentComposer(List<SubcomponentSpec> specs) {
super(specs);
}
@Override
protected JavaFile compose(SubcomponentSpec subcomponentSpec) {
AnnotationSpec.Builder annotationSpecBuilder = AnnotationSpec.builder(Subcomponent.class);
for (TypeName typeName : subcomponentSpec.getModulesTypeNames()) {
annotationSpecBuilder.addMember("modules", "$T.class", typeName);
}
TypeSpec.Builder builder = TypeSpec.interfaceBuilder(subcomponentSpec.getClassName().simpleName())
.addModifiers(Modifier.PUBLIC)
.addAnnotation(AnnotationSpec.builder(Generated.class)
.addMember("value", "$S", AnnotationProcessor.class.getName())
.build())
.addAnnotation(annotationSpecBuilder.build());
for (TypeName typeName : subcomponentSpec.getSuperinterfacesTypeNames()) {
builder.addSuperinterface(typeName);
}
if (subcomponentSpec.getScopeAnnotationSpec() != null) {
builder.addAnnotation(subcomponentSpec.getScopeAnnotationSpec());
}
for (AdditionSpec additionSpec : subcomponentSpec.getInjectorSpecs()) {
builder.addMethod(MethodSpec.methodBuilder("inject")
.addModifiers(Modifier.PUBLIC, Modifier.ABSTRACT)
.addParameter(additionSpec.getTypeName(), additionSpec.getName())
.build());
}
for (AdditionSpec additionSpec : subcomponentSpec.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());
}
TypeSpec typeSpec = builder.build();
return JavaFile.builder(subcomponentSpec.getClassName().packageName(), typeSpec).build();
}
}