Simplify binding expression creation logic. Specifically, make it easier to reason about when we use direct expressions vs. wrapping them in methods vs. creating FIBEs. Make it easier to see that all request kinds other than instance and provider are derived from either instance or provider, and that often instance is derived from provider or the other way around.

Derive future requests from instances, and Lazy and Provider<Lazy> requests from providers.

Make the logic for instance requests return either a direct expression, a direct expression wrapped in a method, or an expression that calls get() on the provider.

Make the logic for provider expressions either wrap the instance expression in a method, delegate to the @Binds target, or use a provider instance.

Decide whether to wrap an instance expression in a method first (based on complexity and the need for scoping), and then secondly decide whether to use a component provision method or a private method. That means we no longer call component provision methods for simple expressions. (We also wrap more binding kinds in methods.)

See Javadoc for details.

RELNOTES=n/a

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=184836941
diff --git a/java/dagger/internal/codegen/SubcomponentBuilderBindingExpression.java b/java/dagger/internal/codegen/SubcomponentBuilderBindingExpression.java
index 9df3502..08b6180 100644
--- a/java/dagger/internal/codegen/SubcomponentBuilderBindingExpression.java
+++ b/java/dagger/internal/codegen/SubcomponentBuilderBindingExpression.java
@@ -18,7 +18,6 @@
 
 import com.squareup.javapoet.ClassName;
 import com.squareup.javapoet.CodeBlock;
-import dagger.model.RequestKind;
 
 /** A binding expression for a subcomponent builder that just invokes the constructor. */
 final class SubcomponentBuilderBindingExpression extends SimpleInvocationBindingExpression {
@@ -26,17 +25,14 @@
   private final ContributionBinding binding;
 
   SubcomponentBuilderBindingExpression(
-      ResolvedBindings resolvedBindings,
-      RequestKind requestKind,
-      String subcomponentBuilderName,
-      DaggerTypes types) {
-    super(resolvedBindings, requestKind, types);
+      ResolvedBindings resolvedBindings, String subcomponentBuilderName) {
+    super(resolvedBindings);
     this.subcomponentBuilderName = subcomponentBuilderName;
     this.binding = resolvedBindings.contributionBinding();
   }
 
   @Override
-  Expression getInstanceDependencyExpression(ClassName requestingClass) {
+  Expression getDependencyExpression(ClassName requestingClass) {
     return Expression.create(
         binding.key().type(), CodeBlock.of("new $LBuilder()", subcomponentBuilderName));
   }