From 1caa7f0908e69741c35c0ae7d8256cb5184beb72 Mon Sep 17 00:00:00 2001 From: Ron Shapiro Date: Sun, 7 Mar 2021 00:13:42 -0800 Subject: [PATCH] Index the first-matching component method instead of filtering on each request. RELNOTES=Build performance improvements PiperOrigin-RevId: 361389870 --- .../codegen/binding/ComponentDescriptor.java | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/java/dagger/internal/codegen/binding/ComponentDescriptor.java b/java/dagger/internal/codegen/binding/ComponentDescriptor.java index a7e4cc4f343..f6ea62c77d5 100644 --- a/java/dagger/internal/codegen/binding/ComponentDescriptor.java +++ b/java/dagger/internal/codegen/binding/ComponentDescriptor.java @@ -45,6 +45,8 @@ import dagger.model.Scope; import dagger.producers.CancellationPolicy; import dagger.producers.ProductionComponent; +import java.util.HashMap; +import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.stream.Stream; @@ -240,19 +242,17 @@ final ComponentDescriptor getChildComponentWithBuilderType(TypeElement builderTy /** Returns the first component method associated with this binding request, if one exists. */ public Optional firstMatchingComponentMethod(BindingRequest request) { - return componentMethods().stream() - .filter(method -> doesComponentMethodMatch(method, request)) - .findFirst(); + return Optional.ofNullable(firstMatchingComponentMethods().get(request)); } - /** Returns true if the component method matches the binding request. */ - private static boolean doesComponentMethodMatch( - ComponentMethodDescriptor componentMethod, BindingRequest request) { - return componentMethod - .dependencyRequest() - .map(BindingRequest::bindingRequest) - .filter(request::equals) - .isPresent(); + @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}. */