Add a TypeMirror property to ModifiableBindingMethod that records the return type of the modifiable method.

Also add a ComponentMethodDescriptor.resolvedReturnType() convenience and begin using it.

RELNOTES=n/a

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=223857310
diff --git a/java/dagger/internal/codegen/ModifiableBindingMethods.java b/java/dagger/internal/codegen/ModifiableBindingMethods.java
index d83a5fc..6183ae4 100644
--- a/java/dagger/internal/codegen/ModifiableBindingMethods.java
+++ b/java/dagger/internal/codegen/ModifiableBindingMethods.java
@@ -20,7 +20,9 @@
 import static com.google.common.base.Preconditions.checkState;
 import static dagger.internal.codegen.DaggerStreams.toImmutableList;
 
+import com.google.auto.common.MoreTypes;
 import com.google.auto.value.AutoValue;
+import com.google.common.base.Equivalence;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
@@ -28,6 +30,7 @@
 import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
+import javax.lang.model.type.TypeMirror;
 
 /**
  * A registry for those methods which each wrap a binding whose definition may be modified across
@@ -44,12 +47,17 @@
 
   /** Register a method encapsulating a modifiable binding. */
   void addMethod(
-      ModifiableBindingType type, BindingRequest request, MethodSpec method, boolean finalized) {
+      ModifiableBindingType type,
+      BindingRequest request,
+      TypeMirror returnType,
+      MethodSpec method,
+      boolean finalized) {
     checkArgument(type.isModifiable());
     if (finalized) {
       finalizedMethods.add(request);
     }
-    methods.put(request, ModifiableBindingMethod.create(type, request, method, finalized));
+    methods.put(
+        request, ModifiableBindingMethod.create(type, request, returnType, method, finalized));
   }
 
   /** Returns all {@link ModifiableBindingMethod}s that have not been marked as finalized. */
@@ -88,23 +96,34 @@
     private static ModifiableBindingMethod create(
         ModifiableBindingType type,
         BindingRequest request,
+        TypeMirror returnType,
         MethodSpec methodSpec,
         boolean finalized) {
       return new AutoValue_ModifiableBindingMethods_ModifiableBindingMethod(
-          type, request, methodSpec, finalized);
+          type, request, MoreTypes.equivalence().wrap(returnType), methodSpec, finalized);
     }
 
     /** Create a {@ModifiableBindingMethod} representing an implementation of an existing method. */
     static ModifiableBindingMethod implement(
         ModifiableBindingMethod unimplementedMethod, MethodSpec methodSpec, boolean finalized) {
       return new AutoValue_ModifiableBindingMethods_ModifiableBindingMethod(
-          unimplementedMethod.type(), unimplementedMethod.request(), methodSpec, finalized);
+          unimplementedMethod.type(),
+          unimplementedMethod.request(),
+          unimplementedMethod.returnTypeWrapper(),
+          methodSpec,
+          finalized);
     }
 
     abstract ModifiableBindingType type();
 
     abstract BindingRequest request();
 
+    final TypeMirror returnType() {
+      return returnTypeWrapper().get();
+    }
+
+    abstract Equivalence.Wrapper<TypeMirror> returnTypeWrapper();
+
     abstract MethodSpec methodSpec();
 
     abstract boolean finalized();