diff --git a/java/dagger/hilt/android/processor/internal/androidentrypoint/ActivityGenerator.java b/java/dagger/hilt/android/processor/internal/androidentrypoint/ActivityGenerator.java index 2853fce5018..ce9ad14c56c 100644 --- a/java/dagger/hilt/android/processor/internal/androidentrypoint/ActivityGenerator.java +++ b/java/dagger/hilt/android/processor/internal/androidentrypoint/ActivityGenerator.java @@ -30,6 +30,7 @@ /** Generates an Hilt Activity class for the @AndroidEntryPoint annotated class. */ public final class ActivityGenerator { + private final ProcessingEnvironment env; private final AndroidEntryPointMetadata metadata; private final ClassName generatedClassName; @@ -50,12 +51,14 @@ public void generate() throws IOException { TypeSpec.classBuilder(generatedClassName.simpleName()) .addOriginatingElement(metadata.element()) .superclass(metadata.baseClassName()) - .addModifiers(metadata.generatedClassModifiers()) - .addMethod(onCreate()); + .addModifiers(metadata.generatedClassModifiers()); Generators.addGeneratedBaseClassJavadoc(builder, AndroidClassNames.ANDROID_ENTRY_POINT); Processors.addGeneratedAnnotation(builder, env, getClass()); - Generators.copyConstructors(metadata.baseElement(), builder); + + Generators.copyConstructors(metadata.baseElement(), builder); + builder.addMethod(onCreate()); + metadata.baseElement().getTypeParameters().stream() .map(TypeVariableName::get) diff --git a/java/dagger/hilt/android/processor/internal/androidentrypoint/Generators.java b/java/dagger/hilt/android/processor/internal/androidentrypoint/Generators.java index ef3fbea00f9..daadd032dcc 100644 --- a/java/dagger/hilt/android/processor/internal/androidentrypoint/Generators.java +++ b/java/dagger/hilt/android/processor/internal/androidentrypoint/Generators.java @@ -53,22 +53,30 @@ static void addGeneratedBaseClassJavadoc(TypeSpec.Builder builder, ClassName ann } /** - * Copies all constructors with arguments to the builder, if the base class is abstract. - * Otherwise throws an exception. + * Copies all constructors with arguments to the builder. */ static void copyConstructors(TypeElement baseClass, TypeSpec.Builder builder) { + copyConstructors(baseClass, CodeBlock.builder().build(), builder); + } + + /** + * Copies all constructors with arguments along with an appended body to the builder. + */ + static void copyConstructors(TypeElement baseClass, CodeBlock body, TypeSpec.Builder builder) { List constructors = ElementFilter.constructorsIn(baseClass.getEnclosedElements()) .stream() .filter(constructor -> !constructor.getModifiers().contains(PRIVATE)) .collect(Collectors.toList()); - if (constructors.size() == 1 && getOnlyElement(constructors).getParameters().isEmpty()) { + if (constructors.size() == 1 + && getOnlyElement(constructors).getParameters().isEmpty() + && body.isEmpty()) { // No need to copy the constructor if the default constructor will handle it. return; } - constructors.forEach(constructor -> builder.addMethod(copyConstructor(constructor))); + constructors.forEach(constructor -> builder.addMethod(copyConstructor(constructor, body))); } /** Returns Optional with AnnotationSpec for Nullable if found on element, empty otherwise. */ @@ -109,6 +117,10 @@ private static ParameterSpec getParameterSpecWithNullable(VariableElement parame // super(param1, param2); // } static MethodSpec copyConstructor(ExecutableElement constructor) { + return copyConstructor(constructor, CodeBlock.builder().build()); + } + + private static MethodSpec copyConstructor(ExecutableElement constructor, CodeBlock body) { List params = constructor.getParameters().stream() .map(parameter -> getParameterSpecWithNullable(parameter)) @@ -119,7 +131,8 @@ static MethodSpec copyConstructor(ExecutableElement constructor) { .addParameters(params) .addStatement( "super($L)", - params.stream().map(param -> param.name).collect(Collectors.joining(", "))); + params.stream().map(param -> param.name).collect(Collectors.joining(", "))) + .addCode(body); constructor.getAnnotationMirrors().stream() .filter(a -> Processors.hasAnnotation(a, AndroidClassNames.TARGET_API))