diff options
author | Brad Corso <bcorso@google.com> | 2021-04-05 12:36:58 -0700 |
---|---|---|
committer | Dagger Team <dagger-dev+copybara@google.com> | 2021-04-05 12:39:20 -0700 |
commit | 0336b1a8f4dd2fac1ebc924f6a7e3b13aa017f56 (patch) | |
tree | 451941c8d9e4610305f2a0eabe3a71acbd6a3fd3 /java/dagger/hilt/processor | |
parent | 6d97cf3fdb969b2b0dd663317b302a942580f7a3 (diff) | |
download | dagger2-0336b1a8f4dd2fac1ebc924f6a7e3b13aa017f56.tar.gz |
Pull DefineComponentClassesMetadata into its own source file.
RELNOTES=N/A
PiperOrigin-RevId: 366852409
Diffstat (limited to 'java/dagger/hilt/processor')
5 files changed, 152 insertions, 96 deletions
diff --git a/java/dagger/hilt/processor/internal/ClassNames.java b/java/dagger/hilt/processor/internal/ClassNames.java index 4522e84d2..2fa090083 100644 --- a/java/dagger/hilt/processor/internal/ClassNames.java +++ b/java/dagger/hilt/processor/internal/ClassNames.java @@ -40,6 +40,8 @@ public final class ClassNames { public static final ClassName UNINSTALL_MODULES = get("dagger.hilt.android.testing", "UninstallModules"); + public static final String DEFINE_COMPONENT_CLASSES_PACKAGE = + "dagger.hilt.processor.internal.definecomponent.codegen"; public static final ClassName DEFINE_COMPONENT = get("dagger.hilt", "DefineComponent"); public static final ClassName DEFINE_COMPONENT_BUILDER = get("dagger.hilt", "DefineComponent", "Builder"); diff --git a/java/dagger/hilt/processor/internal/definecomponent/BUILD b/java/dagger/hilt/processor/internal/definecomponent/BUILD index 7edec1cba..ba14f68be 100644 --- a/java/dagger/hilt/processor/internal/definecomponent/BUILD +++ b/java/dagger/hilt/processor/internal/definecomponent/BUILD @@ -45,6 +45,7 @@ java_library( name = "define_components", srcs = [ "DefineComponentBuilderMetadatas.java", + "DefineComponentClassesMetadata.java", "DefineComponentMetadatas.java", "DefineComponents.java", ], @@ -54,9 +55,7 @@ java_library( "//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", - "//java/dagger/internal/guava:graph", "@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/definecomponent/DefineComponentClassesMetadata.java b/java/dagger/hilt/processor/internal/definecomponent/DefineComponentClassesMetadata.java new file mode 100644 index 000000000..1b00f9c22 --- /dev/null +++ b/java/dagger/hilt/processor/internal/definecomponent/DefineComponentClassesMetadata.java @@ -0,0 +1,129 @@ +/* + * 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.definecomponent; + +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.ImmutableMap; +import com.google.common.collect.ImmutableSet; +import dagger.hilt.processor.internal.AnnotationValues; +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.AnnotationValue; +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.definecomponent.DefineComponentClasses} annotation. + */ +@AutoValue +abstract class DefineComponentClassesMetadata { + + /** + * Returns the element annotated with {@code dagger.hilt.internal.definecomponent.DefineComponent} + * or {@code dagger.hilt.internal.definecomponent.DefineComponent.Builder}. + */ + abstract TypeElement element(); + + /** Returns {@code true} if this element represents a component. */ + abstract boolean isComponent(); + + /** Returns {@code true} if this element represents a component builder. */ + boolean isComponentBuilder() { + return !isComponent(); + } + + static ImmutableSet<DefineComponentClassesMetadata> from(Elements elements) { + PackageElement packageElement = + elements.getPackageElement(ClassNames.DEFINE_COMPONENT_CLASSES_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.DEFINE_COMPONENT_CLASSES_PACKAGE); + + ImmutableSet.Builder<DefineComponentClassesMetadata> 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?", + packageElement); + + builder.add(create(asType(element), elements)); + } + + return builder.build(); + } + + private static DefineComponentClassesMetadata create(TypeElement element, Elements elements) { + AnnotationMirror annotationMirror = + Processors.getAnnotationMirror(element, ClassNames.DEFINE_COMPONENT_CLASSES); + + ProcessorErrors.checkState( + annotationMirror != null, + element, + "Classes in package %s must be annotated with @%s: %s. Found: %s.", + ClassNames.DEFINE_COMPONENT_CLASSES_PACKAGE, + ClassNames.DEFINE_COMPONENT_CLASSES, + element.getSimpleName(), + element.getAnnotationMirrors()); + + ImmutableMap<String, AnnotationValue> values = + Processors.getAnnotationValues(elements, annotationMirror); + + String componentName = AnnotationValues.getString(values.get("component")); + String builderName = AnnotationValues.getString(values.get("builder")); + + ProcessorErrors.checkState( + !(componentName.isEmpty() && builderName.isEmpty()), + element, + "@DefineComponentClasses missing both `component` and `builder` members."); + + ProcessorErrors.checkState( + componentName.isEmpty() || builderName.isEmpty(), + element, + "@DefineComponentClasses should not include both `component` and `builder` members."); + + boolean isComponent = !componentName.isEmpty(); + String componentOrBuilderName = isComponent ? componentName : builderName; + TypeElement componentOrBuilderElement = elements.getTypeElement(componentOrBuilderName); + ProcessorErrors.checkState( + componentOrBuilderElement != null, + componentOrBuilderElement, + "%s.%s(), has invalid value: `%s`.", + ClassNames.DEFINE_COMPONENT_CLASSES.simpleName(), + isComponent ? "component" : "builder", + componentOrBuilderName); + return new AutoValue_DefineComponentClassesMetadata(componentOrBuilderElement, isComponent); + } +} diff --git a/java/dagger/hilt/processor/internal/definecomponent/DefineComponentProcessor.java b/java/dagger/hilt/processor/internal/definecomponent/DefineComponentProcessor.java index e0bfca930..fb5d0f1e2 100644 --- a/java/dagger/hilt/processor/internal/definecomponent/DefineComponentProcessor.java +++ b/java/dagger/hilt/processor/internal/definecomponent/DefineComponentProcessor.java @@ -80,7 +80,7 @@ public final class DefineComponentProcessor extends BaseProcessor { Processors.addGeneratedAnnotation(builder, processingEnv, getClass()); - JavaFile.builder(DefineComponents.AGGREGATING_PACKAGE, builder.build()) + JavaFile.builder(ClassNames.DEFINE_COMPONENT_CLASSES_PACKAGE, builder.build()) .build() .writeTo(processingEnv.getFiler()); } diff --git a/java/dagger/hilt/processor/internal/definecomponent/DefineComponents.java b/java/dagger/hilt/processor/internal/definecomponent/DefineComponents.java index 5ca194bd9..efa501191 100644 --- a/java/dagger/hilt/processor/internal/definecomponent/DefineComponents.java +++ b/java/dagger/hilt/processor/internal/definecomponent/DefineComponents.java @@ -16,32 +16,22 @@ package dagger.hilt.processor.internal.definecomponent; -import static com.google.auto.common.AnnotationMirrors.getAnnotationElementAndValue; import static dagger.internal.codegen.extension.DaggerStreams.toImmutableList; import static dagger.internal.codegen.extension.DaggerStreams.toImmutableSet; -import com.google.auto.common.MoreElements; -import com.google.auto.value.AutoValue; import com.google.common.collect.ArrayListMultimap; -import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.google.common.collect.ListMultimap; import com.squareup.javapoet.ClassName; -import dagger.hilt.processor.internal.AnnotationValues; import dagger.hilt.processor.internal.ClassNames; import dagger.hilt.processor.internal.ComponentDescriptor; import dagger.hilt.processor.internal.ProcessorErrors; -import dagger.hilt.processor.internal.Processors; import dagger.hilt.processor.internal.definecomponent.DefineComponentBuilderMetadatas.DefineComponentBuilderMetadata; import dagger.hilt.processor.internal.definecomponent.DefineComponentMetadatas.DefineComponentMetadata; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; -import java.util.Optional; -import javax.lang.model.element.AnnotationMirror; -import javax.lang.model.element.AnnotationValue; import javax.lang.model.element.Element; -import javax.lang.model.element.PackageElement; import javax.lang.model.element.TypeElement; import javax.lang.model.util.Elements; @@ -50,8 +40,6 @@ import javax.lang.model.util.Elements; * DefineComponentBuilderMetadata}. */ public final class DefineComponents { - static final String AGGREGATING_PACKAGE = - DefineComponents.class.getPackage().getName() + ".codegen"; public static DefineComponents create() { return new DefineComponents(); @@ -91,12 +79,26 @@ public final class DefineComponents { /** Returns the set of aggregated {@link ComponentDescriptor}s. */ public ImmutableSet<ComponentDescriptor> getComponentDescriptors(Elements elements) { - AggregatedMetadata aggregatedMetadata = - AggregatedMetadata.from(elements, componentMetadatas, componentBuilderMetadatas); + ImmutableSet<DefineComponentClassesMetadata> aggregatedMetadatas = + DefineComponentClassesMetadata.from(elements); + + ImmutableSet<DefineComponentMetadata> components = + aggregatedMetadatas.stream() + .filter(DefineComponentClassesMetadata::isComponent) + .map(DefineComponentClassesMetadata::element) + .map(componentMetadatas::get) + .collect(toImmutableSet()); + + ImmutableSet<DefineComponentBuilderMetadata> builders = + aggregatedMetadatas.stream() + .filter(DefineComponentClassesMetadata::isComponentBuilder) + .map(DefineComponentClassesMetadata::element) + .map(componentBuilderMetadatas::get) + .collect(toImmutableSet()); + ListMultimap<DefineComponentMetadata, DefineComponentBuilderMetadata> builderMultimap = ArrayListMultimap.create(); - aggregatedMetadata.builders() - .forEach(builder -> builderMultimap.put(builder.componentMetadata(), builder)); + builders.forEach(builder -> builderMultimap.put(builder.componentMetadata(), builder)); // Check that there are not multiple builders per component for (DefineComponentMetadata componentMetadata : builderMultimap.keySet()) { @@ -119,7 +121,7 @@ public final class DefineComponents { Map<DefineComponentMetadata, DefineComponentBuilderMetadata> builderMap = new LinkedHashMap<>(); builderMultimap.entries().forEach(e -> builderMap.put(e.getKey(), e.getValue())); - return aggregatedMetadata.components().stream() + return components.stream() .map(componentMetadata -> toComponentDescriptor(componentMetadata, builderMap)) .collect(toImmutableSet()); } @@ -145,80 +147,4 @@ public final class DefineComponents { return builder.build(); } - - @AutoValue - abstract static class AggregatedMetadata { - /** Returns the aggregated metadata for {@link DefineComponentClasses#component()}. */ - abstract ImmutableList<DefineComponentMetadata> components(); - - /** Returns the aggregated metadata for {@link DefineComponentClasses#builder()}. */ - abstract ImmutableList<DefineComponentBuilderMetadata> builders(); - - static AggregatedMetadata from( - Elements elements, - DefineComponentMetadatas componentMetadatas, - DefineComponentBuilderMetadatas componentBuilderMetadatas) { - PackageElement packageElement = elements.getPackageElement(AGGREGATING_PACKAGE); - - if (packageElement == null) { - return new AutoValue_DefineComponents_AggregatedMetadata( - ImmutableList.of(), ImmutableList.of()); - } - - ImmutableList.Builder<DefineComponentMetadata> components = ImmutableList.builder(); - ImmutableList.Builder<DefineComponentBuilderMetadata> builders = ImmutableList.builder(); - for (Element element : packageElement.getEnclosedElements()) { - ProcessorErrors.checkState( - MoreElements.isType(element), - element, - "Only types may be in package %s. Did you add custom code in the package?", - packageElement); - - TypeElement typeElement = MoreElements.asType(element); - ProcessorErrors.checkState( - Processors.hasAnnotation(typeElement, ClassNames.DEFINE_COMPONENT_CLASSES), - typeElement, - "Class, %s, must be annotated with @%s. Found: %s.", - typeElement, - ClassNames.DEFINE_COMPONENT_CLASSES.simpleName(), - typeElement.getAnnotationMirrors()); - - Optional<TypeElement> component = defineComponentClass(elements, typeElement, "component"); - Optional<TypeElement> builder = defineComponentClass(elements, typeElement, "builder"); - ProcessorErrors.checkState( - component.isPresent() || builder.isPresent(), - typeElement, - "@DefineComponentClasses missing both `component` and `builder` members."); - - component.map(componentMetadatas::get).ifPresent(components::add); - builder.map(componentBuilderMetadatas::get).ifPresent(builders::add); - } - - return new AutoValue_DefineComponents_AggregatedMetadata( - components.build(), builders.build()); - } - - private static Optional<TypeElement> defineComponentClass( - Elements elements, Element element, String annotationMember) { - AnnotationMirror mirror = - Processors.getAnnotationMirror(element, ClassNames.DEFINE_COMPONENT_CLASSES); - AnnotationValue value = getAnnotationElementAndValue(mirror, annotationMember).getValue(); - String className = AnnotationValues.getString(value); - - if (className.isEmpty()) { // The default value. - return Optional.empty(); - } - - TypeElement type = elements.getTypeElement(className); - ProcessorErrors.checkState( - type != null, - element, - "%s.%s(), has invalid value: `%s`.", - ClassNames.DEFINE_COMPONENT_CLASSES.simpleName(), - annotationMember, - className); - - return Optional.of(type); - } - } } |