diff --git a/java/dagger/internal/codegen/binding/BindingGraph.java b/java/dagger/internal/codegen/binding/BindingGraph.java index 62ab92830a6..0090b3d2ac2 100644 --- a/java/dagger/internal/codegen/binding/BindingGraph.java +++ b/java/dagger/internal/codegen/binding/BindingGraph.java @@ -42,7 +42,6 @@ import com.google.common.graph.ImmutableNetwork; import com.google.common.graph.Traverser; import dagger.internal.codegen.base.TarjanSCCs; -import dagger.internal.codegen.binding.ComponentDescriptor.ComponentMethodDescriptor; import dagger.internal.codegen.model.BindingGraph.ChildFactoryMethodEdge; import dagger.internal.codegen.model.BindingGraph.ComponentNode; import dagger.internal.codegen.model.BindingGraph.DependencyEdge; @@ -75,8 +74,7 @@ public abstract class BindingGraph { public abstract static class TopLevelBindingGraph extends dagger.internal.codegen.model.BindingGraph { static TopLevelBindingGraph create( - ImmutableNetwork network, - boolean isFullBindingGraph) { + ImmutableNetwork network, boolean isFullBindingGraph) { TopLevelBindingGraph topLevelBindingGraph = new AutoValue_BindingGraph_TopLevelBindingGraph(network, isFullBindingGraph); @@ -280,12 +278,6 @@ public final ComponentDescriptor componentDescriptor() { return ((ComponentNodeImpl) componentNode()).componentDescriptor(); } - /** Returns all entry point methods for this component. */ - public final ImmutableSet entryPointMethods() { - return componentDescriptor().entryPointMethods().stream() - .collect(toImmutableSet()); - } - /** * Returns the {@link ContributionBinding} for the given {@link Key} in this component or {@link * Optional#empty()} if one doesn't exist. diff --git a/java/dagger/internal/codegen/binding/BindingGraphConverter.java b/java/dagger/internal/codegen/binding/BindingGraphConverter.java index 367e1ada709..42b61a61ba7 100644 --- a/java/dagger/internal/codegen/binding/BindingGraphConverter.java +++ b/java/dagger/internal/codegen/binding/BindingGraphConverter.java @@ -71,9 +71,7 @@ BindingGraph convert(LegacyBindingGraph legacyBindingGraph, boolean isFullBindin } TopLevelBindingGraph topLevelBindingGraph = - TopLevelBindingGraph.create( - ImmutableNetwork.copyOf(network), - isFullBindingGraph); + TopLevelBindingGraph.create(ImmutableNetwork.copyOf(network), isFullBindingGraph); return BindingGraph.create(rootNode, topLevelBindingGraph); } diff --git a/java/dagger/internal/codegen/binding/ComponentDescriptor.java b/java/dagger/internal/codegen/binding/ComponentDescriptor.java index fc2b674fd67..535bb37c7ea 100644 --- a/java/dagger/internal/codegen/binding/ComponentDescriptor.java +++ b/java/dagger/internal/codegen/binding/ComponentDescriptor.java @@ -276,6 +276,20 @@ final ComponentDescriptor getChildComponentWithBuilderType(XTypeElement builderT builderType.getQualifiedName()); } + /** Returns the first component method associated with this binding request, if one exists. */ + public Optional firstMatchingComponentMethod(BindingRequest request) { + return Optional.ofNullable(firstMatchingComponentMethods().get(request)); + } + + @Memoized + ImmutableMap firstMatchingComponentMethods() { + Map methods = new HashMap<>(); + for (ComponentMethodDescriptor method : entryPointMethods()) { + methods.putIfAbsent(BindingRequest.bindingRequest(method.dependencyRequest().get()), method); + } + return ImmutableMap.copyOf(methods); + } + /** The entry point methods on the component type. Each has a {@link DependencyRequest}. */ public final ImmutableSet entryPointMethods() { return componentMethods().stream() diff --git a/java/dagger/internal/codegen/writing/ComponentImplementation.java b/java/dagger/internal/codegen/writing/ComponentImplementation.java index 5c2678f6705..84e6eeccee1 100644 --- a/java/dagger/internal/codegen/writing/ComponentImplementation.java +++ b/java/dagger/internal/codegen/writing/ComponentImplementation.java @@ -59,6 +59,7 @@ import com.google.common.collect.ListMultimap; import com.google.common.collect.Lists; import com.google.common.collect.MultimapBuilder; +import com.google.common.collect.Sets; import com.squareup.javapoet.ClassName; import com.squareup.javapoet.CodeBlock; import com.squareup.javapoet.FieldSpec; @@ -92,7 +93,6 @@ import dagger.internal.codegen.xprocessing.XTypeElements; import java.util.ArrayList; import java.util.HashMap; -import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -443,7 +443,7 @@ public TypeSpec generate() { /** * The implementation of a shard. * - *

The purpose of a shard is to allow a component implementation to be split into multiple + *

The purpose of a shard is to allow a component implemenation to be split into multiple * classes, where each class owns the creation logic for a set of keys. Sharding is useful for * large component implementations, where a single component implementation class can reach size * limitations, such as the constant pool size. @@ -886,11 +886,10 @@ private void addInterfaceMethods() { // Each component method may have been declared by several supertypes. We want to implement // only one method for each distinct signature. XType componentType = graph.componentTypeElement().getType(); - Set methodDescriptors = new HashSet<>(); - for (ComponentMethodDescriptor method : graph.entryPointMethods()) { - MethodSignature signature = - MethodSignature.forComponentMethod(method, componentType, processingEnv); - if (methodDescriptors.add(signature)) { + Set signatures = Sets.newHashSet(); + for (ComponentMethodDescriptor method : graph.componentDescriptor().entryPointMethods()) { + if (signatures.add( + MethodSignature.forComponentMethod(method, componentType, processingEnv))) { addMethod( COMPONENT_METHOD, componentRequestRepresentationsProvider.get().getComponentMethod(method)); diff --git a/java/dagger/internal/codegen/writing/DirectInstanceBindingRepresentation.java b/java/dagger/internal/codegen/writing/DirectInstanceBindingRepresentation.java index a65a0c2857b..4b518f7e8a8 100644 --- a/java/dagger/internal/codegen/writing/DirectInstanceBindingRepresentation.java +++ b/java/dagger/internal/codegen/writing/DirectInstanceBindingRepresentation.java @@ -105,7 +105,7 @@ RequestRepresentation wrapInMethod(RequestRepresentation bindingExpression) { BindingRequest request = bindingRequest(binding.key(), RequestKind.INSTANCE); Optional matchingComponentMethod = - firstMatchingComponentMethod(request, graph); + graph.componentDescriptor().firstMatchingComponentMethod(request); ShardImplementation shardImplementation = componentImplementation.shardImplementation(binding); @@ -133,16 +133,6 @@ RequestRepresentation wrapInMethod(RequestRepresentation bindingExpression) { } } - private static Optional firstMatchingComponentMethod( - BindingRequest request, BindingGraph graph) { - for (ComponentMethodDescriptor method : graph.entryPointMethods()) { - if (bindingRequest(method.dependencyRequest().get()).equals(request)) { - return Optional.of(method); - } - } - return Optional.empty(); - } - private static boolean requiresMethodEncapsulation(ContributionBinding binding) { switch (binding.kind()) { case COMPONENT: