@Override
protected List<Statement> generateCreateInstanceStatements(final ClassStructureBuilder<?> bodyBlockBuilder,
final Injectable injectable, final DependencyGraph graph, final InjectionContext injectionContext) {
final Multimap<DependencyType, Dependency> depsByType = separateByType(injectable.getDependencies());
if (depsByType.get(DependencyType.ProducerMember).size() != 1) {
throw new RuntimeException("A produced type must have exactly 1 producing instance but "
+ depsByType.get(DependencyType.ProducerMember).size() + " were found.");
}
final ProducerInstanceDependency producerInstanceDep = (ProducerInstanceDependency) depsByType.get(DependencyType.ProducerMember).iterator().next();
final Injectable producerInjectable = producerInstanceDep.getInjectable();
final MetaClassMember producingMember = producerInstanceDep.getProducingMember();
if (producingMember instanceof MetaField) {
return fieldCreateInstanceStatements((MetaField) producingMember, producerInjectable, injectable, bodyBlockBuilder);
} else if (producingMember instanceof MetaMethod) {
return methodCreateInstanceStatements((MetaMethod) producingMember, producerInjectable, injectable,
depsByType.get(DependencyType.ProducerParameter), bodyBlockBuilder);
} else {
throw new RuntimeException("Unrecognized producing member: " + producingMember);
}
}