@Override public Optional<HasAnnotations> getAnnotatedObject() { switch (injectableType) { case Type: return Optional.of(type); case Producer: case Static: case Provider: case ContextualProvider: return dependencies .stream() .filter(dep -> DependencyType.ProducerMember.equals(dep.dependencyType)) .map(dep -> (HasAnnotations) ((ProducerInstanceDependency) dep).getProducingMember()) .findFirst(); case ExtensionProvided: case Extension: case JsType: case Disabled: default: return Optional.empty(); } }
@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); } }