This collapses requests for synthetic bindings so that a request for a multibound key
* points to all of the contributions for the multibound object. It does so by recursively calling
* this method, with each dependency's key as the {@code targetKey}.
*/
private void addEdgesForDependencyRequest(
DependencyRequest dependency, Key targetKey, BindingGraph graph) {
if (!dependency.requestElement().isPresent()) {
return;
}
BindingRequest request = bindingRequest(targetKey, dependency.kind());
ResolvedBindings resolvedBindings = graph.resolvedBindings(request);
for (Binding binding : resolvedBindings.bindings()) {
if (binding.bindingElement().isPresent()) {
addDependencyEdge(dependency, binding);
} else {
for (DependencyRequest subsequentDependency : binding.explicitDependencies()) {
addEdgesForDependencyRequest(dependency, subsequentDependency.key(), graph);
}
}
}
for (BindingDeclaration bindingDeclaration :
Iterables.concat(
resolvedBindings.multibindingDeclarations(),
resolvedBindings.optionalBindingDeclarations())) {
addDependencyEdge(dependency, bindingDeclaration);
}
}
private void addDependencyEdge(
DependencyRequest dependency, BindingDeclaration bindingDeclaration) {
Element requestElement = dependency.requestElement().get();
Element bindingElement = bindingDeclaration.bindingElement().get();
Optional