Skip to content

Commit

Permalink
Remove checks for unused binding kinds in FactoryGenerator.
Browse files Browse the repository at this point in the history
Factory generator can only be used with `INJECTION`, `ASSISTED_INJECTION`, and `PROVISION` kinds, so fail early if other kinds are detected.

RELNOTES=N/A
PiperOrigin-RevId: 642258494
  • Loading branch information
bcorso authored and Dagger Team committed Jun 11, 2024
1 parent 65b74f8 commit 33c7673
Showing 1 changed file with 10 additions and 17 deletions.
27 changes: 10 additions & 17 deletions java/dagger/internal/codegen/writing/FactoryGenerator.java
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@
import androidx.room.compiler.processing.XProcessingEnv;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Lists;
import com.squareup.javapoet.AnnotationSpec;
import com.squareup.javapoet.ClassName;
Expand Down Expand Up @@ -80,6 +81,9 @@
* Inject} constructors.
*/
public final class FactoryGenerator extends SourceFileGenerator<ProvisionBinding> {
private static final ImmutableSet<BindingKind> VALID_BINDING_KINDS =
ImmutableSet.of(BindingKind.INJECTION, BindingKind.ASSISTED_INJECTION, BindingKind.PROVISION);

private final CompilerOptions compilerOptions;
private final SourceFiles sourceFiles;

Expand All @@ -105,10 +109,7 @@ public ImmutableList<TypeSpec.Builder> topLevelTypes(ProvisionBinding binding) {
// We don't want to write out resolved bindings -- we want to write out the generic version.
checkArgument(!binding.unresolved().isPresent());
checkArgument(binding.bindingElement().isPresent());

if (binding.kind() == BindingKind.DELEGATE) {
return ImmutableList.of();
}
checkArgument(VALID_BINDING_KINDS.contains(binding.kind()));

return ImmutableList.of(factoryBuilder(binding));
}
Expand All @@ -117,14 +118,9 @@ private TypeSpec.Builder factoryBuilder(ProvisionBinding binding) {
TypeSpec.Builder factoryBuilder =
classBuilder(generatedClassNameForBinding(binding))
.addModifiers(PUBLIC, FINAL)
.addTypeVariables(bindingTypeElementTypeVariableNames(binding));

if (binding.kind() == BindingKind.INJECTION
|| binding.kind() == BindingKind.ASSISTED_INJECTION
|| binding.kind() == BindingKind.PROVISION) {
factoryBuilder.addAnnotation(scopeMetadataAnnotation(binding));
factoryBuilder.addAnnotation(qualifierMetadataAnnotation(binding));
}
.addTypeVariables(bindingTypeElementTypeVariableNames(binding))
.addAnnotation(scopeMetadataAnnotation(binding))
.addAnnotation(qualifierMetadataAnnotation(binding));

factoryTypeName(binding).ifPresent(factoryBuilder::addSuperinterface);
addConstructorAndFields(binding, factoryBuilder);
Expand Down Expand Up @@ -341,20 +337,17 @@ private enum FactoryCreationStrategy {

static FactoryCreationStrategy of(Binding binding) {
switch (binding.kind()) {
case DELEGATE:
throw new AssertionError("Delegate bindings don't have a factory.");
case PROVISION:
return binding.dependencies().isEmpty() && !binding.requiresModuleInstance()
? SINGLETON_INSTANCE
: CLASS_CONSTRUCTOR;
case INJECTION:
case MULTIBOUND_SET:
case MULTIBOUND_MAP:
case ASSISTED_INJECTION:
return binding.dependencies().isEmpty()
? SINGLETON_INSTANCE
: CLASS_CONSTRUCTOR;
default:
return CLASS_CONSTRUCTOR;
throw new AssertionError("Unexpected binding kind: " + binding.kind());
}
}
}
Expand Down

0 comments on commit 33c7673

Please sign in to comment.