diff options
7 files changed, 129 insertions, 77 deletions
diff --git a/java/dagger/hilt/internal/aliasof/BUILD b/java/dagger/hilt/internal/aliasof/BUILD index 3e96ed4d9..13d4364c3 100644 --- a/java/dagger/hilt/internal/aliasof/BUILD +++ b/java/dagger/hilt/internal/aliasof/BUILD @@ -17,7 +17,7 @@ package(default_visibility = ["//:src"]) -android_library( +java_library( name = "aliasof", srcs = ["AliasOfPropagatedData.java"], ) diff --git a/java/dagger/hilt/processor/internal/ClassNames.java b/java/dagger/hilt/processor/internal/ClassNames.java index 2fa090083..ac6b34623 100644 --- a/java/dagger/hilt/processor/internal/ClassNames.java +++ b/java/dagger/hilt/processor/internal/ClassNames.java @@ -86,6 +86,8 @@ public final class ClassNames { public static final ClassName ALIAS_OF = get("dagger.hilt.migration", "AliasOf"); public static final ClassName ALIAS_OF_PROPAGATED_DATA = get("dagger.hilt.internal.aliasof", "AliasOfPropagatedData"); + public static final String ALIAS_OF_PROPAGATED_DATA_PACKAGE = + "dagger.hilt.processor.internal.aliasof.codegen"; public static final ClassName GENERATES_ROOT_INPUT = get("dagger.hilt", "GeneratesRootInput"); public static final ClassName GENERATES_ROOT_INPUT_PROPAGATED_DATA = diff --git a/java/dagger/hilt/processor/internal/aliasof/AliasOfPropagatedDataGenerator.java b/java/dagger/hilt/processor/internal/aliasof/AliasOfPropagatedDataGenerator.java index 75c4c15ac..2ccb5cfbd 100644 --- a/java/dagger/hilt/processor/internal/aliasof/AliasOfPropagatedDataGenerator.java +++ b/java/dagger/hilt/processor/internal/aliasof/AliasOfPropagatedDataGenerator.java @@ -52,7 +52,7 @@ final class AliasOfPropagatedDataGenerator { Processors.addGeneratedAnnotation(generator, processingEnv, getClass()); - JavaFile.builder(AliasOfs.AGGREGATING_PACKAGE, generator.build()) + JavaFile.builder(ClassNames.ALIAS_OF_PROPAGATED_DATA_PACKAGE, generator.build()) .build() .writeTo(processingEnv.getFiler()); } diff --git a/java/dagger/hilt/processor/internal/aliasof/AliasOfPropagatedDataMetadata.java b/java/dagger/hilt/processor/internal/aliasof/AliasOfPropagatedDataMetadata.java new file mode 100644 index 000000000..1ba41d57b --- /dev/null +++ b/java/dagger/hilt/processor/internal/aliasof/AliasOfPropagatedDataMetadata.java @@ -0,0 +1,97 @@ +/* + * Copyright (C) 2021 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.processor.internal.aliasof; + +import static com.google.auto.common.MoreElements.asType; +import static com.google.auto.common.MoreElements.isType; + +import com.google.auto.value.AutoValue; +import com.google.common.collect.ImmutableSet; +import dagger.hilt.processor.internal.ClassNames; +import dagger.hilt.processor.internal.ProcessorErrors; +import dagger.hilt.processor.internal.Processors; +import javax.lang.model.element.AnnotationMirror; +import javax.lang.model.element.Element; +import javax.lang.model.element.PackageElement; +import javax.lang.model.element.TypeElement; +import javax.lang.model.util.Elements; + +/** + * A class that represents the values stored in an {@link + * dagger.hilt.internal.aliasof.AliasOfPropagatedData} annotation. + */ +@AutoValue +abstract class AliasOfPropagatedDataMetadata { + + abstract TypeElement defineComponentScopeElement(); + + abstract TypeElement aliasElement(); + + static ImmutableSet<AliasOfPropagatedDataMetadata> from(Elements elements) { + PackageElement packageElement = + elements.getPackageElement(ClassNames.ALIAS_OF_PROPAGATED_DATA_PACKAGE); + + if (packageElement == null) { + return ImmutableSet.of(); + } + + ImmutableSet<Element> aggregatedElements = + ImmutableSet.copyOf(packageElement.getEnclosedElements()); + + ProcessorErrors.checkState( + !aggregatedElements.isEmpty(), + packageElement, + "No dependencies found. Did you remove code in package %s?", + ClassNames.ALIAS_OF_PROPAGATED_DATA_PACKAGE); + + ImmutableSet.Builder<AliasOfPropagatedDataMetadata> builder = ImmutableSet.builder(); + for (Element element : aggregatedElements) { + ProcessorErrors.checkState( + isType(element), + element, + "Only types may be in package %s. Did you add custom code in the package?", + ClassNames.ALIAS_OF_PROPAGATED_DATA_PACKAGE); + + builder.add(create(asType(element), elements)); + } + return builder.build(); + } + + private static AliasOfPropagatedDataMetadata create(TypeElement element, Elements elements) { + AnnotationMirror annotationMirror = + Processors.getAnnotationMirror(element, ClassNames.ALIAS_OF_PROPAGATED_DATA); + + ProcessorErrors.checkState( + annotationMirror != null, + element, + "Classes in package %s must be annotated with @%s: %s." + + " Found: %s. Files in this package are generated, did you add custom code in the" + + " package? ", + ClassNames.ALIAS_OF_PROPAGATED_DATA_PACKAGE, + ClassNames.ALIAS_OF_PROPAGATED_DATA, + element.getSimpleName(), + element.getAnnotationMirrors()); + + TypeElement defineComponentScopeElement = + Processors.getAnnotationClassValue(elements, annotationMirror, "defineComponentScope"); + + TypeElement aliasElement = + Processors.getAnnotationClassValue(elements, annotationMirror, "alias"); + + return new AutoValue_AliasOfPropagatedDataMetadata(defineComponentScopeElement, aliasElement); + } +} diff --git a/java/dagger/hilt/processor/internal/aliasof/AliasOfs.java b/java/dagger/hilt/processor/internal/aliasof/AliasOfs.java index 930a72e27..18951bdf9 100644 --- a/java/dagger/hilt/processor/internal/aliasof/AliasOfs.java +++ b/java/dagger/hilt/processor/internal/aliasof/AliasOfs.java @@ -16,23 +16,11 @@ package dagger.hilt.processor.internal.aliasof; -import static com.google.common.base.Suppliers.memoize; -import com.google.common.base.Preconditions; -import com.google.common.base.Supplier; -import com.google.common.collect.ImmutableMultimap; import com.google.common.collect.ImmutableSet; +import com.google.common.collect.ImmutableSetMultimap; import com.squareup.javapoet.ClassName; -import dagger.hilt.processor.internal.ClassNames; import dagger.hilt.processor.internal.ProcessorErrors; -import dagger.hilt.processor.internal.Processors; -import java.util.List; -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.AnnotationMirror; -import javax.lang.model.element.Element; -import javax.lang.model.element.ElementKind; -import javax.lang.model.element.PackageElement; -import javax.lang.model.element.TypeElement; import javax.lang.model.util.Elements; /** @@ -40,69 +28,33 @@ import javax.lang.model.util.Elements; * to scopes they are alias of. */ public final class AliasOfs { - static final String AGGREGATING_PACKAGE = AliasOfs.class.getPackage().getName() + ".codegen"; + public static AliasOfs create(Elements elements, ImmutableSet<ClassName> defineComponentScopes) { + ImmutableSetMultimap.Builder<ClassName, ClassName> builder = ImmutableSetMultimap.builder(); + AliasOfPropagatedDataMetadata.from(elements) + .forEach( + metadata -> { + ClassName defineComponentScopeName = + ClassName.get(metadata.defineComponentScopeElement()); + ClassName aliasScopeName = ClassName.get(metadata.aliasElement()); + ProcessorErrors.checkState( + defineComponentScopes.contains(defineComponentScopeName), + metadata.aliasElement(), + "The scope %s cannot be an alias for %s. You can only have aliases of a scope" + + " defined directly on a @DefineComponent type.", + aliasScopeName, + defineComponentScopeName); + builder.put(defineComponentScopeName, aliasScopeName); + }); + return new AliasOfs(builder.build()); + } - private final ProcessingEnvironment processingEnvironment; - private final ImmutableSet<ClassName> defineComponentScopes; - private final Supplier<ImmutableMultimap<ClassName, ClassName>> aliases = - memoize(() -> getAliases()); + private final ImmutableSetMultimap<ClassName, ClassName> defineComponentScopeToAliases; - public AliasOfs( - ProcessingEnvironment processingEnvironment, ImmutableSet<ClassName> defineComponentScopes) { - this.defineComponentScopes = defineComponentScopes; - this.processingEnvironment = processingEnvironment; + private AliasOfs(ImmutableSetMultimap<ClassName, ClassName> defineComponentScopeToAliases) { + this.defineComponentScopeToAliases = defineComponentScopeToAliases; } public ImmutableSet<ClassName> getAliasesFor(ClassName defineComponentScope) { - return ImmutableSet.copyOf(aliases.get().get(defineComponentScope)); - } - - private ImmutableMultimap<ClassName, ClassName> getAliases() { - Elements elements = processingEnvironment.getElementUtils(); - PackageElement packageElement = elements.getPackageElement(AGGREGATING_PACKAGE); - if (packageElement == null) { - return ImmutableMultimap.of(); - } - List<? extends Element> scopeAliasElements = packageElement.getEnclosedElements(); - Preconditions.checkState( - !scopeAliasElements.isEmpty(), "No scope aliases Found in package %s.", packageElement); - - ImmutableMultimap.Builder<ClassName, ClassName> builder = ImmutableMultimap.builder(); - for (Element element : scopeAliasElements) { - ProcessorErrors.checkState( - element.getKind() == ElementKind.CLASS, - element, - "Only classes may be in package %s. Did you add custom code in the package?", - packageElement); - - AnnotationMirror annotationMirror = - Processors.getAnnotationMirror(element, ClassNames.ALIAS_OF_PROPAGATED_DATA); - - ProcessorErrors.checkState( - annotationMirror != null, - element, - "Classes in package %s must be annotated with @%s: %s." - + " Found: %s. Files in this package are generated, did you add custom code in the" - + " package? ", - packageElement, - ClassNames.ALIAS_OF_PROPAGATED_DATA, - element.getSimpleName(), - element.getAnnotationMirrors()); - - TypeElement defineComponentScope = - Processors.getAnnotationClassValue(elements, annotationMirror, "defineComponentScope"); - TypeElement alias = Processors.getAnnotationClassValue(elements, annotationMirror, "alias"); - - Preconditions.checkState( - defineComponentScopes.contains(ClassName.get(defineComponentScope)), - "The scope %s cannot be an alias for %s. You can only have aliases of a scope defined" - + " directly on a @DefineComponent type.", - ClassName.get(alias), - ClassName.get(defineComponentScope)); - - builder.put(ClassName.get(defineComponentScope), ClassName.get(alias)); - } - - return builder.build(); + return defineComponentScopeToAliases.get(defineComponentScope); } } diff --git a/java/dagger/hilt/processor/internal/aliasof/BUILD b/java/dagger/hilt/processor/internal/aliasof/BUILD index d3f90f2fa..9a29a8ed8 100644 --- a/java/dagger/hilt/processor/internal/aliasof/BUILD +++ b/java/dagger/hilt/processor/internal/aliasof/BUILD @@ -31,7 +31,6 @@ java_library( "AliasOfPropagatedDataGenerator.java", ], deps = [ - ":alias_ofs", "//java/dagger/hilt/processor/internal:base_processor", "//java/dagger/hilt/processor/internal:classnames", "//java/dagger/hilt/processor/internal:processor_errors", @@ -46,15 +45,17 @@ java_library( java_library( name = "alias_ofs", srcs = [ + "AliasOfPropagatedDataMetadata.java", "AliasOfs.java", ], deps = [ "//java/dagger/hilt/processor/internal:classnames", "//java/dagger/hilt/processor/internal:processor_errors", "//java/dagger/hilt/processor/internal:processors", - "//java/dagger/internal/guava:base", "//java/dagger/internal/guava:collect", + "@google_bazel_common//third_party/java/auto:value", "@google_bazel_common//third_party/java/javapoet", + "@maven//:com_google_auto_auto_common", ], ) diff --git a/java/dagger/hilt/processor/internal/root/RootMetadata.java b/java/dagger/hilt/processor/internal/root/RootMetadata.java index e3ace8ef0..76d1d1495 100644 --- a/java/dagger/hilt/processor/internal/root/RootMetadata.java +++ b/java/dagger/hilt/processor/internal/root/RootMetadata.java @@ -242,7 +242,7 @@ public final class RootMetadata { .flatMap(descriptor -> descriptor.scopes().stream()) .collect(toImmutableSet()); - AliasOfs aliasOfs = new AliasOfs(env, defineComponentScopes); + AliasOfs aliasOfs = AliasOfs.create(env.getElementUtils(), defineComponentScopes); for (ComponentDescriptor componentDescriptor : componentTree.getComponentDescriptors()) { for (ClassName scope : componentDescriptor.scopes()) { |