diff options
Diffstat (limited to 'java/dagger/hilt/android/processor')
14 files changed, 252 insertions, 67 deletions
diff --git a/java/dagger/hilt/android/processor/BUILD b/java/dagger/hilt/android/processor/BUILD index ccf21033d..e116c4443 100644 --- a/java/dagger/hilt/android/processor/BUILD +++ b/java/dagger/hilt/android/processor/BUILD @@ -15,14 +15,14 @@ # Description: # Hilt android processors. -load("//:build_defs.bzl", "POM_VERSION") +load("//:build_defs.bzl", "POM_VERSION_ALPHA") load("//tools:maven.bzl", "gen_maven_artifact") package(default_visibility = ["//:src"]) java_library( name = "artifact-lib", - tags = ["maven_coordinates=com.google.dagger:hilt-android-compiler:" + POM_VERSION], + tags = ["maven_coordinates=com.google.dagger:hilt-android-compiler:" + POM_VERSION_ALPHA], visibility = ["//visibility:private"], exports = [ "//java/dagger/hilt/processor:artifact-lib-shared", @@ -31,23 +31,23 @@ java_library( gen_maven_artifact( name = "artifact", - artifact_coordinates = "com.google.dagger:hilt-android-compiler:" + POM_VERSION, + artifact_coordinates = "com.google.dagger:hilt-android-compiler:" + POM_VERSION_ALPHA, artifact_name = "Hilt Android Processor", artifact_target = ":artifact-lib", artifact_target_libs = [ "//java/dagger/hilt/android/processor/internal:android_classnames", "//java/dagger/hilt/android/processor/internal:utils", "//java/dagger/hilt/android/processor/internal/androidentrypoint:android_generators", + "//java/dagger/hilt/android/processor/internal/androidentrypoint:compiler_options", "//java/dagger/hilt/android/processor/internal/androidentrypoint:metadata", "//java/dagger/hilt/android/processor/internal/androidentrypoint:processor_lib", "//java/dagger/hilt/android/processor/internal/bindvalue:bind_value_processor_lib", "//java/dagger/hilt/android/processor/internal/customtestapplication:processor_lib", "//java/dagger/hilt/android/processor/internal/viewmodel:validation_plugin_lib", + "//java/dagger/hilt/android/processor/internal/uninstallmodules:processor_lib", "//java/dagger/hilt/android/processor/internal/viewmodel:processor_lib", - "//java/dagger/hilt/processor/internal:aggregated_elements", "//java/dagger/hilt/processor/internal:base_processor", "//java/dagger/hilt/processor/internal:classnames", - "//java/dagger/hilt/processor/internal:compiler_options", "//java/dagger/hilt/processor/internal:component_descriptor", "//java/dagger/hilt/processor/internal:component_names", "//java/dagger/hilt/processor/internal:components", @@ -55,22 +55,17 @@ gen_maven_artifact( "//java/dagger/hilt/processor/internal:processor_errors", "//java/dagger/hilt/processor/internal:processors", "//java/dagger/hilt/processor/internal/aggregateddeps:component_dependencies", - "//java/dagger/hilt/processor/internal/aggregateddeps:pkg_private_metadata", "//java/dagger/hilt/processor/internal/aggregateddeps:processor_lib", "//java/dagger/hilt/processor/internal/aliasof:alias_ofs", "//java/dagger/hilt/processor/internal/aliasof:processor_lib", "//java/dagger/hilt/processor/internal/definecomponent:define_components", "//java/dagger/hilt/processor/internal/definecomponent:processor_lib", - "//java/dagger/hilt/processor/internal/earlyentrypoint:aggregated_early_entry_point_metadata", - "//java/dagger/hilt/processor/internal/earlyentrypoint:processor_lib", "//java/dagger/hilt/processor/internal/generatesrootinput:generates_root_inputs", "//java/dagger/hilt/processor/internal/generatesrootinput:processor_lib", "//java/dagger/hilt/processor/internal/originatingelement:processor_lib", "//java/dagger/hilt/processor/internal/root:processor_lib", "//java/dagger/hilt/processor/internal/root:root_metadata", "//java/dagger/hilt/processor/internal/root:root_type", - "//java/dagger/hilt/processor/internal/uninstallmodules:processor_lib", - "//java/dagger/hilt/processor/internal/uninstallmodules:aggregated_uninstall_modules_metadata", ], artifact_target_maven_deps = [ "com.google.auto:auto-common", diff --git a/java/dagger/hilt/android/processor/internal/AndroidClassNames.java b/java/dagger/hilt/android/processor/internal/AndroidClassNames.java index d37092003..915ae519f 100644 --- a/java/dagger/hilt/android/processor/internal/AndroidClassNames.java +++ b/java/dagger/hilt/android/processor/internal/AndroidClassNames.java @@ -113,10 +113,5 @@ public final class AndroidClassNames { public static final ClassName SAVED_STATE_HANDLE = get("androidx.lifecycle", "SavedStateHandle"); - public static final ClassName ON_CONTEXT_AVAILABLE_LISTENER = - get("androidx.activity.contextaware", "OnContextAvailableListener"); - public static final ClassName INJECT_VIA_ON_CONTEXT_AVAILABLE_LISTENER = - get("dagger.hilt.android", "InjectViaOnContextAvailableListener"); - private AndroidClassNames() {} } diff --git a/java/dagger/hilt/android/processor/internal/androidentrypoint/ActivityGenerator.java b/java/dagger/hilt/android/processor/internal/androidentrypoint/ActivityGenerator.java index 86fbaa712..ce9ad14c5 100644 --- a/java/dagger/hilt/android/processor/internal/androidentrypoint/ActivityGenerator.java +++ b/java/dagger/hilt/android/processor/internal/androidentrypoint/ActivityGenerator.java @@ -17,9 +17,9 @@ package dagger.hilt.android.processor.internal.androidentrypoint; import com.squareup.javapoet.ClassName; -import com.squareup.javapoet.CodeBlock; import com.squareup.javapoet.JavaFile; import com.squareup.javapoet.MethodSpec; +import com.squareup.javapoet.ParameterSpec; import com.squareup.javapoet.TypeSpec; import com.squareup.javapoet.TypeVariableName; import dagger.hilt.android.processor.internal.AndroidClassNames; @@ -30,6 +30,7 @@ import javax.lang.model.element.Modifier; /** 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; @@ -55,11 +56,9 @@ public final class ActivityGenerator { Generators.addGeneratedBaseClassJavadoc(builder, AndroidClassNames.ANDROID_ENTRY_POINT); Processors.addGeneratedAnnotation(builder, env, getClass()); - Generators.copyConstructors( - metadata.baseElement(), - CodeBlock.builder().addStatement("_initHiltInternal()").build(), - builder); - builder.addMethod(init()); + Generators.copyConstructors(metadata.baseElement(), builder); + builder.addMethod(onCreate()); + metadata.baseElement().getTypeParameters().stream() .map(TypeVariableName::get) @@ -80,36 +79,29 @@ public final class ActivityGenerator { .writeTo(env.getFiler()); } - // private void init() { - // addOnContextAvailableListener(new OnContextAvailableListener() { - // @Override - // public void onContextAvailable(Context context) { - // inject(); - // } - // }); + // @CallSuper + // @Override + // protected void onCreate(@Nullable Bundle savedInstanceState) { + // inject(); + // super.onCreate(savedInstanceState); // } - private MethodSpec init() { - return MethodSpec.methodBuilder("_initHiltInternal") - .addModifiers(Modifier.PRIVATE) - .addStatement( - "addOnContextAvailableListener($L)", - TypeSpec.anonymousClassBuilder("") - .addSuperinterface(AndroidClassNames.ON_CONTEXT_AVAILABLE_LISTENER) - .addMethod( - MethodSpec.methodBuilder("onContextAvailable") - .addAnnotation(Override.class) - .addModifiers(Modifier.PUBLIC) - .addParameter(AndroidClassNames.CONTEXT, "context") - .addStatement("inject()") - .build()) + private MethodSpec onCreate() { + return MethodSpec.methodBuilder("onCreate") + .addAnnotation(AndroidClassNames.CALL_SUPER) + .addAnnotation(Override.class) + .addModifiers(Modifier.PROTECTED) + .addParameter( + ParameterSpec.builder(AndroidClassNames.BUNDLE, "savedInstanceState") + .addAnnotation(AndroidClassNames.NULLABLE) .build()) + .addStatement("inject()") + .addStatement("super.onCreate(savedInstanceState)") .build(); } // @Override // public ViewModelProvider.Factory getDefaultViewModelProviderFactory() { - // return DefaultViewModelFactories.getActivityFactory( - // this, super.getDefaultViewModelProviderFactory()); + // return DefaultViewModelFactories.getActivityFactory(this); // } private MethodSpec getDefaultViewModelProviderFactory() { return MethodSpec.methodBuilder("getDefaultViewModelProviderFactory") @@ -117,7 +109,7 @@ public final class ActivityGenerator { .addModifiers(Modifier.PUBLIC) .returns(AndroidClassNames.VIEW_MODEL_PROVIDER_FACTORY) .addStatement( - "return $T.getActivityFactory(this, super.getDefaultViewModelProviderFactory())", + "return $T.getActivityFactory(this)", AndroidClassNames.DEFAULT_VIEW_MODEL_FACTORIES) .build(); } diff --git a/java/dagger/hilt/android/processor/internal/androidentrypoint/AndroidEntryPointMetadata.java b/java/dagger/hilt/android/processor/internal/androidentrypoint/AndroidEntryPointMetadata.java index c94f6a977..e5868f861 100644 --- a/java/dagger/hilt/android/processor/internal/androidentrypoint/AndroidEntryPointMetadata.java +++ b/java/dagger/hilt/android/processor/internal/androidentrypoint/AndroidEntryPointMetadata.java @@ -16,7 +16,7 @@ package dagger.hilt.android.processor.internal.androidentrypoint; -import static dagger.hilt.processor.internal.HiltCompilerOptions.isAndroidSuperclassValidationDisabled; +import static dagger.hilt.android.processor.internal.androidentrypoint.HiltCompilerOptions.BooleanOption.DISABLE_ANDROID_SUPERCLASS_VALIDATION; import static dagger.internal.codegen.extension.DaggerStreams.toImmutableSet; import com.google.auto.common.MoreElements; @@ -245,7 +245,7 @@ public abstract class AndroidEntryPointMetadata { final TypeElement baseElement; final ClassName generatedClassName; boolean requiresBytecodeInjection = - isAndroidSuperclassValidationDisabled(androidEntryPointElement, env) + DISABLE_ANDROID_SUPERCLASS_VALIDATION.get(env) && MoreTypes.isTypeOf(Void.class, androidEntryPointClassValue.asType()); if (requiresBytecodeInjection) { baseElement = MoreElements.asType(env.getTypeUtils().asElement(androidEntryPointElement.getSuperclass())); diff --git a/java/dagger/hilt/android/processor/internal/androidentrypoint/AndroidEntryPointProcessor.java b/java/dagger/hilt/android/processor/internal/androidentrypoint/AndroidEntryPointProcessor.java index cd3290b48..7bb9b9afe 100644 --- a/java/dagger/hilt/android/processor/internal/androidentrypoint/AndroidEntryPointProcessor.java +++ b/java/dagger/hilt/android/processor/internal/androidentrypoint/AndroidEntryPointProcessor.java @@ -44,6 +44,11 @@ public final class AndroidEntryPointProcessor extends BaseProcessor { } @Override + public Set<String> getSupportedOptions() { + return HiltCompilerOptions.getProcessorOptions(); + } + + @Override public boolean delayErrors() { return true; } diff --git a/java/dagger/hilt/android/processor/internal/androidentrypoint/ApplicationGenerator.java b/java/dagger/hilt/android/processor/internal/androidentrypoint/ApplicationGenerator.java index 8d63cdbea..f16e06dee 100644 --- a/java/dagger/hilt/android/processor/internal/androidentrypoint/ApplicationGenerator.java +++ b/java/dagger/hilt/android/processor/internal/androidentrypoint/ApplicationGenerator.java @@ -38,13 +38,11 @@ public final class ApplicationGenerator { private final ProcessingEnvironment env; private final AndroidEntryPointMetadata metadata; private final ClassName wrapperClassName; - private final ComponentNames componentNames; public ApplicationGenerator(ProcessingEnvironment env, AndroidEntryPointMetadata metadata) { this.env = env; this.metadata = metadata; - this.wrapperClassName = metadata.generatedClassName(); - this.componentNames = ComponentNames.withoutRenaming(); + wrapperClassName = metadata.generatedClassName(); } // @Generated("ApplicationGenerator") @@ -109,7 +107,7 @@ public final class ApplicationGenerator { // } private TypeSpec creatorType() { ClassName component = - componentNames.generatedComponent( + ComponentNames.generatedComponent( metadata.elementClassName(), AndroidClassNames.SINGLETON_COMPONENT); return TypeSpec.anonymousClassBuilder("") .addSuperinterface(AndroidClassNames.COMPONENT_SUPPLIER) diff --git a/java/dagger/hilt/android/processor/internal/androidentrypoint/BUILD b/java/dagger/hilt/android/processor/internal/androidentrypoint/BUILD index efbf9e47a..55e9ddc02 100644 --- a/java/dagger/hilt/android/processor/internal/androidentrypoint/BUILD +++ b/java/dagger/hilt/android/processor/internal/androidentrypoint/BUILD @@ -35,9 +35,11 @@ java_library( srcs = ["AndroidEntryPointProcessor.java"], deps = [ ":android_generators", + ":compiler_options", ":metadata", "//java/dagger/hilt/android/processor/internal:android_classnames", "//java/dagger/hilt/processor/internal:base_processor", + "//java/dagger/hilt/processor/internal:processors", "//java/dagger/internal/guava:collect", "@google_bazel_common//third_party/java/auto:service", "@google_bazel_common//third_party/java/incap", @@ -79,9 +81,9 @@ java_library( "AndroidEntryPointMetadata.java", ], deps = [ + ":compiler_options", "//java/dagger/hilt/android/processor/internal:android_classnames", "//java/dagger/hilt/processor/internal:classnames", - "//java/dagger/hilt/processor/internal:compiler_options", "//java/dagger/hilt/processor/internal:components", "//java/dagger/hilt/processor/internal:kotlin", "//java/dagger/hilt/processor/internal:processor_errors", @@ -96,6 +98,11 @@ java_library( ], ) +java_library( + name = "compiler_options", + srcs = ["HiltCompilerOptions.java"], +) + filegroup( name = "srcs_filegroup", srcs = glob(["*"]), diff --git a/java/dagger/hilt/android/processor/internal/androidentrypoint/FragmentGenerator.java b/java/dagger/hilt/android/processor/internal/androidentrypoint/FragmentGenerator.java index 81b2b6156..4ef479f46 100644 --- a/java/dagger/hilt/android/processor/internal/androidentrypoint/FragmentGenerator.java +++ b/java/dagger/hilt/android/processor/internal/androidentrypoint/FragmentGenerator.java @@ -202,8 +202,7 @@ public final class FragmentGenerator { // @Override // public ViewModelProvider.Factory getDefaultViewModelProviderFactory() { - // return DefaultViewModelFactories.getFragmentFactory( - // this, super.getDefaultViewModelProviderFactory()); + // return DefaultViewModelFactories.getFragmentFactory(this); // } private MethodSpec getDefaultViewModelProviderFactory() { return MethodSpec.methodBuilder("getDefaultViewModelProviderFactory") @@ -211,7 +210,7 @@ public final class FragmentGenerator { .addModifiers(Modifier.PUBLIC) .returns(AndroidClassNames.VIEW_MODEL_PROVIDER_FACTORY) .addStatement( - "return $T.getFragmentFactory(this, super.getDefaultViewModelProviderFactory())", + "return $T.getFragmentFactory(this)", AndroidClassNames.DEFAULT_VIEW_MODEL_FACTORIES) .build(); } diff --git a/java/dagger/hilt/android/processor/internal/androidentrypoint/Generators.java b/java/dagger/hilt/android/processor/internal/androidentrypoint/Generators.java index 91df537c9..daadd032d 100644 --- a/java/dagger/hilt/android/processor/internal/androidentrypoint/Generators.java +++ b/java/dagger/hilt/android/processor/internal/androidentrypoint/Generators.java @@ -319,12 +319,6 @@ final class Generators { .endControlFlow(); } - // Only add @Override if an ancestor extends a generated Hilt class. - // When using bytecode injection, this isn't always guaranteed. - if (metadata.overridesAndroidEntryPointClass() - && ancestorExtendsGeneratedHiltClass(metadata)) { - methodSpecBuilder.addAnnotation(Override.class); - } typeSpecBuilder.addField(injectedField(metadata)); switch (metadata.androidType()) { @@ -332,6 +326,12 @@ final class Generators { case FRAGMENT: case VIEW: case SERVICE: + // Only add @Override if an ancestor extends a generated Hilt class. + // When using bytecode injection, this isn't always guaranteed. + if (metadata.overridesAndroidEntryPointClass() + && ancestorExtendsGeneratedHiltClass(metadata)) { + methodSpecBuilder.addAnnotation(Override.class); + } methodSpecBuilder .beginControlFlow("if (!injected)") .addStatement("injected = true") diff --git a/java/dagger/hilt/android/processor/internal/androidentrypoint/HiltCompilerOptions.java b/java/dagger/hilt/android/processor/internal/androidentrypoint/HiltCompilerOptions.java new file mode 100644 index 000000000..577410d81 --- /dev/null +++ b/java/dagger/hilt/android/processor/internal/androidentrypoint/HiltCompilerOptions.java @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2020 The Dagger Authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package dagger.hilt.android.processor.internal.androidentrypoint; + +import java.util.Arrays; +import java.util.Set; +import java.util.stream.Collectors; +import javax.annotation.processing.ProcessingEnvironment; + +/** Hilt annotation processor options. */ +// TODO(danysantiago): Consider consolidating with Dagger compiler options logic. +// TODO(user): Move this class to dagger/hilt/processor/internal +public final class HiltCompilerOptions { + + /** Processor options which can have true or false values. */ + public enum BooleanOption { + /** + * Flag that disables validating the superclass of @AndroidEntryPoint are Hilt_ generated, + * classes. This flag is to be used internally by the Gradle plugin, enabling the bytecode + * transformation to change the superclass. + */ + DISABLE_ANDROID_SUPERCLASS_VALIDATION( + "android.internal.disableAndroidSuperclassValidation", false), + + /** Flag that disables check on modules to be annotated with @InstallIn. */ + DISABLE_MODULES_HAVE_INSTALL_IN_CHECK("disableModulesHaveInstallInCheck", false); + + private final String name; + private final boolean defaultValue; + + BooleanOption(String name, boolean defaultValue) { + this.name = name; + this.defaultValue = defaultValue; + } + + public boolean get(ProcessingEnvironment env) { + String value = env.getOptions().get(getQualifiedName()); + if (value == null) { + return defaultValue; + } + // TODO(danysantiago): Strictly verify input, either 'true' or 'false' and nothing else. + return Boolean.parseBoolean(value); + } + + public String getQualifiedName() { + return "dagger.hilt." + name; + } + } + + public static Set<String> getProcessorOptions() { + return Arrays.stream(BooleanOption.values()) + .map(BooleanOption::getQualifiedName) + .collect(Collectors.toSet()); + } + + private HiltCompilerOptions() {} +} diff --git a/java/dagger/hilt/android/processor/internal/customtestapplication/CustomTestApplicationGenerator.java b/java/dagger/hilt/android/processor/internal/customtestapplication/CustomTestApplicationGenerator.java index 4f7f1bd6f..51b7ef466 100644 --- a/java/dagger/hilt/android/processor/internal/customtestapplication/CustomTestApplicationGenerator.java +++ b/java/dagger/hilt/android/processor/internal/customtestapplication/CustomTestApplicationGenerator.java @@ -109,7 +109,7 @@ final class CustomTestApplicationGenerator { return MethodSpec.methodBuilder("componentManager") .addAnnotation(Override.class) .addModifiers(Modifier.PUBLIC, Modifier.FINAL) - .returns(ParameterizedTypeName.get(ClassNames.GENERATED_COMPONENT_MANAGER, TypeName.OBJECT)) + .returns(TypeName.OBJECT) .addStatement("return $N", COMPONENT_MANAGER) .build(); } diff --git a/java/dagger/hilt/android/processor/internal/uninstallmodules/BUILD b/java/dagger/hilt/android/processor/internal/uninstallmodules/BUILD new file mode 100644 index 000000000..73c46061e --- /dev/null +++ b/java/dagger/hilt/android/processor/internal/uninstallmodules/BUILD @@ -0,0 +1,48 @@ +# Copyright (C) 2020 The Dagger Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Description: +# A processor for @dagger.hilt.android.testing.UninstallModules. + +package(default_visibility = ["//:src"]) + +java_plugin( + name = "processor", + generates_api = 1, + processor_class = "dagger.hilt.android.processor.internal.uninstallmodules.UninstallModulesProcessor", + deps = [":processor_lib"], +) + +java_library( + name = "processor_lib", + srcs = [ + "UninstallModulesProcessor.java", + ], + deps = [ + "//java/dagger/hilt/processor/internal:base_processor", + "//java/dagger/hilt/processor/internal:classnames", + "//java/dagger/hilt/processor/internal:processor_errors", + "//java/dagger/hilt/processor/internal:processors", + "//java/dagger/internal/codegen/extension", + "//java/dagger/internal/guava:collect", + "@google_bazel_common//third_party/java/auto:service", + "@google_bazel_common//third_party/java/incap", + "@maven//:com_google_auto_auto_common", + ], +) + +filegroup( + name = "srcs_filegroup", + srcs = glob(["*"]), +) diff --git a/java/dagger/hilt/android/processor/internal/uninstallmodules/UninstallModulesProcessor.java b/java/dagger/hilt/android/processor/internal/uninstallmodules/UninstallModulesProcessor.java new file mode 100644 index 000000000..e92f0f0a4 --- /dev/null +++ b/java/dagger/hilt/android/processor/internal/uninstallmodules/UninstallModulesProcessor.java @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2020 The Dagger Authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package dagger.hilt.android.processor.internal.uninstallmodules; + +import static dagger.internal.codegen.extension.DaggerStreams.toImmutableList; +import static net.ltgt.gradle.incap.IncrementalAnnotationProcessorType.ISOLATING; + +import com.google.auto.common.MoreElements; +import com.google.auto.service.AutoService; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; +import dagger.hilt.processor.internal.BaseProcessor; +import dagger.hilt.processor.internal.ClassNames; +import dagger.hilt.processor.internal.ProcessorErrors; +import dagger.hilt.processor.internal.Processors; +import java.util.Set; +import javax.annotation.processing.Processor; +import javax.lang.model.element.Element; +import javax.lang.model.element.TypeElement; +import net.ltgt.gradle.incap.IncrementalAnnotationProcessor; + +/** Validates {@link dagger.hilt.android.testing.UninstallModules} usages. */ +@IncrementalAnnotationProcessor(ISOLATING) +@AutoService(Processor.class) +public final class UninstallModulesProcessor extends BaseProcessor { + + @Override + public Set<String> getSupportedAnnotationTypes() { + return ImmutableSet.of(ClassNames.IGNORE_MODULES.toString()); + } + + @Override + public void processEach(TypeElement annotation, Element element) throws Exception { + // TODO(bcorso): Consider using RootType to check this? + // TODO(bcorso): Loosen this restriction to allow defining sets of ignored modules in libraries. + ProcessorErrors.checkState( + MoreElements.isType(element) + && Processors.hasAnnotation(element, ClassNames.HILT_ANDROID_TEST), + element, + "@%s should only be used on test classes annotated with @%s, but found: %s", + annotation.getSimpleName(), + ClassNames.HILT_ANDROID_TEST.simpleName(), + element); + + ImmutableList<TypeElement> invalidModules = + Processors.getAnnotationClassValues( + getElementUtils(), + Processors.getAnnotationMirror(element, ClassNames.IGNORE_MODULES), + "value") + .stream() + .filter( + module -> + !(Processors.hasAnnotation(module, ClassNames.MODULE) + && Processors.hasAnnotation(module, ClassNames.INSTALL_IN))) + .collect(toImmutableList()); + + ProcessorErrors.checkState( + invalidModules.isEmpty(), + // TODO(b/152801981): Point to the annotation value rather than the annotated element. + element, + "@%s should only include modules annotated with both @Module and @InstallIn, but found: " + + "%s.", + annotation.getSimpleName(), + invalidModules); + } +} diff --git a/java/dagger/hilt/android/processor/internal/viewmodel/ViewModelModuleGenerator.kt b/java/dagger/hilt/android/processor/internal/viewmodel/ViewModelModuleGenerator.kt index 1bc2e93bf..846f7d261 100644 --- a/java/dagger/hilt/android/processor/internal/viewmodel/ViewModelModuleGenerator.kt +++ b/java/dagger/hilt/android/processor/internal/viewmodel/ViewModelModuleGenerator.kt @@ -93,11 +93,6 @@ internal class ViewModelModuleGenerator( component = AndroidClassNames.VIEW_MODEL_COMPONENT ) .addModifiers(Modifier.ABSTRACT) - .addMethod( - MethodSpec.constructorBuilder() - .addModifiers(Modifier.PRIVATE) - .build() - ) .addMethod(getViewModelBindsMethod()) .build() |