Fixes android mode issue with switching provider primitive casting.

SwitchingProviders need to cast case statements that return primitive types into boxed types. The detection currently fails since it only looks at the contributed type. However, this fails when a boxed contributed type is wrapped in an unboxed component method.

RELNOTES=n/a

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=193046217
diff --git a/java/dagger/internal/codegen/BindingVariableNamer.java b/java/dagger/internal/codegen/BindingVariableNamer.java
index 8537ea0..526e2db 100644
--- a/java/dagger/internal/codegen/BindingVariableNamer.java
+++ b/java/dagger/internal/codegen/BindingVariableNamer.java
@@ -19,6 +19,7 @@
 import static com.google.common.base.CaseFormat.LOWER_CAMEL;
 import static com.google.common.base.CaseFormat.UPPER_CAMEL;
 import static dagger.internal.codegen.ConfigurationAnnotations.isSubcomponentBuilder;
+import static dagger.internal.codegen.SourceFiles.protectAgainstKeywords;
 
 import dagger.model.DependencyRequest;
 import dagger.model.Key;
@@ -89,7 +90,7 @@
     TypeMirror type = typeToName(binding);
     type.accept(TYPE_NAMER, builder);
 
-    return UPPER_CAMEL.to(LOWER_CAMEL, builder.toString());
+    return protectAgainstKeywords(UPPER_CAMEL.to(LOWER_CAMEL, builder.toString()));
   }
 
   private static TypeMirror typeToName(Binding binding) {
diff --git a/java/dagger/internal/codegen/ComponentMethodBindingExpression.java b/java/dagger/internal/codegen/ComponentMethodBindingExpression.java
index 18eac4a..2a53a22 100644
--- a/java/dagger/internal/codegen/ComponentMethodBindingExpression.java
+++ b/java/dagger/internal/codegen/ComponentMethodBindingExpression.java
@@ -21,6 +21,7 @@
 import com.squareup.javapoet.ClassName;
 import com.squareup.javapoet.CodeBlock;
 import dagger.internal.codegen.ComponentDescriptor.ComponentMethodDescriptor;
+import javax.lang.model.type.TypeMirror;
 
 /**
  * A binding expression that implements and uses a component method.
@@ -61,6 +62,16 @@
   }
 
   @Override
+  Expression getDependencyExpression(ClassName requestingClass) {
+    // If a component method returns a primitive, update the expression's type which might be boxed.
+    Expression expression = super.getDependencyExpression(requestingClass);
+    TypeMirror methodReturnType = componentMethod.methodElement().getReturnType();
+    return methodReturnType.getKind().isPrimitive()
+        ? Expression.create(methodReturnType, expression.codeBlock())
+        : expression;
+  }
+
+  @Override
   protected void addMethod() {}
 
   @Override
diff --git a/java/dagger/internal/codegen/MethodBindingExpression.java b/java/dagger/internal/codegen/MethodBindingExpression.java
index c9e5390..3d8520a 100644
--- a/java/dagger/internal/codegen/MethodBindingExpression.java
+++ b/java/dagger/internal/codegen/MethodBindingExpression.java
@@ -35,7 +35,7 @@
   }
 
   @Override
-  final Expression getDependencyExpression(ClassName requestingClass) {
+  Expression getDependencyExpression(ClassName requestingClass) {
     addMethod();
     return Expression.create(
         methodImplementation.returnType(),
diff --git a/java/dagger/internal/codegen/SourceFiles.java b/java/dagger/internal/codegen/SourceFiles.java
index b97fc76..d7ce535 100644
--- a/java/dagger/internal/codegen/SourceFiles.java
+++ b/java/dagger/internal/codegen/SourceFiles.java
@@ -321,7 +321,7 @@
     return variableName;
   }
 
-  private static String protectAgainstKeywords(String candidateName) {
+  static String protectAgainstKeywords(String candidateName) {
     switch (candidateName) {
       case "package":
         return "pkg";
diff --git a/java/dagger/internal/codegen/SwitchingProviders.java b/java/dagger/internal/codegen/SwitchingProviders.java
index f2a6a00..441cd62 100644
--- a/java/dagger/internal/codegen/SwitchingProviders.java
+++ b/java/dagger/internal/codegen/SwitchingProviders.java
@@ -108,7 +108,10 @@
 
     // Primitives cannot be cast directly to the method's parameterized type, T. We have to first
     // cast them to their boxed type.
-    if (binding(key).contributedPrimitiveType().isPresent()) {
+    // TODO(user): Shouldn't we be able to rely soley on the instance expression type? However,
+    // that currently fails. Does that indicate that those dependency expression types are wrong?
+    if (binding(key).contributedPrimitiveType().isPresent()
+        || instanceExpression.type().getKind().isPrimitive()) {
       TypeName boxedType = TypeName.get(binding(key).contributedType()).box();
       instanceCodeBlock = CodeBlock.of("($T) $L", boxedType, instanceCodeBlock);
     }