diff options
Diffstat (limited to 'java/dagger/hilt/processor/internal/aliasof')
5 files changed, 95 insertions, 111 deletions
diff --git a/java/dagger/hilt/processor/internal/aliasof/AliasOfProcessor.java b/java/dagger/hilt/processor/internal/aliasof/AliasOfProcessor.java index 02e7f5d56..6efd6431e 100644 --- a/java/dagger/hilt/processor/internal/aliasof/AliasOfProcessor.java +++ b/java/dagger/hilt/processor/internal/aliasof/AliasOfProcessor.java @@ -16,7 +16,6 @@ package dagger.hilt.processor.internal.aliasof; -import static com.google.auto.common.MoreElements.asType; import static net.ltgt.gradle.incap.IncrementalAnnotationProcessorType.ISOLATING; import com.google.auto.service.AutoService; @@ -49,14 +48,13 @@ public final class AliasOfProcessor extends BaseProcessor { "%s should only be used on scopes." + " However, it was found annotating %s", annotation, element); - AnnotationMirror annotationMirror = Processors.getAnnotationMirror(element, ClassNames.ALIAS_OF); - TypeElement defineComponentScope = + Element defineComponentScope = Processors.getAnnotationClassValue(getElementUtils(), annotationMirror, "value"); - new AliasOfPropagatedDataGenerator(getProcessingEnv(), asType(element), defineComponentScope) + new AliasOfPropagatedDataGenerator(getProcessingEnv(), element, defineComponentScope) .generate(); } } diff --git a/java/dagger/hilt/processor/internal/aliasof/AliasOfPropagatedDataGenerator.java b/java/dagger/hilt/processor/internal/aliasof/AliasOfPropagatedDataGenerator.java index 1d7edf285..75c4c15ac 100644 --- a/java/dagger/hilt/processor/internal/aliasof/AliasOfPropagatedDataGenerator.java +++ b/java/dagger/hilt/processor/internal/aliasof/AliasOfPropagatedDataGenerator.java @@ -17,37 +17,43 @@ package dagger.hilt.processor.internal.aliasof; import com.squareup.javapoet.AnnotationSpec; +import com.squareup.javapoet.JavaFile; +import com.squareup.javapoet.TypeSpec; import dagger.hilt.processor.internal.ClassNames; import dagger.hilt.processor.internal.Processors; import java.io.IOException; import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.TypeElement; +import javax.lang.model.element.Element; /** Generates resource files for {@link dagger.hilt.migration.AliasOf}. */ final class AliasOfPropagatedDataGenerator { private final ProcessingEnvironment processingEnv; - private final TypeElement aliasScope; - private final TypeElement defineComponentScope; + private final Element aliasScope; + private final Element defineComponentScope; AliasOfPropagatedDataGenerator( - ProcessingEnvironment processingEnv, - TypeElement aliasScope, - TypeElement defineComponentScope) { + ProcessingEnvironment processingEnv, Element aliasScope, Element defineComponentScope) { this.processingEnv = processingEnv; this.aliasScope = aliasScope; this.defineComponentScope = defineComponentScope; } void generate() throws IOException { - Processors.generateAggregatingClass( - ClassNames.ALIAS_OF_PROPAGATED_DATA_PACKAGE, - AnnotationSpec.builder(ClassNames.ALIAS_OF_PROPAGATED_DATA) + TypeSpec.Builder generator = + TypeSpec.classBuilder(Processors.getFullEnclosedName(aliasScope)) + .addOriginatingElement(aliasScope) + .addAnnotation( + AnnotationSpec.builder(ClassNames.ALIAS_OF_PROPAGATED_DATA) .addMember("defineComponentScope", "$T.class", defineComponentScope) .addMember("alias", "$T.class", aliasScope) - .build(), - aliasScope, - getClass(), - processingEnv); + .build()) + .addJavadoc("Generated class for aggregating scope aliases. \n"); + + Processors.addGeneratedAnnotation(generator, processingEnv, getClass()); + + JavaFile.builder(AliasOfs.AGGREGATING_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 deleted file mode 100644 index 30a2c70c6..000000000 --- a/java/dagger/hilt/processor/internal/aliasof/AliasOfPropagatedDataMetadata.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * 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 dagger.internal.codegen.extension.DaggerStreams.toImmutableSet; - -import com.google.auto.value.AutoValue; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableSet; -import dagger.hilt.processor.internal.AggregatedElements; -import dagger.hilt.processor.internal.AnnotationValues; -import dagger.hilt.processor.internal.ClassNames; -import dagger.hilt.processor.internal.Processors; -import javax.lang.model.element.AnnotationMirror; -import javax.lang.model.element.AnnotationValue; -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) { - return AggregatedElements.from( - ClassNames.ALIAS_OF_PROPAGATED_DATA_PACKAGE, - ClassNames.ALIAS_OF_PROPAGATED_DATA, - elements) - .stream() - .map(aggregatedElement -> create(aggregatedElement, elements)) - .collect(toImmutableSet()); - } - - private static AliasOfPropagatedDataMetadata create(TypeElement element, Elements elements) { - AnnotationMirror annotationMirror = - Processors.getAnnotationMirror(element, ClassNames.ALIAS_OF_PROPAGATED_DATA); - - ImmutableMap<String, AnnotationValue> values = - Processors.getAnnotationValues(elements, annotationMirror); - - return new AutoValue_AliasOfPropagatedDataMetadata( - AnnotationValues.getTypeElement(values.get("defineComponentScope")), - AnnotationValues.getTypeElement(values.get("alias"))); - } -} diff --git a/java/dagger/hilt/processor/internal/aliasof/AliasOfs.java b/java/dagger/hilt/processor/internal/aliasof/AliasOfs.java index 18951bdf9..930a72e27 100644 --- a/java/dagger/hilt/processor/internal/aliasof/AliasOfs.java +++ b/java/dagger/hilt/processor/internal/aliasof/AliasOfs.java @@ -16,11 +16,23 @@ 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; /** @@ -28,33 +40,69 @@ import javax.lang.model.util.Elements; * to scopes they are alias of. */ public final class AliasOfs { - 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()); - } + static final String AGGREGATING_PACKAGE = AliasOfs.class.getPackage().getName() + ".codegen"; - private final ImmutableSetMultimap<ClassName, ClassName> defineComponentScopeToAliases; + private final ProcessingEnvironment processingEnvironment; + private final ImmutableSet<ClassName> defineComponentScopes; + private final Supplier<ImmutableMultimap<ClassName, ClassName>> aliases = + memoize(() -> getAliases()); - private AliasOfs(ImmutableSetMultimap<ClassName, ClassName> defineComponentScopeToAliases) { - this.defineComponentScopeToAliases = defineComponentScopeToAliases; + public AliasOfs( + ProcessingEnvironment processingEnvironment, ImmutableSet<ClassName> defineComponentScopes) { + this.defineComponentScopes = defineComponentScopes; + this.processingEnvironment = processingEnvironment; } public ImmutableSet<ClassName> getAliasesFor(ClassName defineComponentScope) { - return defineComponentScopeToAliases.get(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(); } } diff --git a/java/dagger/hilt/processor/internal/aliasof/BUILD b/java/dagger/hilt/processor/internal/aliasof/BUILD index ffd0c9ae8..d3f90f2fa 100644 --- a/java/dagger/hilt/processor/internal/aliasof/BUILD +++ b/java/dagger/hilt/processor/internal/aliasof/BUILD @@ -31,6 +31,7 @@ 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", @@ -39,24 +40,20 @@ java_library( "@google_bazel_common//third_party/java/auto:service", "@google_bazel_common//third_party/java/incap", "@google_bazel_common//third_party/java/javapoet", - "@maven//:com_google_auto_auto_common", ], ) java_library( name = "alias_ofs", srcs = [ - "AliasOfPropagatedDataMetadata.java", "AliasOfs.java", ], deps = [ - "//java/dagger/hilt/processor/internal:aggregated_elements", "//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:base", "//java/dagger/internal/guava:collect", - "@google_bazel_common//third_party/java/auto:value", "@google_bazel_common//third_party/java/javapoet", ], ) |