|
17 | 17 | package dagger.hilt.android.processor.internal.androidentrypoint; |
18 | 18 |
|
19 | 19 | import static com.google.common.base.Preconditions.checkState; |
| 20 | +import static dagger.internal.codegen.extension.DaggerCollectors.toOptional; |
20 | 21 | import static dagger.internal.codegen.extension.DaggerStreams.toImmutableList; |
21 | 22 | import static kotlin.streams.jdk8.StreamsKt.asStream; |
22 | 23 |
|
|
44 | 45 | import dagger.hilt.processor.internal.Processors; |
45 | 46 | import dagger.internal.codegen.xprocessing.XElements; |
46 | 47 | import java.io.IOException; |
| 48 | +import java.util.Optional; |
47 | 49 | import javax.lang.model.element.Modifier; |
48 | 50 | import javax.tools.Diagnostic; |
49 | 51 |
|
@@ -185,31 +187,33 @@ private MethodSpec getDefaultViewModelProviderFactory() { |
185 | 187 | // } |
186 | 188 | // |
187 | 189 | private MethodSpec onCreateComponentActivity() { |
188 | | - XMethodElement nearestOverrideMethod = |
189 | | - requireNearestOverrideMethod(ActivityMethod.ON_CREATE, metadata); |
190 | | - if (nearestOverrideMethod.isFinal()) { |
| 190 | + XMethodElement nearestSuperClassMethod = |
| 191 | + nearestSuperClassMethod(ActivityMethod.ON_CREATE, metadata); |
| 192 | + if (nearestSuperClassMethod.isFinal()) { |
191 | 193 | env.getMessager() |
192 | 194 | .printMessage( |
193 | 195 | Diagnostic.Kind.ERROR, |
194 | 196 | "Do not mark onCreate as final in base Activity class, as Hilt needs to override it" |
195 | 197 | + " to inject SavedStateHandle.", |
196 | | - nearestOverrideMethod); |
| 198 | + nearestSuperClassMethod); |
197 | 199 | } |
198 | 200 | ParameterSpec.Builder parameterBuilder = |
199 | 201 | ParameterSpec.builder(AndroidClassNames.BUNDLE, "savedInstanceState"); |
200 | 202 | MethodSpec.Builder methodBuilder = MethodSpec.methodBuilder("onCreate"); |
201 | | - // If the sub class is overriding onCreate with @Nullable parameter, then this generated |
202 | | - // method will also prefix the parameter with @Nullable. |
203 | | - if (isNullable(nearestOverrideMethod.getParameters().get(0))) { |
| 203 | + if (isNullable(nearestSuperClassMethod.getParameters().get(0))) { |
204 | 204 | parameterBuilder.addAnnotation(AndroidClassNames.NULLABLE); |
205 | 205 | } |
206 | | - if (nearestOverrideMethod.hasAnnotation(AndroidClassNames.UI_THREAD)) { |
207 | | - methodBuilder.addAnnotation(AndroidClassNames.UI_THREAD); |
208 | | - } |
| 206 | + androidEntryPointMethod(ActivityMethod.ON_CREATE, metadata) |
| 207 | + .ifPresent( |
| 208 | + method -> { |
| 209 | + if (method.hasAnnotation(AndroidClassNames.UI_THREAD)) { |
| 210 | + methodBuilder.addAnnotation(AndroidClassNames.UI_THREAD); |
| 211 | + } |
| 212 | + }); |
209 | 213 | return methodBuilder |
210 | 214 | .addAnnotation(AndroidClassNames.CALL_SUPER) |
211 | 215 | .addAnnotation(Override.class) |
212 | | - .addModifiers(XElements.getModifiers(nearestOverrideMethod)) |
| 216 | + .addModifiers(XElements.getModifiers(nearestSuperClassMethod)) |
213 | 217 | .addParameter(parameterBuilder.build()) |
214 | 218 | .addStatement("super.onCreate(savedInstanceState)") |
215 | 219 | .addStatement("initSavedStateHandleHolder()") |
@@ -254,37 +258,35 @@ private static boolean hasNullableAnnotation(XAnnotated element) { |
254 | 258 | // } |
255 | 259 | // } |
256 | 260 | private MethodSpec onDestroyComponentActivity() { |
257 | | - XMethodElement nearestOverrideMethod = |
258 | | - requireNearestOverrideMethod(ActivityMethod.ON_DESTROY, metadata); |
259 | | - if (nearestOverrideMethod.isFinal()) { |
| 261 | + XMethodElement nearestSuperClassMethod = |
| 262 | + nearestSuperClassMethod(ActivityMethod.ON_DESTROY, metadata); |
| 263 | + if (nearestSuperClassMethod.isFinal()) { |
260 | 264 | env.getMessager() |
261 | 265 | .printMessage( |
262 | 266 | Diagnostic.Kind.ERROR, |
263 | 267 | "Do not mark onDestroy as final in base Activity class, as Hilt needs to override it" |
264 | 268 | + " to clean up SavedStateHandle.", |
265 | | - nearestOverrideMethod); |
| 269 | + nearestSuperClassMethod); |
266 | 270 | } |
267 | 271 | return MethodSpec.methodBuilder("onDestroy") |
268 | 272 | .addAnnotation(Override.class) |
269 | | - .addModifiers(XElements.getModifiers(nearestOverrideMethod)) |
| 273 | + .addModifiers(XElements.getModifiers(nearestSuperClassMethod)) |
270 | 274 | .addStatement("super.onDestroy()") |
271 | 275 | .beginControlFlow("if ($N != null)", SAVED_STATE_HANDLE_HOLDER_FIELD) |
272 | 276 | .addStatement("$N.clear()", SAVED_STATE_HANDLE_HOLDER_FIELD) |
273 | 277 | .endControlFlow() |
274 | 278 | .build(); |
275 | 279 | } |
276 | 280 |
|
277 | | - private static XMethodElement requireNearestOverrideMethod( |
| 281 | + private static Optional<XMethodElement> androidEntryPointMethod( |
278 | 282 | ActivityMethod activityMethod, AndroidEntryPointMetadata metadata) { |
279 | | - XMethodElement methodOnAndroidEntryPointElement = |
280 | | - metadata.element().getDeclaredMethods().stream() |
281 | | - .filter(method -> MethodSignature.of(method).equals(activityMethod.signature)) |
282 | | - .findFirst() |
283 | | - .orElse(null); |
284 | | - if (methodOnAndroidEntryPointElement != null) { |
285 | | - return methodOnAndroidEntryPointElement; |
286 | | - } |
| 283 | + return metadata.element().getDeclaredMethods().stream() |
| 284 | + .filter(method -> MethodSignature.of(method).equals(activityMethod.signature)) |
| 285 | + .collect(toOptional()); |
| 286 | + } |
287 | 287 |
|
| 288 | + private static XMethodElement nearestSuperClassMethod( |
| 289 | + ActivityMethod activityMethod, AndroidEntryPointMetadata metadata) { |
288 | 290 | ImmutableList<XMethodElement> methodOnBaseElement = |
289 | 291 | asStream(metadata.baseElement().getAllMethods()) |
290 | 292 | .filter(method -> MethodSignature.of(method).equals(activityMethod.signature)) |
|
0 commit comments