Use FrameworkInstanceBindingExpression only when requesting a Provider or Producer. Otherwise use DerivedFromFrameworkInstanceExpression, which is generalized from DerivedFromProviderExpression.

RELNOTES=n/a

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=208267062
diff --git a/java/dagger/internal/codegen/ComponentBindingExpressions.java b/java/dagger/internal/codegen/ComponentBindingExpressions.java
index 20fa93c..f8a9d65 100644
--- a/java/dagger/internal/codegen/ComponentBindingExpressions.java
+++ b/java/dagger/internal/codegen/ComponentBindingExpressions.java
@@ -312,7 +312,12 @@
         return provisionBindingExpression(resolvedBindings, requestKind);
 
       case PRODUCTION:
-        return frameworkInstanceBindingExpression(resolvedBindings, requestKind);
+        if (requestKind.equals(RequestKind.PRODUCER)) {
+          return frameworkInstanceBindingExpression(resolvedBindings);
+        } else {
+          return new DerivedFromFrameworkInstanceBindingExpression(
+              resolvedBindings, requestKind, this, types);
+        }
 
       default:
         throw new AssertionError(resolvedBindings);
@@ -355,7 +360,7 @@
    * or a {@link dagger.producers.Producer} for production bindings.
    */
   private FrameworkInstanceBindingExpression frameworkInstanceBindingExpression(
-      ResolvedBindings resolvedBindings, RequestKind requestKind) {
+      ResolvedBindings resolvedBindings) {
     // TODO(user): Consider merging the static factory creation logic into CreationExpressions?
     Optional<MemberSelect> staticMethod =
         useStaticFactoryCreation(resolvedBindings.contributionBinding())
@@ -375,10 +380,10 @@
     switch (frameworkType) {
       case PROVIDER:
         return new ProviderInstanceBindingExpression(
-            resolvedBindings, requestKind, this, frameworkInstanceSupplier, types, elements);
+            resolvedBindings, frameworkInstanceSupplier, types, elements);
       case PRODUCER:
         return new ProducerInstanceBindingExpression(
-            resolvedBindings, requestKind, this, frameworkInstanceSupplier, types, elements);
+            resolvedBindings, frameworkInstanceSupplier, types, elements);
       default:
         throw new AssertionError("invalid framework type: " + frameworkType);
     }
@@ -499,10 +504,11 @@
       case LAZY:
       case PRODUCED:
       case PROVIDER_OF_LAZY:
-        return new DerivedFromProviderBindingExpression(resolvedBindings, requestKind, this, types);
+        return new DerivedFromFrameworkInstanceBindingExpression(
+            resolvedBindings, requestKind, this, types);
 
       case PRODUCER:
-        return producerFromProviderBindingExpression(resolvedBindings, requestKind);
+        return producerFromProviderBindingExpression(resolvedBindings);
 
       case FUTURE:
         return new ImmediateFutureBindingExpression(resolvedBindings, this, types);
@@ -534,13 +540,13 @@
     } else if (compilerOptions.fastInit()
         && frameworkInstanceCreationExpression(resolvedBindings).useInnerSwitchingProvider()
         && !(instanceBindingExpression(resolvedBindings)
-        instanceof DerivedFromProviderBindingExpression)) {
+            instanceof DerivedFromFrameworkInstanceBindingExpression)) {
       return wrapInMethod(
           resolvedBindings,
           RequestKind.PROVIDER,
           innerSwitchingProviders.newBindingExpression(resolvedBindings.contributionBinding()));
     }
-    return frameworkInstanceBindingExpression(resolvedBindings, RequestKind.PROVIDER);
+    return frameworkInstanceBindingExpression(resolvedBindings);
   }
 
   /**
@@ -548,12 +554,10 @@
    * provision binding.
    */
   private FrameworkInstanceBindingExpression producerFromProviderBindingExpression(
-      ResolvedBindings resolvedBindings, RequestKind requestKind) {
+      ResolvedBindings resolvedBindings) {
     checkArgument(resolvedBindings.bindingType().frameworkType().equals(FrameworkType.PROVIDER));
     return new ProducerInstanceBindingExpression(
         resolvedBindings,
-        requestKind,
-        this,
         new FrameworkFieldInitializer(
             generatedComponentModel,
             resolvedBindings,
@@ -586,7 +590,7 @@
           ? wrapInMethod(resolvedBindings, RequestKind.INSTANCE, directInstanceExpression)
           : directInstanceExpression;
     }
-    return new DerivedFromProviderBindingExpression(
+    return new DerivedFromFrameworkInstanceBindingExpression(
         resolvedBindings, RequestKind.INSTANCE, this, types);
   }