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);
}
/**