Add a convenience function for creating anonymous Providers in JavaPoet

RELNOTES=n/a

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=180601409
diff --git a/java/dagger/internal/codegen/CodeBlocks.java b/java/dagger/internal/codegen/CodeBlocks.java
index 8b6b4a0..ea3058e 100644
--- a/java/dagger/internal/codegen/CodeBlocks.java
+++ b/java/dagger/internal/codegen/CodeBlocks.java
@@ -16,8 +16,12 @@
 
 package dagger.internal.codegen;
 
+import static com.squareup.javapoet.MethodSpec.methodBuilder;
+import static com.squareup.javapoet.TypeSpec.anonymousClassBuilder;
+import static dagger.internal.codegen.TypeNames.providerOf;
 import static dagger.internal.codegen.TypeNames.rawTypeName;
 import static java.util.stream.StreamSupport.stream;
+import static javax.lang.model.element.Modifier.PUBLIC;
 
 import com.google.auto.common.MoreElements;
 import com.google.auto.common.MoreTypes;
@@ -84,6 +88,24 @@
     method.addAnnotation(ClassName.get(MoreTypes.asTypeElement(nullableType)));
   }
 
+  /**
+   * Returns an anonymous {@link javax.inject.Provider} class with the single {@link
+   * javax.inject.Provider#get()} method implemented by {@code body}.
+   */
+  static CodeBlock anonymousProvider(TypeName providedType, CodeBlock body) {
+    return CodeBlock.of("$L",
+        anonymousClassBuilder("")
+            .superclass(providerOf(providedType))
+            .addMethod(
+                methodBuilder("get")
+                    .addAnnotation(Override.class)
+                    .addModifiers(PUBLIC)
+                    .returns(providedType)
+                    .addCode(body)
+                    .build())
+            .build());
+  }
+
   private static final class CodeBlockJoiner {
     private final String delimiter;
     private final CodeBlock.Builder builder;
diff --git a/java/dagger/internal/codegen/PrivateMethodBindingExpression.java b/java/dagger/internal/codegen/PrivateMethodBindingExpression.java
index c46d28e..c84b4ca 100644
--- a/java/dagger/internal/codegen/PrivateMethodBindingExpression.java
+++ b/java/dagger/internal/codegen/PrivateMethodBindingExpression.java
@@ -20,13 +20,12 @@
 import static com.google.common.base.CaseFormat.UPPER_CAMEL;
 import static com.google.common.base.CaseFormat.UPPER_UNDERSCORE;
 import static com.squareup.javapoet.MethodSpec.methodBuilder;
-import static com.squareup.javapoet.TypeSpec.anonymousClassBuilder;
+import static dagger.internal.codegen.CodeBlocks.anonymousProvider;
 import static dagger.internal.codegen.ContributionBinding.FactoryCreationStrategy.SINGLETON_INSTANCE;
 import static dagger.internal.codegen.GeneratedComponentModel.FieldSpecKind.PRIVATE_METHOD_SCOPED_FIELD;
 import static dagger.internal.codegen.GeneratedComponentModel.MethodSpecKind.PRIVATE_METHOD;
 import static dagger.internal.codegen.RequestKinds.requestType;
 import static javax.lang.model.element.Modifier.PRIVATE;
-import static javax.lang.model.element.Modifier.PUBLIC;
 import static javax.lang.model.element.Modifier.VOLATILE;
 
 import com.google.auto.common.MoreTypes;
@@ -262,22 +261,15 @@
   }
 
   /** Returns a {@link TypeSpec} for an anonymous provider class. */
