diff options
Diffstat (limited to 'java/dagger/internal/codegen/writing')
11 files changed, 116 insertions, 76 deletions
diff --git a/java/dagger/internal/codegen/writing/AnnotationCreatorGenerator.java b/java/dagger/internal/codegen/writing/AnnotationCreatorGenerator.java index fa3a16cac..96e6340af 100644 --- a/java/dagger/internal/codegen/writing/AnnotationCreatorGenerator.java +++ b/java/dagger/internal/codegen/writing/AnnotationCreatorGenerator.java @@ -39,6 +39,7 @@ import com.squareup.javapoet.TypeSpec; import dagger.internal.codegen.base.SourceFileGenerator; import dagger.internal.codegen.langmodel.DaggerElements; import java.util.LinkedHashSet; +import java.util.Optional; import java.util.Set; import javax.annotation.processing.Filer; import javax.inject.Inject; @@ -87,13 +88,18 @@ public class AnnotationCreatorGenerator extends SourceFileGenerator<TypeElement> } @Override + public ClassName nameGeneratedType(TypeElement annotationType) { + return getAnnotationCreatorClassName(annotationType); + } + + @Override public Element originatingElement(TypeElement annotationType) { return annotationType; } @Override - public ImmutableList<TypeSpec.Builder> topLevelTypes(TypeElement annotationType) { - ClassName generatedTypeName = getAnnotationCreatorClassName(annotationType); + public Optional<TypeSpec.Builder> write(TypeElement annotationType) { + ClassName generatedTypeName = nameGeneratedType(annotationType); TypeSpec.Builder annotationCreatorBuilder = classBuilder(generatedTypeName) .addModifiers(PUBLIC, FINAL) @@ -103,7 +109,7 @@ public class AnnotationCreatorGenerator extends SourceFileGenerator<TypeElement> annotationCreatorBuilder.addMethod(buildCreateMethod(generatedTypeName, annotationElement)); } - return ImmutableList.of(annotationCreatorBuilder); + return Optional.of(annotationCreatorBuilder); } private MethodSpec buildCreateMethod(ClassName generatedTypeName, TypeElement annotationElement) { diff --git a/java/dagger/internal/codegen/writing/AssistedFactoryBindingExpression.java b/java/dagger/internal/codegen/writing/AssistedFactoryBindingExpression.java index d90ab71f1..d0c481c7a 100644 --- a/java/dagger/internal/codegen/writing/AssistedFactoryBindingExpression.java +++ b/java/dagger/internal/codegen/writing/AssistedFactoryBindingExpression.java @@ -83,7 +83,7 @@ final class AssistedFactoryBindingExpression extends SimpleInvocationBindingExpr private TypeSpec anonymousfactoryImpl(Expression assistedInjectionExpression) { TypeElement factory = asType(binding.bindingElement().get()); DeclaredType factoryType = asDeclared(binding.key().type()); - ExecutableElement factoryMethod = assistedFactoryMethod(factory, elements); + ExecutableElement factoryMethod = assistedFactoryMethod(factory, elements, types); // We can't use MethodSpec.overriding directly because we need to control the parameter names. MethodSpec factoryOverride = MethodSpec.overriding(factoryMethod, factoryType, types).build(); diff --git a/java/dagger/internal/codegen/writing/ComponentBindingExpressions.java b/java/dagger/internal/codegen/writing/ComponentBindingExpressions.java index dc15c998b..5f1f0bdd8 100644 --- a/java/dagger/internal/codegen/writing/ComponentBindingExpressions.java +++ b/java/dagger/internal/codegen/writing/ComponentBindingExpressions.java @@ -212,14 +212,19 @@ public final class ComponentBindingExpressions { public MethodSpec getComponentMethod(ComponentMethodDescriptor componentMethod) { checkArgument(componentMethod.dependencyRequest().isPresent()); BindingRequest request = bindingRequest(componentMethod.dependencyRequest().get()); - return MethodSpec.overriding( + MethodSpec.Builder method = + MethodSpec.overriding( componentMethod.methodElement(), MoreTypes.asDeclared(graph.componentTypeElement().asType()), - types) - .addCode( - getBindingExpression(request) - .getComponentMethodImplementation(componentMethod, componentImplementation)) - .build(); + types); + // Even though this is not used if the method is abstract, we need to invoke the binding + // expression in order for the side of effect of the method being added to the + // ComponentImplementation + CodeBlock methodBody = + getBindingExpression(request) + .getComponentMethodImplementation(componentMethod, componentImplementation); + + return method.addCode(methodBody).build(); } /** Returns the {@link BindingExpression} for the given {@link BindingRequest}. */ @@ -455,7 +460,8 @@ public final class ComponentBindingExpressions { private BindingExpression providerBindingExpression(ContributionBinding binding) { if (binding.kind().equals(DELEGATE) && !needsCaching(binding)) { return new DelegateBindingExpression(binding, RequestKind.PROVIDER, this, types, elements); - } else if (isFastInit() + } else if (compilerOptions.fastInit( + topLevelComponentImplementation.componentDescriptor().typeElement()) && frameworkInstanceCreationExpression(binding).useInnerSwitchingProvider() && !(instanceBindingExpression(binding) instanceof DerivedFromFrameworkInstanceBindingExpression)) { @@ -487,27 +493,24 @@ public final class ComponentBindingExpressions { /** * Returns a binding expression for {@link RequestKind#INSTANCE} requests. + * + * <p>If there is a direct expression (not calling {@link Provider#get()}) we can use for an + * instance of this binding, return it, wrapped in a method if the binding {@linkplain + * #needsCaching(ContributionBinding) needs to be cached} or the expression has dependencies. + * + * <p>In fastInit mode, we can use direct expressions unless the binding needs to be cached. */ private BindingExpression instanceBindingExpression(ContributionBinding binding) { Optional<BindingExpression> maybeDirectInstanceExpression = unscopedDirectInstanceExpression(binding); - if (maybeDirectInstanceExpression.isPresent()) { - // If this is the case where we don't need to use Provider#get() because there's no caching - // and it isn't an assisted factory, or because we're in fastInit mode (since fastInit avoids - // using Providers), we can try to use the direct expression, possibly wrapped in a method - // if necessary (e.g. it has dependencies). - if ((!needsCaching(binding) && binding.kind() != BindingKind.ASSISTED_FACTORY) - || isFastInit()) { - BindingExpression directInstanceExpression = maybeDirectInstanceExpression.get(); - // While this can't require caching in default mode, if we're in fastInit mode and we need - // caching we also need to wrap it in a method. - return directInstanceExpression.requiresMethodEncapsulation() || needsCaching(binding) - ? wrapInMethod( - binding, - bindingRequest(binding.key(), RequestKind.INSTANCE), - directInstanceExpression) - : directInstanceExpression; - } + if (canUseDirectInstanceExpression(binding) && maybeDirectInstanceExpression.isPresent()) { + BindingExpression directInstanceExpression = maybeDirectInstanceExpression.get(); + return directInstanceExpression.requiresMethodEncapsulation() || needsCaching(binding) + ? wrapInMethod( + binding, + bindingRequest(binding.key(), RequestKind.INSTANCE), + directInstanceExpression) + : directInstanceExpression; } return new DerivedFromFrameworkInstanceBindingExpression( binding.key(), FrameworkType.PROVIDER, RequestKind.INSTANCE, this, types); @@ -607,12 +610,27 @@ public final class ComponentBindingExpressions { * MapFactory} or {@code SetFactory}. */ private boolean useStaticFactoryCreation(ContributionBinding binding) { - return !isFastInit() + return !compilerOptions.fastInit( + topLevelComponentImplementation.componentDescriptor().typeElement()) || binding.kind().equals(MULTIBOUND_MAP) || binding.kind().equals(MULTIBOUND_SET); } /** + * Returns {@code true} if we can use a direct (not {@code Provider.get()}) expression for this + * binding. If the binding doesn't {@linkplain #needsCaching(ContributionBinding) need to be + * cached} and the binding is not an {@link BindingKind.ASSISTED_FACTORY}, we can. + * + * <p>In fastInit mode, we can use a direct expression even if the binding {@linkplain + * #needsCaching(ContributionBinding) needs to be cached}. + */ + private boolean canUseDirectInstanceExpression(ContributionBinding binding) { + return (!needsCaching(binding) && binding.kind() != BindingKind.ASSISTED_FACTORY) + || compilerOptions.fastInit( + topLevelComponentImplementation.componentDescriptor().typeElement()); + } + + /** * Returns a binding expression that uses a given one as the body of a method that users call. If * a component provision method matches it, it will be the method implemented. If it does not * match a component provision method and the binding is modifiable, then a new public modifiable @@ -672,7 +690,8 @@ public final class ComponentBindingExpressions { private MethodImplementationStrategy methodImplementationStrategy( ContributionBinding binding, BindingRequest request) { - if (isFastInit()) { + if (compilerOptions.fastInit( + topLevelComponentImplementation.componentDescriptor().typeElement())) { if (request.isRequestKind(RequestKind.PROVIDER)) { return MethodImplementationStrategy.SINGLE_CHECK; } else if (request.isRequestKind(RequestKind.INSTANCE) && needsCaching(binding)) { @@ -699,9 +718,4 @@ public final class ComponentBindingExpressions { } return true; } - - private boolean isFastInit() { - return compilerOptions.fastInit( - topLevelComponentImplementation.componentDescriptor().typeElement()); - } } diff --git a/java/dagger/internal/codegen/writing/ComponentImplementation.java b/java/dagger/internal/codegen/writing/ComponentImplementation.java index a09620e87..ef6912460 100644 --- a/java/dagger/internal/codegen/writing/ComponentImplementation.java +++ b/java/dagger/internal/codegen/writing/ComponentImplementation.java @@ -276,10 +276,7 @@ public final class ComponentImplementation { "%s is not a child component of %s", childDescriptor.typeElement(), componentDescriptor().typeElement()); - // TODO(erichang): Hacky fix to shorten the suffix if we're too deeply - // nested to save on file name length. 2 chosen arbitrarily. - String suffix = name.simpleNames().size() > 2 ? "I" : "Impl"; - return name.nestedClass(subcomponentNames.get(childDescriptor) + suffix); + return name.nestedClass(subcomponentNames.get(childDescriptor) + "Impl"); } /** diff --git a/java/dagger/internal/codegen/writing/DependencyMethodProviderCreationExpression.java b/java/dagger/internal/codegen/writing/DependencyMethodProviderCreationExpression.java index af5d45e66..5a40c0206 100644 --- a/java/dagger/internal/codegen/writing/DependencyMethodProviderCreationExpression.java +++ b/java/dagger/internal/codegen/writing/DependencyMethodProviderCreationExpression.java @@ -96,7 +96,7 @@ final class DependencyMethodProviderCreationExpression COMPONENT_PROVISION_FACTORY, classBuilder(factoryClassName()) .addSuperinterface(providerOf(keyType)) - .addModifiers(PRIVATE, STATIC, FINAL) + .addModifiers(PRIVATE, STATIC) .addField(dependencyClassName, dependency().variableName(), PRIVATE, FINAL) .addMethod( constructorBuilder() diff --git a/java/dagger/internal/codegen/writing/FactoryGenerator.java b/java/dagger/internal/codegen/writing/FactoryGenerator.java index 03ad27cbb..70edd1a95 100644 --- a/java/dagger/internal/codegen/writing/FactoryGenerator.java +++ b/java/dagger/internal/codegen/writing/FactoryGenerator.java @@ -97,27 +97,32 @@ public final class FactoryGenerator extends SourceFileGenerator<ProvisionBinding } @Override + public ClassName nameGeneratedType(ProvisionBinding binding) { + return generatedClassNameForBinding(binding); + } + + @Override public Element originatingElement(ProvisionBinding binding) { // we only create factories for bindings that have a binding element return binding.bindingElement().get(); } @Override - public ImmutableList<TypeSpec.Builder> topLevelTypes(ProvisionBinding binding) { + public Optional<TypeSpec.Builder> write(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.factoryCreationStrategy().equals(DELEGATE)) { - return ImmutableList.of(); + return Optional.empty(); } - return ImmutableList.of(factoryBuilder(binding)); + return Optional.of(factoryBuilder(binding)); } private TypeSpec.Builder factoryBuilder(ProvisionBinding binding) { TypeSpec.Builder factoryBuilder = - classBuilder(generatedClassNameForBinding(binding)) + classBuilder(nameGeneratedType(binding)) .addModifiers(PUBLIC, FINAL) .addTypeVariables(bindingTypeElementTypeVariableNames(binding)); @@ -189,9 +194,8 @@ public final class FactoryGenerator extends SourceFileGenerator<ProvisionBinding switch (binding.factoryCreationStrategy()) { case SINGLETON_INSTANCE: FieldSpec.Builder instanceFieldBuilder = - FieldSpec.builder( - generatedClassNameForBinding(binding), "INSTANCE", PRIVATE, STATIC, FINAL) - .initializer("new $T()", generatedClassNameForBinding(binding)); + FieldSpec.builder(nameGeneratedType(binding), "INSTANCE", PRIVATE, STATIC, FINAL) + .initializer("new $T()", nameGeneratedType(binding)); if (!bindingTypeElementTypeVariableNames(binding).isEmpty()) { // If the factory has type parameters, ignore them in the field declaration & initializer @@ -199,8 +203,7 @@ public final class FactoryGenerator extends SourceFileGenerator<ProvisionBinding createMethodBuilder.addAnnotation(suppressWarnings(UNCHECKED)); } - ClassName instanceHolderName = - generatedClassNameForBinding(binding).nestedClass("InstanceHolder"); + ClassName instanceHolderName = nameGeneratedType(binding).nestedClass("InstanceHolder"); createMethodBuilder.addStatement("return $T.INSTANCE", instanceHolderName); factoryBuilder.addType( TypeSpec.classBuilder(instanceHolderName) @@ -245,7 +248,7 @@ public final class FactoryGenerator extends SourceFileGenerator<ProvisionBinding request -> frameworkTypeUsageStatement( CodeBlock.of("$N", frameworkFields.get(request)), request.kind()), - generatedClassNameForBinding(binding), + nameGeneratedType(binding), moduleParameter(binding).map(module -> CodeBlock.of("$N", module)), compilerOptions, metadataUtil); @@ -262,7 +265,7 @@ public final class FactoryGenerator extends SourceFileGenerator<ProvisionBinding .addCode( InjectionSiteMethod.invokeAll( binding.injectionSites(), - generatedClassNameForBinding(binding), + nameGeneratedType(binding), instance, binding.key().type(), frameworkFieldUsages(binding.dependencies(), frameworkFields)::get, diff --git a/java/dagger/internal/codegen/writing/HjarSourceFileGenerator.java b/java/dagger/internal/codegen/writing/HjarSourceFileGenerator.java index d4dbde794..5a4b6f132 100644 --- a/java/dagger/internal/codegen/writing/HjarSourceFileGenerator.java +++ b/java/dagger/internal/codegen/writing/HjarSourceFileGenerator.java @@ -19,15 +19,14 @@ package dagger.internal.codegen.writing; import static com.squareup.javapoet.MethodSpec.constructorBuilder; import static com.squareup.javapoet.MethodSpec.methodBuilder; import static com.squareup.javapoet.TypeSpec.classBuilder; -import static dagger.internal.codegen.extension.DaggerStreams.toImmutableList; import static javax.lang.model.element.Modifier.PRIVATE; -import com.google.common.collect.ImmutableList; import com.squareup.javapoet.ClassName; import com.squareup.javapoet.FieldSpec; import com.squareup.javapoet.MethodSpec; import com.squareup.javapoet.TypeSpec; import dagger.internal.codegen.base.SourceFileGenerator; +import java.util.Optional; import javax.lang.model.element.Element; import javax.lang.model.element.Modifier; @@ -48,15 +47,18 @@ public final class HjarSourceFileGenerator<T> extends SourceFileGenerator<T> { } @Override + public ClassName nameGeneratedType(T input) { + return delegate.nameGeneratedType(input); + } + + @Override public Element originatingElement(T input) { return delegate.originatingElement(input); } @Override - public ImmutableList<TypeSpec.Builder> topLevelTypes(T input) { - return delegate.topLevelTypes(input).stream() - .map(completeType -> skeletonType(completeType.build())) - .collect(toImmutableList()); + public Optional<TypeSpec.Builder> write(T input) { + return delegate.write(input).map(completeType -> skeletonType(completeType.build())); } private TypeSpec.Builder skeletonType(TypeSpec completeType) { diff --git a/java/dagger/internal/codegen/writing/InaccessibleMapKeyProxyGenerator.java b/java/dagger/internal/codegen/writing/InaccessibleMapKeyProxyGenerator.java index 889f8985c..d52735963 100644 --- a/java/dagger/internal/codegen/writing/InaccessibleMapKeyProxyGenerator.java +++ b/java/dagger/internal/codegen/writing/InaccessibleMapKeyProxyGenerator.java @@ -22,13 +22,14 @@ import static javax.lang.model.element.Modifier.FINAL; import static javax.lang.model.element.Modifier.PRIVATE; import static javax.lang.model.element.Modifier.PUBLIC; -import com.google.common.collect.ImmutableList; +import com.squareup.javapoet.ClassName; import com.squareup.javapoet.TypeSpec; import dagger.internal.codegen.base.SourceFileGenerator; import dagger.internal.codegen.binding.ContributionBinding; import dagger.internal.codegen.binding.MapKeys; import dagger.internal.codegen.langmodel.DaggerElements; import dagger.internal.codegen.langmodel.DaggerTypes; +import java.util.Optional; import javax.annotation.processing.Filer; import javax.inject.Inject; import javax.lang.model.SourceVersion; @@ -52,21 +53,24 @@ public final class InaccessibleMapKeyProxyGenerator } @Override + public ClassName nameGeneratedType(ContributionBinding binding) { + return MapKeys.mapKeyProxyClassName(binding); + } + + @Override public Element originatingElement(ContributionBinding binding) { // a map key is only ever present on bindings that have a binding element return binding.bindingElement().get(); } @Override - public ImmutableList<TypeSpec.Builder> topLevelTypes(ContributionBinding binding) { + public Optional<TypeSpec.Builder> write(ContributionBinding binding) { return MapKeys.mapKeyFactoryMethod(binding, types, elements) .map( method -> - classBuilder(MapKeys.mapKeyProxyClassName(binding)) + classBuilder(nameGeneratedType(binding)) .addModifiers(PUBLIC, FINAL) .addMethod(constructorBuilder().addModifiers(PRIVATE).build()) - .addMethod(method)) - .map(ImmutableList::of) - .orElse(ImmutableList.of()); + .addMethod(method)); } } diff --git a/java/dagger/internal/codegen/writing/MembersInjectorGenerator.java b/java/dagger/internal/codegen/writing/MembersInjectorGenerator.java index 8630ce6ca..df618b070 100644 --- a/java/dagger/internal/codegen/writing/MembersInjectorGenerator.java +++ b/java/dagger/internal/codegen/writing/MembersInjectorGenerator.java @@ -61,6 +61,7 @@ import dagger.internal.codegen.langmodel.DaggerTypes; import dagger.internal.codegen.writing.InjectionMethods.InjectionSiteMethod; import dagger.model.DependencyRequest; import java.util.Map.Entry; +import java.util.Optional; import javax.annotation.processing.Filer; import javax.inject.Inject; import javax.lang.model.SourceVersion; @@ -86,15 +87,20 @@ public final class MembersInjectorGenerator extends SourceFileGenerator<MembersI } @Override + public ClassName nameGeneratedType(MembersInjectionBinding binding) { + return membersInjectorNameForType(binding.membersInjectedType()); + } + + @Override public Element originatingElement(MembersInjectionBinding binding) { return binding.membersInjectedType(); } @Override - public ImmutableList<TypeSpec.Builder> topLevelTypes(MembersInjectionBinding binding) { + public Optional<TypeSpec.Builder> write(MembersInjectionBinding binding) { // Empty members injection bindings are special and don't need source files. if (binding.injectionSites().isEmpty()) { - return ImmutableList.of(); + return Optional.empty(); } // Members injectors for classes with no local injection sites and no @Inject @@ -102,7 +108,7 @@ public final class MembersInjectorGenerator extends SourceFileGenerator<MembersI if (!binding.hasLocalInjectionSites() && injectedConstructors(binding.membersInjectedType()).isEmpty() && assistedInjectedConstructors(binding.membersInjectedType()).isEmpty()) { - return ImmutableList.of(); + return Optional.empty(); } @@ -112,7 +118,7 @@ public final class MembersInjectorGenerator extends SourceFileGenerator<MembersI "tried to generate a MembersInjector for a binding of a resolved generic type: %s", binding); - ClassName generatedTypeName = membersInjectorNameForType(binding.membersInjectedType()); + ClassName generatedTypeName = nameGeneratedType(binding); ImmutableList<TypeVariableName> typeParameters = bindingTypeElementTypeVariableNames(binding); TypeSpec.Builder injectorTypeBuilder = classBuilder(generatedTypeName) @@ -216,6 +222,6 @@ public final class MembersInjectorGenerator extends SourceFileGenerator<MembersI gwtIncompatibleAnnotation(binding).ifPresent(injectorTypeBuilder::addAnnotation); - return ImmutableList.of(injectorTypeBuilder); + return Optional.of(injectorTypeBuilder); } } diff --git a/java/dagger/internal/codegen/writing/ModuleProxies.java b/java/dagger/internal/codegen/writing/ModuleProxies.java index 6d174f824..fcd9b56e5 100644 --- a/java/dagger/internal/codegen/writing/ModuleProxies.java +++ b/java/dagger/internal/codegen/writing/ModuleProxies.java @@ -27,7 +27,6 @@ import static javax.lang.model.element.Modifier.PUBLIC; import static javax.lang.model.element.Modifier.STATIC; import static javax.lang.model.util.ElementFilter.constructorsIn; -import com.google.common.collect.ImmutableList; import com.squareup.javapoet.ClassName; import com.squareup.javapoet.CodeBlock; import com.squareup.javapoet.TypeSpec; @@ -79,20 +78,25 @@ public final class ModuleProxies { } @Override + public ClassName nameGeneratedType(TypeElement moduleElement) { + return moduleProxies.constructorProxyTypeName(moduleElement); + } + + @Override public Element originatingElement(TypeElement moduleElement) { return moduleElement; } @Override - public ImmutableList<TypeSpec.Builder> topLevelTypes(TypeElement moduleElement) { + public Optional<TypeSpec.Builder> write(TypeElement moduleElement) { ModuleKind.checkIsModule(moduleElement, metadataUtil); return moduleProxies.nonPublicNullaryConstructor(moduleElement).isPresent() - ? ImmutableList.of(buildProxy(moduleElement)) - : ImmutableList.of(); + ? Optional.of(buildProxy(moduleElement)) + : Optional.empty(); } private TypeSpec.Builder buildProxy(TypeElement moduleElement) { - return classBuilder(moduleProxies.constructorProxyTypeName(moduleElement)) + return classBuilder(nameGeneratedType(moduleElement)) .addModifiers(PUBLIC, FINAL) .addMethod(constructorBuilder().addModifiers(PRIVATE).build()) .addMethod( diff --git a/java/dagger/internal/codegen/writing/ProducerFactoryGenerator.java b/java/dagger/internal/codegen/writing/ProducerFactoryGenerator.java index a013be940..5e5292359 100644 --- a/java/dagger/internal/codegen/writing/ProducerFactoryGenerator.java +++ b/java/dagger/internal/codegen/writing/ProducerFactoryGenerator.java @@ -103,6 +103,10 @@ public final class ProducerFactoryGenerator extends SourceFileGenerator<Producti this.keyFactory = keyFactory; } + @Override + public ClassName nameGeneratedType(ProductionBinding binding) { + return generatedClassNameForBinding(binding); + } @Override public Element originatingElement(ProductionBinding binding) { @@ -111,7 +115,7 @@ public final class ProducerFactoryGenerator extends SourceFileGenerator<Producti } @Override - public ImmutableList<TypeSpec.Builder> topLevelTypes(ProductionBinding binding) { + public Optional<TypeSpec.Builder> write(ProductionBinding 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()); @@ -119,7 +123,7 @@ public final class ProducerFactoryGenerator extends SourceFileGenerator<Producti TypeName providedTypeName = TypeName.get(binding.contributedType()); TypeName futureTypeName = listenableFutureOf(providedTypeName); - ClassName generatedTypeName = generatedClassNameForBinding(binding); + ClassName generatedTypeName = nameGeneratedType(binding); TypeSpec.Builder factoryBuilder = classBuilder(generatedTypeName) .addModifiers(PUBLIC, FINAL) @@ -229,7 +233,7 @@ public final class ProducerFactoryGenerator extends SourceFileGenerator<Producti gwtIncompatibleAnnotation(binding).ifPresent(factoryBuilder::addAnnotation); // TODO(gak): write a sensible toString - return ImmutableList.of(factoryBuilder); + return Optional.of(factoryBuilder); } private MethodSpec staticFactoryMethod(ProductionBinding binding, MethodSpec constructor) { |