aboutsummaryrefslogtreecommitdiff
path: root/java/dagger/hilt/processor
diff options
context:
space:
mode:
authorBrad Corso <bcorso@google.com>2021-04-05 12:36:58 -0700
committerDagger Team <dagger-dev+copybara@google.com>2021-04-05 12:39:20 -0700
commit0336b1a8f4dd2fac1ebc924f6a7e3b13aa017f56 (patch)
tree451941c8d9e4610305f2a0eabe3a71acbd6a3fd3 /java/dagger/hilt/processor
parent6d97cf3fdb969b2b0dd663317b302a942580f7a3 (diff)
downloaddagger2-0336b1a8f4dd2fac1ebc924f6a7e3b13aa017f56.tar.gz
Pull DefineComponentClassesMetadata into its own source file.
RELNOTES=N/A PiperOrigin-RevId: 366852409
Diffstat (limited to 'java/dagger/hilt/processor')
-rw-r--r--java/dagger/hilt/processor/internal/ClassNames.java2
-rw-r--r--java/dagger/hilt/processor/internal/definecomponent/BUILD3
-rw-r--r--java/dagger/hilt/processor/internal/definecomponent/DefineComponentClassesMetadata.java129
-rw-r--r--java/dagger/hilt/processor/internal/definecomponent/DefineComponentProcessor.java2
-rw-r--r--java/dagger/hilt/processor/internal/definecomponent/DefineComponents.java112
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);
- }
- }
}