-  private TypeSpec providerTypeSpec() {
+  private CodeBlock providerTypeSpec() {
     // TODO(user): For scoped bindings that have already been created, use InstanceFactory?
-    return anonymousClassBuilder("")
-        .addSuperinterface(TypeName.get(returnType()))
-        .addMethod(
-            methodBuilder("get")
-                .addAnnotation(Override.class)
-                .addModifiers(PUBLIC)
-                .returns(TypeName.get(accessibleType(binding.contributedType())))
-                .addStatement(
-                    "return $L",
-                    componentBindingExpressions
-                        .getDependencyExpression(key(), RequestKind.INSTANCE, componentName())
-                        .codeBlock())
-                .build())
-        .build();
+    return anonymousProvider(
+        TypeName.get(accessibleType(binding.contributedType())),
+        CodeBlock.of(
+            "return $L;",
+            componentBindingExpressions
+                .getDependencyExpression(key(), RequestKind.INSTANCE, componentName())
+                .codeBlock()));
   }
 
   /** Returns the canonical name for a no-arg dependency expression method. */
diff --git a/java/dagger/internal/codegen/ProviderOrProducerFieldInitializer.java b/java/dagger/internal/codegen/ProviderOrProducerFieldInitializer.java
index 826d0d6..0c048fa 100644
--- a/java/dagger/internal/codegen/ProviderOrProducerFieldInitializer.java
+++ b/java/dagger/internal/codegen/ProviderOrProducerFieldInitializer.java
@@ -25,6 +25,7 @@
 import static com.squareup.javapoet.MethodSpec.methodBuilder;
 import static com.squareup.javapoet.TypeSpec.anonymousClassBuilder;
 import static dagger.internal.codegen.Accessibility.isTypeAccessibleFrom;
+import static dagger.internal.codegen.CodeBlocks.anonymousProvider;
 import static dagger.internal.codegen.CodeBlocks.makeParametersCodeBlock;
 import static dagger.internal.codegen.ContributionBinding.Kind.INJECTION;
 import static dagger.internal.codegen.GeneratedComponentModel.TypeSpecKind.COMPONENT_PROVISION_FACTORY;
@@ -205,18 +206,8 @@
                     .componentDescriptor()
                     .subcomponentsByBuilderType()
                     .get(MoreTypes.asTypeElement(binding.key().type())));
-        return CodeBlock.of(
-            "$L",
-            anonymousClassBuilder("")
-                .superclass(providerOf(bindingKeyTypeName))
-                .addMethod(
-                    methodBuilder("get")
-                        .addAnnotation(Override.class)
-                        .addModifiers(PUBLIC)
-                        .returns(bindingKeyTypeName)
-                        .addStatement("return new $LBuilder()", subcomponentName)
-                        .build())
-                .build());
+        return anonymousProvider(
+            bindingKeyTypeName, CodeBlock.of("return new $NBuilder();", subcomponentName));
 
       case BOUND_INSTANCE:
         return CodeBlock.of(
@@ -494,19 +485,8 @@
           referenceReleasingManagerFields.getExpression(scope, generatedComponentModel.name());
     }
 
-    TypeName keyType = TypeName.get(binding.key().type());
-    return CodeBlock.of(
-        "$L",
-        anonymousClassBuilder("")
-            .addSuperinterface(providerOf(keyType))
-            .addMethod(
-                methodBuilder("get")
-                    .addAnnotation(Override.class)
-                    .addModifiers(PUBLIC)
-                    .returns(keyType)
-                    .addCode("return $L;", managerExpression)
-                    .build())
-            .build());
+    return anonymousProvider(
+        TypeName.get(binding.key().type()), CodeBlock.of("return $L;", managerExpression));
   }
 
   /**
@@ -542,22 +522,13 @@
       }
     }
     TypeName keyTypeName = TypeName.get(key.type());
-    return CodeBlock.of(
-        "$L",
-        anonymousClassBuilder("")
-            .addSuperinterface(providerOf(keyTypeName))
-            .addMethod(
-                methodBuilder("get")
-                    .addAnnotation(Override.class)
-                    .addModifiers(PUBLIC)
-                    .returns(keyTypeName)
-                    .addCode(
-                        "return new $T($T.asList($L));",
-                        HashSet.class,
-                        Arrays.class,
-                        makeParametersCodeBlock(managerExpressions.build()))
-                    .build())
-            .build());
+    CodeBlock body =
+        CodeBlock.of(
+            "return new $T($T.asList($L));",
+            HashSet.class,
+            Arrays.class,
+            makeParametersCodeBlock(managerExpressions.build()));
+    return anonymousProvider(keyTypeName, body);
   }
 
   /**