diff options
author | Wanying Ding <wanyingd@google.com> | 2024-01-11 10:54:11 -0800 |
---|---|---|
committer | Dagger Team <dagger-dev+copybara@google.com> | 2024-01-11 10:57:18 -0800 |
commit | 69ac5d8ea7ed8e296f83c3eb399e84814403eca8 (patch) | |
tree | 56300295ec816ed6e88a4d04dc15d372aa302f0c | |
parent | 3a75918ce39a097d420af9adaa4b92409a2b1691 (diff) | |
download | dagger2-69ac5d8ea7ed8e296f83c3eb399e84814403eca8.tar.gz |
Add error message if user make onCreate and onDestroy in base class final.
RELNOTES=n/a
PiperOrigin-RevId: 597600148
2 files changed, 121 insertions, 0 deletions
diff --git a/java/dagger/hilt/android/processor/internal/androidentrypoint/ActivityGenerator.java b/java/dagger/hilt/android/processor/internal/androidentrypoint/ActivityGenerator.java index 0852551da..e1bf74f50 100644 --- a/java/dagger/hilt/android/processor/internal/androidentrypoint/ActivityGenerator.java +++ b/java/dagger/hilt/android/processor/internal/androidentrypoint/ActivityGenerator.java @@ -45,6 +45,7 @@ import dagger.hilt.processor.internal.Processors; import dagger.internal.codegen.xprocessing.XElements; import java.io.IOException; import javax.lang.model.element.Modifier; +import javax.tools.Diagnostic; /** Generates an Hilt Activity class for the @AndroidEntryPoint annotated class. */ public final class ActivityGenerator { @@ -185,6 +186,14 @@ public final class ActivityGenerator { private MethodSpec onCreateComponentActivity() { XMethodElement nearestOverrideMethod = requireNearestOverrideMethod(ActivityMethod.ON_CREATE, metadata); + if (nearestOverrideMethod.isFinal()) { + env.getMessager() + .printMessage( + Diagnostic.Kind.ERROR, + "Do not mark onCreate as final in base Activity class, as Hilt needs to override it" + + " to inject SavedStateHandle.", + nearestOverrideMethod); + } ParameterSpec.Builder parameterBuilder = ParameterSpec.builder(AndroidClassNames.BUNDLE, "savedInstanceState"); MethodSpec.Builder methodBuilder = MethodSpec.methodBuilder("onCreate"); @@ -246,6 +255,14 @@ public final class ActivityGenerator { private MethodSpec onDestroyComponentActivity() { XMethodElement nearestOverrideMethod = requireNearestOverrideMethod(ActivityMethod.ON_DESTROY, metadata); + if (nearestOverrideMethod.isFinal()) { + env.getMessager() + .printMessage( + Diagnostic.Kind.ERROR, + "Do not mark onDestroy as final in base Activity class, as Hilt needs to override it" + + " to clean up SavedStateHandle.", + nearestOverrideMethod); + } return MethodSpec.methodBuilder("onDestroy") .addAnnotation(Override.class) .addModifiers(XElements.getModifiers(nearestOverrideMethod)) diff --git a/javatests/dagger/hilt/android/processor/internal/androidentrypoint/ActivityGeneratorTest.java b/javatests/dagger/hilt/android/processor/internal/androidentrypoint/ActivityGeneratorTest.java index b58c355c8..a056670d7 100644 --- a/javatests/dagger/hilt/android/processor/internal/androidentrypoint/ActivityGeneratorTest.java +++ b/javatests/dagger/hilt/android/processor/internal/androidentrypoint/ActivityGeneratorTest.java @@ -71,4 +71,108 @@ public class ActivityGeneratorTest { HiltCompilerTests.hiltCompiler(baseActivity, myActivity) .compile(subject -> subject.hasErrorCount(0)); } + + @Test + public void baseActivityHasFinalOnDestroy_fails() { + Source myActivity = + HiltCompilerTests.javaSource( + "test.MyActivity", + "package test;", + "", + "import dagger.hilt.android.AndroidEntryPoint;", + "", + "@AndroidEntryPoint(BaseActivity.class)", + "public class MyActivity extends Hilt_MyActivity {}"); + Source baseActivity = + HiltCompilerTests.javaSource( + "test.BaseActivity", + "package test;", + "", + "import androidx.activity.ComponentActivity;", + "", + "public class BaseActivity extends ComponentActivity {", + " @Override public final void onDestroy() {}", + "}"); + HiltCompilerTests.hiltCompiler(myActivity, baseActivity) + .compile( + subject -> { + // TODO(b/319663779) make error count consistent. + // subject.hasErrorCount(1); + subject.hasErrorContaining( + "Do not mark onDestroy as final in base Activity class, as Hilt needs to override" + + " it to clean up SavedStateHandle"); + }); + } + + @Test + public void baseActivityHasFinalOnCreate_fails() { + Source myActivity = + HiltCompilerTests.javaSource( + "test.MyActivity", + "package test;", + "", + "import dagger.hilt.android.AndroidEntryPoint;", + "", + "@AndroidEntryPoint(BaseActivity.class)", + "public class MyActivity extends Hilt_MyActivity {}"); + Source baseActivity = + HiltCompilerTests.javaSource( + "test.BaseActivity", + "package test;", + "", + "import android.os.Bundle;", + "import androidx.activity.ComponentActivity;", + "", + "public class BaseActivity extends ComponentActivity {", + " @Override public final void onCreate(Bundle bundle) {}", + "}"); + HiltCompilerTests.hiltCompiler(myActivity, baseActivity) + .compile( + subject -> { + // TODO(b/319663779) make error count consistent. + // subject.hasErrorCount(1); + subject.hasErrorContaining( + "Do not mark onCreate as final in base Activity class, as Hilt needs to override" + + " it to inject SavedStateHandle"); + }); + } + + @Test + public void secondBaseActivityHasFinalOnCreate_fails() { + Source myActivity = + HiltCompilerTests.javaSource( + "test.MyActivity", + "package test;", + "", + "import dagger.hilt.android.AndroidEntryPoint;", + "", + "@AndroidEntryPoint(BaseActivity.class)", + "public class MyActivity extends Hilt_MyActivity {}"); + Source baseActivity = + HiltCompilerTests.javaSource( + "test.BaseActivity", + "package test;", + "", + "public class BaseActivity extends BaseActivity2 {}"); + Source baseActivity2 = + HiltCompilerTests.javaSource( + "test.BaseActivity2", + "package test;", + "", + "import android.os.Bundle;", + "import androidx.activity.ComponentActivity;", + "", + "public class BaseActivity2 extends ComponentActivity {", + " @Override public final void onCreate(Bundle bundle) {}", + "}"); + HiltCompilerTests.hiltCompiler(myActivity, baseActivity, baseActivity2) + .compile( + subject -> { + // TODO(b/319663779) make error count consistent. + // subject.hasErrorCount(1); + subject.hasErrorContaining( + "Do not mark onCreate as final in base Activity class, as Hilt needs to override" + + " it to inject SavedStateHandle"); + }); + } } |