Compile Dagger with Dagger.

This imports the opensource dagger compiler from the dagger-2.14.1 tag and all of its dependencies as a fat jar. Note that this is only used to build the dagger-compiler jar, and as such has no implications for downstream users whatsoever.

This change is mostly just adding some @Inject constructors and some qualifiers. A follow up will add DI for the ComponentWriters, which is itself a large change so I wanted to keep this reasonably sized.

RELNOTES=n/a

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=180827435
diff --git a/java/dagger/internal/codegen/AnnotationCreatorGenerator.java b/java/dagger/internal/codegen/AnnotationCreatorGenerator.java
index 8f457ee..37b8fb7 100644
--- a/java/dagger/internal/codegen/AnnotationCreatorGenerator.java
+++ b/java/dagger/internal/codegen/AnnotationCreatorGenerator.java
@@ -41,6 +41,7 @@
 import java.util.Optional;
 import java.util.Set;
 import javax.annotation.processing.Filer;
+import javax.inject.Inject;
 import javax.lang.model.element.Element;
 import javax.lang.model.element.ElementKind;
 import javax.lang.model.element.ExecutableElement;
@@ -78,6 +79,7 @@
  */
 class AnnotationCreatorGenerator extends SourceFileGenerator<TypeElement> {
 
+  @Inject
   AnnotationCreatorGenerator(Filer filer, Elements elements) {
     super(filer, elements);
   }
diff --git a/java/dagger/internal/codegen/AnyBindingMethodValidator.java b/java/dagger/internal/codegen/AnyBindingMethodValidator.java
index e9a3843..354a4f8 100644
--- a/java/dagger/internal/codegen/AnyBindingMethodValidator.java
+++ b/java/dagger/internal/codegen/AnyBindingMethodValidator.java
@@ -18,18 +18,17 @@
 
 import static com.google.auto.common.MoreElements.isAnnotationPresent;
 import static com.google.common.collect.Iterables.getOnlyElement;
-import static com.google.common.collect.Maps.uniqueIndex;
 import static dagger.internal.codegen.DaggerElements.isAnyAnnotationPresent;
 import static dagger.internal.codegen.DaggerStreams.toImmutableSet;
 import static dagger.internal.codegen.ErrorMessages.tooManyBindingMethodAnnotations;
 import static dagger.internal.codegen.Util.reentrantComputeIfAbsent;
-import static java.util.Arrays.asList;
 
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 import java.lang.annotation.Annotation;
 import java.util.HashMap;
 import java.util.Map;
+import javax.inject.Inject;
 import javax.lang.model.element.ExecutableElement;
 
 /** Validates any binding method. */
@@ -39,8 +38,10 @@
   private final Map<ExecutableElement, ValidationReport<ExecutableElement>> reports =
       new HashMap<>();
 
-  AnyBindingMethodValidator(BindingMethodValidator... validators) {
-    this.validators = uniqueIndex(asList(validators), BindingMethodValidator::methodAnnotation);
+  @Inject
+  AnyBindingMethodValidator(
+      ImmutableMap<Class<? extends Annotation>, BindingMethodValidator> validators) {
+    this.validators = validators;
   }
 
   /** Returns the binding method annotations considered by this validator. */
diff --git a/java/dagger/internal/codegen/BUILD b/java/dagger/internal/codegen/BUILD
index f10ee5e..66d6117 100644
--- a/java/dagger/internal/codegen/BUILD
+++ b/java/dagger/internal/codegen/BUILD
@@ -34,6 +34,7 @@
 )
 
 CODEGEN_PLUGINS = [
+    ":bootstrap_compiler_plugin",
     # TODO(cgruber): Enable Beta checker.
 ]
 
@@ -254,6 +255,8 @@
 java_library(
     name = "processor",
     srcs = [
+        "BindingGraphPluginsModule.java",
+        "BindingMethodValidatorsModule.java",
         "CanReleaseReferencesProcessingStep.java",
         "ComponentHjarProcessingStep.java",
         "ComponentProcessingStep.java",
@@ -262,6 +265,7 @@
         "InjectProcessingStep.java",
         "MapKeyProcessingStep.java",
         "ModuleProcessingStep.java",
+        "ProcessingOptions.java",
         "ProductionExecutorModuleProcessingStep.java",
     ],
     plugins = CODEGEN_PLUGINS,
@@ -293,6 +297,20 @@
     ],
 )
 
+java_import(
+    name = "bootstrap_compiler",
+    jars = ["bootstrap_compiler_deploy.jar"],
+    visibility = ["//visibility:private"],
+)
+
+java_plugin(
+    name = "bootstrap_compiler_plugin",
+    generates_api = 1,
+    processor_class = "dagger.internal.codegen.ComponentProcessor",
+    visibility = ["//visibility:private"],
+    deps = [":bootstrap_compiler"],
+)
+
 load("//tools:javadoc.bzl", "javadoc_library")
 
 javadoc_library(
@@ -307,6 +325,7 @@
     testonly = 1,
     srcs = CODEGEN_SRCS,
     javacopts = DOCLINT_HTML_AND_SYNTAX + DOCLINT_REFERENCES,
+    plugins = CODEGEN_PLUGINS,
     deps = CODEGEN_DEPS,
 )
 
diff --git a/java/dagger/internal/codegen/BindingDeclarationFormatter.java b/java/dagger/internal/codegen/BindingDeclarationFormatter.java
index b17ce14..b97cec3 100644
--- a/java/dagger/internal/codegen/BindingDeclarationFormatter.java
+++ b/java/dagger/internal/codegen/BindingDeclarationFormatter.java
@@ -31,6 +31,7 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
+import javax.inject.Inject;
 import javax.lang.model.element.Element;
 import javax.lang.model.type.TypeKind;
 import javax.lang.model.type.TypeMirror;
@@ -49,6 +50,7 @@
 
   private final MethodSignatureFormatter methodSignatureFormatter;
 
+  @Inject
   BindingDeclarationFormatter(MethodSignatureFormatter methodSignatureFormatter) {
     this.methodSignatureFormatter = methodSignatureFormatter;
   }
diff --git a/java/dagger/internal/codegen/BindingGraph.java b/java/dagger/internal/codegen/BindingGraph.java
index c66ec82..c81cb39 100644
--- a/java/dagger/internal/codegen/BindingGraph.java
+++ b/java/dagger/internal/codegen/BindingGraph.java
@@ -262,6 +262,7 @@
     private final ProvisionBinding.Factory provisionBindingFactory;
     private final ProductionBinding.Factory productionBindingFactory;
 
+    @Inject
     Factory(
         Elements elements,
         InjectBindingRegistry injectBindingRegistry,
diff --git a/java/dagger/internal/codegen/BindingGraphPluginsModule.java b/java/dagger/internal/codegen/BindingGraphPluginsModule.java
new file mode 100644
index 0000000..d646433
--- /dev/null
+++ b/java/dagger/internal/codegen/BindingGraphPluginsModule.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2018 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.internal.codegen;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Maps;
+import dagger.Module;
+import dagger.Provides;
+import java.util.Map;
+import java.util.ServiceLoader;
+import java.util.Set;
+import javax.annotation.processing.Filer;
+import javax.inject.Singleton;
+
+/**
+ * Provides and configures the {@link BindingGraphPlugin}s available on the annotation processing
+ * path.
+ */
+@Module
+interface BindingGraphPluginsModule {
+  @Provides
+  @Singleton
+  static ImmutableList<BindingGraphPlugin> bindingGraphPlugins(
+      Filer filer, @ProcessingOptions Map<String, String> processingOptions) {
+    ClassLoader classLoader = BindingGraphPluginsModule.class.getClassLoader();
+    ImmutableList<BindingGraphPlugin> bindingGraphPlugins =
+        ImmutableList.copyOf(ServiceLoader.load(BindingGraphPlugin.class, classLoader));
+    for (BindingGraphPlugin plugin : bindingGraphPlugins) {
+      plugin.setFiler(filer);
+      Set<String> supportedOptions = plugin.getSupportedOptions();
+      if (!supportedOptions.isEmpty()) {
+        plugin.setOptions(Maps.filterKeys(processingOptions, supportedOptions::contains));
+      }
+    }
+    return bindingGraphPlugins;
+  }
+}
diff --git a/java/dagger/internal/codegen/BindingGraphValidator.java b/java/dagger/internal/codegen/BindingGraphValidator.java
index 525f5b8..b126f29 100644
--- a/java/dagger/internal/codegen/BindingGraphValidator.java
+++ b/java/dagger/internal/codegen/BindingGraphValidator.java
@@ -120,6 +120,7 @@
 import java.util.Queue;
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicBoolean;
+import javax.inject.Inject;
 import javax.inject.Provider;
 import javax.lang.model.element.AnnotationMirror;
 import javax.lang.model.element.ExecutableElement;
@@ -148,6 +149,7 @@
   private final DependencyRequestFormatter dependencyRequestFormatter;
   private final KeyFactory keyFactory;
 
+  @Inject
   BindingGraphValidator(
       Elements elements,
       DaggerTypes types,
@@ -161,7 +163,7 @@
     this.elements = elements;
     this.types = types;
     this.compilerOptions = compilerOptions;
-    this.injectValidator = injectValidator;
+    this.injectValidator = injectValidator.whenGeneratingCode();
     this.injectBindingRegistry = injectBindingRegistry;
     this.bindingDeclarationFormatter = bindingDeclarationFormatter;
     this.methodSignatureFormatter = methodSignatureFormatter;
diff --git a/java/dagger/internal/codegen/BindingMethodProcessingStep.java b/java/dagger/internal/codegen/BindingMethodProcessingStep.java
index cc1e164..50c2081 100644
--- a/java/dagger/internal/codegen/BindingMethodProcessingStep.java
+++ b/java/dagger/internal/codegen/BindingMethodProcessingStep.java
@@ -25,6 +25,7 @@
 import java.lang.annotation.Annotation;
 import java.util.Set;
 import javax.annotation.processing.Messager;
+import javax.inject.Inject;
 import javax.lang.model.element.Element;
 import javax.lang.model.element.ExecutableElement;
 
@@ -34,6 +35,7 @@
   private final Messager messager;
   private final AnyBindingMethodValidator anyBindingMethodValidator;
 
+  @Inject
   BindingMethodProcessingStep(
       Messager messager, AnyBindingMethodValidator anyBindingMethodValidator) {
     this.messager = messager;
diff --git a/java/dagger/internal/codegen/BindingMethodValidatorsModule.java b/java/dagger/internal/codegen/BindingMethodValidatorsModule.java
new file mode 100644
index 0000000..28a272d
--- /dev/null
+++ b/java/dagger/internal/codegen/BindingMethodValidatorsModule.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2018 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.internal.codegen;
+
+import static com.google.common.collect.Maps.uniqueIndex;
+
+import com.google.common.collect.ImmutableMap;
+import dagger.Binds;
+import dagger.Module;
+import dagger.Provides;
+import dagger.multibindings.IntoSet;
+import java.lang.annotation.Annotation;
+import java.util.Set;
+
+/**
+ * Binds each {@link BindingMethodValidator} into a map, keyed by {@link
+ * BindingMethodValidator#methodAnnotation()}.
+ */
+@Module
+interface BindingMethodValidatorsModule {
+  @Provides
+  static ImmutableMap<Class<? extends Annotation>, BindingMethodValidator> indexValidators(
+      Set<BindingMethodValidator> validators) {
+    return uniqueIndex(validators, BindingMethodValidator::methodAnnotation);
+  }
+
+  @Binds
+  @IntoSet
+  BindingMethodValidator provides(ProvidesMethodValidator validator);
+
+  @Binds
+  @IntoSet
+  BindingMethodValidator produces(ProducesMethodValidator validator);
+
+  @Binds
+  @IntoSet
+  BindingMethodValidator binds(BindsMethodValidator validator);
+
+  @Binds
+  @IntoSet
+  BindingMethodValidator multibinds(MultibindsMethodValidator validator);
+
+  @Binds
+  @IntoSet
+  BindingMethodValidator bindsOptionalOf(BindsOptionalOfMethodValidator validator);
+}
diff --git a/java/dagger/internal/codegen/BindsInstanceProcessingStep.java b/java/dagger/internal/codegen/BindsInstanceProcessingStep.java
index a86fcf8..a500eb8 100644
--- a/java/dagger/internal/codegen/BindsInstanceProcessingStep.java
+++ b/java/dagger/internal/codegen/BindsInstanceProcessingStep.java
@@ -36,6 +36,7 @@
 import java.util.Set;
 import java.util.stream.Stream;
 import javax.annotation.processing.Messager;
+import javax.inject.Inject;
 import javax.lang.model.element.AnnotationMirror;
 import javax.lang.model.element.Element;
 import javax.lang.model.element.ExecutableElement;
@@ -59,6 +60,7 @@
 
   private final Messager messager;
 
+  @Inject
   BindsInstanceProcessingStep(Messager messager) {
     this.messager = messager;
   }
diff --git a/java/dagger/internal/codegen/BindsMethodValidator.java b/java/dagger/internal/codegen/BindsMethodValidator.java
index 34e0df1..0d63a15 100644
--- a/java/dagger/internal/codegen/BindsMethodValidator.java
+++ b/java/dagger/internal/codegen/BindsMethodValidator.java
@@ -29,6 +29,7 @@
 import dagger.Module;
 import dagger.producers.ProducerModule;
 import java.util.List;
+import javax.inject.Inject;
 import javax.lang.model.element.ExecutableElement;
 import javax.lang.model.element.VariableElement;
 import javax.lang.model.type.TypeMirror;
@@ -42,6 +43,7 @@
   private final Types types;
   private final BindsTypeChecker bindsTypeChecker;
 
+  @Inject
   BindsMethodValidator(Elements elements, Types types) {
     super(
         elements,
diff --git a/java/dagger/internal/codegen/BindsOptionalOfMethodValidator.java b/java/dagger/internal/codegen/BindsOptionalOfMethodValidator.java
index 7497ed5..e7a6501 100644
--- a/java/dagger/internal/codegen/BindsOptionalOfMethodValidator.java
+++ b/java/dagger/internal/codegen/BindsOptionalOfMethodValidator.java
@@ -31,6 +31,7 @@
 import dagger.BindsOptionalOf;
 import dagger.Module;
 import dagger.producers.ProducerModule;
+import javax.inject.Inject;
 import javax.lang.model.element.ExecutableElement;
 import javax.lang.model.type.TypeMirror;
 import javax.lang.model.util.Elements;
@@ -41,6 +42,7 @@
 
   private final Types types;
 
+  @Inject
   BindsOptionalOfMethodValidator(Elements elements, Types types) {
     super(
         elements,
diff --git a/java/dagger/internal/codegen/BindsTypeChecker.java b/java/dagger/internal/codegen/BindsTypeChecker.java
index 1685534..9ddff45 100644
--- a/java/dagger/internal/codegen/BindsTypeChecker.java
+++ b/java/dagger/internal/codegen/BindsTypeChecker.java
@@ -24,6 +24,7 @@
 import com.google.common.collect.ImmutableList;
 import java.util.Map;
 import java.util.Set;
+import javax.inject.Inject;
 import javax.lang.model.element.ExecutableElement;
 import javax.lang.model.element.TypeElement;
 import javax.lang.model.type.DeclaredType;
@@ -41,6 +42,7 @@
   private final Types types;
   private final Elements elements;
 
+  @Inject
   BindsTypeChecker(Types types, Elements elements) {
     this.types = types;
     this.elements = elements;
diff --git a/java/dagger/internal/codegen/BuilderValidator.java b/java/dagger/internal/codegen/BuilderValidator.java
index 7b80356..40ac148 100644
--- a/java/dagger/internal/codegen/BuilderValidator.java
+++ b/java/dagger/internal/codegen/BuilderValidator.java
@@ -32,6 +32,7 @@
 import java.util.Arrays;
 import java.util.List;
 import java.util.Set;
+import javax.inject.Inject;
 import javax.lang.model.element.Element;
 import javax.lang.model.element.ExecutableElement;
 import javax.lang.model.element.Modifier;
@@ -52,6 +53,7 @@
   private final DaggerElements elements;
   private final Types types;
 
+  @Inject
   BuilderValidator(DaggerElements elements, Types types) {
     this.elements = elements;
     this.types = types;
diff --git a/java/dagger/internal/codegen/CanReleaseReferencesProcessingStep.java b/java/dagger/internal/codegen/CanReleaseReferencesProcessingStep.java
index 52a31c1..f3333da 100644
--- a/java/dagger/internal/codegen/CanReleaseReferencesProcessingStep.java
+++ b/java/dagger/internal/codegen/CanReleaseReferencesProcessingStep.java
@@ -26,6 +26,7 @@
 import java.lang.annotation.Annotation;
 import java.util.Set;
 import javax.annotation.processing.Messager;
+import javax.inject.Inject;
 import javax.inject.Scope;
 import javax.lang.model.element.Element;
 import javax.lang.model.element.TypeElement;
@@ -40,6 +41,7 @@
   private final CanReleaseReferencesValidator canReleaseReferencesValidator;
   private final AnnotationCreatorGenerator annotationCreatorGenerator;
 
+  @Inject
   CanReleaseReferencesProcessingStep(
       Messager messager,
       CanReleaseReferencesValidator canReleaseReferencesValidator,
diff --git a/java/dagger/internal/codegen/CanReleaseReferencesValidator.java b/java/dagger/internal/codegen/CanReleaseReferencesValidator.java
index 7c97cb4..85b8bac 100644
--- a/java/dagger/internal/codegen/CanReleaseReferencesValidator.java
+++ b/java/dagger/internal/codegen/CanReleaseReferencesValidator.java
@@ -24,6 +24,7 @@
 import dagger.releasablereferences.CanReleaseReferences;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
+import javax.inject.Inject;
 import javax.lang.model.element.AnnotationMirror;
 import javax.lang.model.element.TypeElement;
 import javax.lang.model.element.VariableElement;
@@ -36,6 +37,8 @@
  */
 final class CanReleaseReferencesValidator {
 
+  @Inject CanReleaseReferencesValidator() {}
+
   ValidationReport<TypeElement> validate(TypeElement annotatedElement) {
     ValidationReport.Builder<TypeElement> report = ValidationReport.about(annotatedElement);
     checkNoSourceRetention(annotatedElement, report);
diff --git a/java/dagger/internal/codegen/ComponentDescriptor.java b/java/dagger/internal/codegen/ComponentDescriptor.java
index 5aa0b3b..ba2b0fb 100644
--- a/java/dagger/internal/codegen/ComponentDescriptor.java
+++ b/java/dagger/internal/codegen/ComponentDescriptor.java
@@ -63,6 +63,7 @@
 import java.util.List;
 import java.util.Optional;
 import java.util.Set;
+import javax.inject.Inject;
 import javax.inject.Provider;
 import javax.lang.model.element.AnnotationMirror;
 import javax.lang.model.element.Element;
@@ -449,6 +450,7 @@
     private final DependencyRequestFactory dependencyRequestFactory;
     private final ModuleDescriptor.Factory moduleDescriptorFactory;
 
+    @Inject
     Factory(
         DaggerElements elements,
         Types types,
diff --git a/java/dagger/internal/codegen/ComponentGenerator.java b/java/dagger/internal/codegen/ComponentGenerator.java
index 2f1885a..53aa68f 100644
--- a/java/dagger/internal/codegen/ComponentGenerator.java
+++ b/java/dagger/internal/codegen/ComponentGenerator.java
@@ -23,6 +23,7 @@
 import dagger.Component;
 import java.util.Optional;
 import javax.annotation.processing.Filer;
+import javax.inject.Inject;
 import javax.lang.model.element.Element;
 import javax.lang.model.element.TypeElement;
 import javax.lang.model.util.Elements;
@@ -39,6 +40,7 @@
   private final KeyFactory keyFactory;
   private final CompilerOptions compilerOptions;
 
+  @Inject
   ComponentGenerator(
       Filer filer,
       Elements elements,
diff --git a/java/dagger/internal/codegen/ComponentHierarchyValidator.java b/java/dagger/internal/codegen/ComponentHierarchyValidator.java
index 5cf7ce7..a921825 100644
--- a/java/dagger/internal/codegen/ComponentHierarchyValidator.java
+++ b/java/dagger/internal/codegen/ComponentHierarchyValidator.java
@@ -33,6 +33,7 @@
 import dagger.internal.codegen.ComponentDescriptor.ComponentMethodDescriptor;
 import dagger.model.Scope;
 import java.util.Map;
+import javax.inject.Inject;
 import javax.lang.model.element.TypeElement;
 import javax.lang.model.element.VariableElement;
 
@@ -40,6 +41,7 @@
 final class ComponentHierarchyValidator {
   private final CompilerOptions compilerOptions;
 
+  @Inject
   ComponentHierarchyValidator(CompilerOptions compilerOptions) {
     this.compilerOptions = compilerOptions;
   }
diff --git a/java/dagger/internal/codegen/ComponentHjarProcessingStep.java b/java/dagger/internal/codegen/ComponentHjarProcessingStep.java
index 3f726f8..4d98516 100644
--- a/java/dagger/internal/codegen/ComponentHjarProcessingStep.java
+++ b/java/dagger/internal/codegen/ComponentHjarProcessingStep.java
@@ -53,6 +53,7 @@
 import java.util.stream.Stream;
 import javax.annotation.processing.Filer;
 import javax.annotation.processing.Messager;
+import javax.inject.Inject;
 import javax.lang.model.element.Element;
 import javax.lang.model.element.ExecutableElement;
 import javax.lang.model.element.TypeElement;
@@ -83,6 +84,7 @@
   private final ComponentValidator componentValidator;
   private final ComponentDescriptor.Factory componentDescriptorFactory;
 
+  @Inject
   ComponentHjarProcessingStep(
       Elements elements,
       Types types,
diff --git a/java/dagger/internal/codegen/ComponentProcessingStep.java b/java/dagger/internal/codegen/ComponentProcessingStep.java
index 589fafa..8a93ce0 100644
--- a/java/dagger/internal/codegen/ComponentProcessingStep.java
+++ b/java/dagger/internal/codegen/ComponentProcessingStep.java
@@ -35,6 +35,7 @@
 import java.util.Map;
 import java.util.Set;
 import javax.annotation.processing.Messager;
+import javax.inject.Inject;
 import javax.lang.model.element.Element;
 import javax.lang.model.element.TypeElement;
 
@@ -55,6 +56,7 @@
   private final ComponentGenerator componentGenerator;
   private final ImmutableList<BindingGraphPlugin> bindingGraphPlugins;
 
+  @Inject
   ComponentProcessingStep(
       Messager messager,
       ComponentValidator componentValidator,
@@ -64,7 +66,7 @@
       ComponentDescriptor.Factory componentDescriptorFactory,
       BindingGraph.Factory bindingGraphFactory,
       ComponentGenerator componentGenerator,
-      Iterable<BindingGraphPlugin> bindingGraphPlugins) {
+      ImmutableList<BindingGraphPlugin> bindingGraphPlugins) {
     this.messager = messager;
     this.componentValidator = componentValidator;
     this.builderValidator = builderValidator;
@@ -73,7 +75,7 @@
     this.componentDescriptorFactory = componentDescriptorFactory;
     this.bindingGraphFactory = bindingGraphFactory;
     this.componentGenerator = componentGenerator;
-    this.bindingGraphPlugins = ImmutableList.copyOf(bindingGraphPlugins);
+    this.bindingGraphPlugins = bindingGraphPlugins;
   }
 
   @Override
diff --git a/java/dagger/internal/codegen/ComponentProcessor.java b/java/dagger/internal/codegen/ComponentProcessor.java
index 3196400..a7b072e 100644
--- a/java/dagger/internal/codegen/ComponentProcessor.java
+++ b/java/dagger/internal/codegen/ComponentProcessor.java
@@ -20,15 +20,25 @@
 import com.google.auto.service.AutoService;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Maps;
+import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.CheckReturnValue;
 import com.google.googlejavaformat.java.filer.FormattingFiler;
-import java.util.ServiceLoader;
+import dagger.Binds;
+import dagger.BindsInstance;
+import dagger.Component;
+import dagger.Module;
+import dagger.Provides;
+import java.util.Map;
 import java.util.Set;
 import javax.annotation.processing.Filer;
 import javax.annotation.processing.Messager;
 import javax.annotation.processing.Processor;
 import javax.annotation.processing.RoundEnvironment;
+import javax.inject.Inject;
+import javax.inject.Singleton;
 import javax.lang.model.SourceVersion;
+import javax.lang.model.util.Elements;
+import javax.lang.model.util.Types;
 
 /**
  * The annotation processor responsible for generating the classes that drive the Dagger 2.0
@@ -41,10 +51,10 @@
  */
 @AutoService(Processor.class)
 public final class ComponentProcessor extends BasicAnnotationProcessor {
-  private InjectBindingRegistry injectBindingRegistry;
-  private FactoryGenerator factoryGenerator;
-  private MembersInjectorGenerator membersInjectorGenerator;
-  private ImmutableList<BindingGraphPlugin> bindingGraphPlugins;
+  @Inject InjectBindingRegistry injectBindingRegistry;
+  @Inject FactoryGenerator factoryGenerator;
+  @Inject MembersInjectorGenerator membersInjectorGenerator;
+  @Inject ImmutableList<BindingGraphPlugin> bindingGraphPlugins;
 
   @Override
   public SourceVersion getSupportedSourceVersion() {
@@ -64,178 +74,88 @@
   @Override
   protected Iterable<? extends ProcessingStep> initSteps() {
     Messager messager = processingEnv.getMessager();
-    DaggerTypes types = new DaggerTypes(processingEnv);
     DaggerElements elements = new DaggerElements(processingEnv);
     CompilerOptions compilerOptions = CompilerOptions.create(processingEnv, elements);
+    ProcessorComponent.Builder builder =
+        DaggerComponentProcessor_ProcessorComponent.builder()
+            .types(processingEnv.getTypeUtils())
+            .elements(elements)
+            .messager(messager)
+            .processingOptions(processingEnv.getOptions())
+            .compilerOptions(compilerOptions);
 
     Filer filer;
     if (compilerOptions.headerCompilation()) {
-      filer = processingEnv.getFiler();
+      builder.filer(processingEnv.getFiler());
     } else {
-      filer = new FormattingFiler(processingEnv.getFiler());
+      builder.filer(new FormattingFiler(processingEnv.getFiler()));
     }
 
-    this.bindingGraphPlugins =
-        ImmutableList.copyOf(
-            ServiceLoader.load(BindingGraphPlugin.class, getClass().getClassLoader()));
-    for (BindingGraphPlugin plugin : bindingGraphPlugins) {
-      plugin.setFiler(filer);
-      Set<String> supportedOptions = plugin.getSupportedOptions();
-      if (!supportedOptions.isEmpty()) {
-        plugin.setOptions(Maps.filterKeys(processingEnv.getOptions(), supportedOptions::contains));
+    ProcessorComponent component = builder.build();
+    component.inject(this);
+    return component.processingSteps();
+  }
+
+  @Singleton
+  @Component(
+      modules = {
+          BindingMethodValidatorsModule.class,
+          BindingGraphPluginsModule.class,
+          ProcessingStepsModule.class,
       }
+  )
+  interface ProcessorComponent {
+    void inject(ComponentProcessor processor);
+    ImmutableList<ProcessingStep> processingSteps();
+
+    @CanIgnoreReturnValue
+    @Component.Builder
+    interface Builder {
+      @BindsInstance Builder messager(Messager messager);
+      @BindsInstance Builder filer(Filer filer);
+      @BindsInstance Builder types(Types types);
+      @BindsInstance Builder elements(Elements elements);
+      @BindsInstance Builder compilerOptions(CompilerOptions compilerOptions);
+      @BindsInstance Builder processingOptions(@ProcessingOptions Map<String, String> options);
+      @CheckReturnValue ProcessorComponent build();
+    }
+  }
+
+  @Module
+  interface ProcessingStepsModule {
+    @Provides
+    static ImmutableList<ProcessingStep> processingSteps(
+        MapKeyProcessingStep mapKeyProcessingStep,
+        ForReleasableReferencesValidator forReleasableReferencesValidator,
+        CanReleaseReferencesProcessingStep canReleaseReferencesProcessingStep,
+        InjectProcessingStep injectProcessingStep,
+        MonitoringModuleProcessingStep monitoringModuleProcessingStep,
+        ProductionExecutorModuleProcessingStep productionExecutorModuleProcessingStep,
+        MultibindingAnnotationsProcessingStep multibindingAnnotationsProcessingStep,
+        BindsInstanceProcessingStep bindsInstanceProcessingStep,
+        ModuleProcessingStep moduleProcessingStep,
+        ComponentProcessingStep componentProcessingStep,
+        ComponentHjarProcessingStep componentHjarProcessingStep,
+        BindingMethodProcessingStep bindingMethodProcessingStep,
+        CompilerOptions compilerOptions) {
+      return ImmutableList.of(
+          mapKeyProcessingStep,
+          forReleasableReferencesValidator,
+          canReleaseReferencesProcessingStep,
+          injectProcessingStep,
+          monitoringModuleProcessingStep,
+          productionExecutorModuleProcessingStep,
+          multibindingAnnotationsProcessingStep,
+          bindsInstanceProcessingStep,
+          moduleProcessingStep,
+          compilerOptions.headerCompilation()
+              ? componentHjarProcessingStep
+              : componentProcessingStep,
+          bindingMethodProcessingStep);
     }
 
-    MethodSignatureFormatter methodSignatureFormatter = new MethodSignatureFormatter(types);
-    BindingDeclarationFormatter bindingDeclarationFormatter =
-        new BindingDeclarationFormatter(methodSignatureFormatter);
-    DependencyRequestFormatter dependencyRequestFormatter = new DependencyRequestFormatter(types);
-
-    KeyFactory keyFactory = new KeyFactory(types, elements);
-
-    InjectValidator injectValidator = new InjectValidator(types, elements, compilerOptions);
-    InjectValidator injectValidatorWhenGeneratingCode = injectValidator.whenGeneratingCode();
-    ProvidesMethodValidator providesMethodValidator = new ProvidesMethodValidator(elements, types);
-    ProducesMethodValidator producesMethodValidator = new ProducesMethodValidator(elements, types);
-    BindsMethodValidator bindsMethodValidator = new BindsMethodValidator(elements, types);
-    MultibindsMethodValidator multibindsMethodValidator =
-        new MultibindsMethodValidator(elements, types);
-    BindsOptionalOfMethodValidator bindsOptionalOfMethodValidator =
-        new BindsOptionalOfMethodValidator(elements, types);
-    AnyBindingMethodValidator anyBindingMethodValidator =
-        new AnyBindingMethodValidator(
-            providesMethodValidator,
-            producesMethodValidator,
-            bindsMethodValidator,
-            multibindsMethodValidator,
-            bindsOptionalOfMethodValidator);
-    ModuleValidator moduleValidator =
-        new ModuleValidator(
-            types,
-            elements,
-            anyBindingMethodValidator,
-            methodSignatureFormatter);
-    BuilderValidator builderValidator = new BuilderValidator(elements, types);
-    ComponentValidator componentValidator =
-        new ComponentValidator(elements, types, moduleValidator, builderValidator);
-    MapKeyValidator mapKeyValidator = new MapKeyValidator(elements);
-
-    DependencyRequestFactory dependencyRequestFactory =
-        new DependencyRequestFactory(keyFactory, types);
-    MembersInjectionBinding.Factory membersInjectionBindingFactory =
-        new MembersInjectionBinding.Factory(elements, types, keyFactory, dependencyRequestFactory);
-    ProvisionBinding.Factory provisionBindingFactory =
-        new ProvisionBinding.Factory(
-            types, keyFactory, dependencyRequestFactory, membersInjectionBindingFactory);
-    ProductionBinding.Factory productionBindingFactory =
-        new ProductionBinding.Factory(types, keyFactory, dependencyRequestFactory);
-    MultibindingDeclaration.Factory multibindingDeclarationFactory =
-        new MultibindingDeclaration.Factory(types, keyFactory);
-    SubcomponentDeclaration.Factory subcomponentDeclarationFactory =
-        new SubcomponentDeclaration.Factory(keyFactory);
-
-    this.factoryGenerator = new FactoryGenerator(filer, elements, types, compilerOptions);
-    this.membersInjectorGenerator = new MembersInjectorGenerator(filer, elements, types);
-    ComponentGenerator componentGenerator =
-        new ComponentGenerator(filer, elements, types, keyFactory, compilerOptions);
-    ProducerFactoryGenerator producerFactoryGenerator =
-        new ProducerFactoryGenerator(filer, elements, types, compilerOptions);
-    MonitoringModuleGenerator monitoringModuleGenerator =
-        new MonitoringModuleGenerator(filer, elements);
-    ProductionExecutorModuleGenerator productionExecutorModuleGenerator =
-        new ProductionExecutorModuleGenerator(filer, elements);
-
-    DelegateDeclaration.Factory bindingDelegateDeclarationFactory =
-        new DelegateDeclaration.Factory(types, keyFactory, dependencyRequestFactory);
-    OptionalBindingDeclaration.Factory optionalBindingDeclarationFactory =
-        new OptionalBindingDeclaration.Factory(keyFactory);
-
-    this.injectBindingRegistry =
-        new InjectBindingRegistryImpl(
-            elements,
-            types,
-            messager,
-            injectValidator,
-            keyFactory,
-            provisionBindingFactory,
-            membersInjectionBindingFactory,
-            compilerOptions);
-
-    ModuleDescriptor.Factory moduleDescriptorFactory =
-        new ModuleDescriptor.Factory(
-            elements,
-            provisionBindingFactory,
-            productionBindingFactory,
-            multibindingDeclarationFactory,
-            bindingDelegateDeclarationFactory,
-            subcomponentDeclarationFactory,
-            optionalBindingDeclarationFactory);
-
-    ComponentDescriptor.Factory componentDescriptorFactory = new ComponentDescriptor.Factory(
-        elements, types, dependencyRequestFactory, moduleDescriptorFactory);
-
-    BindingGraph.Factory bindingGraphFactory =
-        new BindingGraph.Factory(
-            elements,
-            injectBindingRegistry,
-            keyFactory,
-            provisionBindingFactory,
-            productionBindingFactory);
-
-    AnnotationCreatorGenerator annotationCreatorGenerator =
-        new AnnotationCreatorGenerator(filer, elements);
-    UnwrappedMapKeyGenerator unwrappedMapKeyGenerator =
-        new UnwrappedMapKeyGenerator(filer, elements);
-    CanReleaseReferencesValidator canReleaseReferencesValidator =
-        new CanReleaseReferencesValidator();
-    ComponentHierarchyValidator componentHierarchyValidator =
-        new ComponentHierarchyValidator(compilerOptions);
-    BindingGraphValidator bindingGraphValidator =
-        new BindingGraphValidator(
-            elements,
-            types,
-            compilerOptions,
-            injectValidatorWhenGeneratingCode,
-            injectBindingRegistry,
-            bindingDeclarationFormatter,
-            methodSignatureFormatter,
-            dependencyRequestFormatter,
-            keyFactory);
-
-    ProcessingStep componentProcessingStep =
-        compilerOptions.headerCompilation()
-            ? new ComponentHjarProcessingStep(
-                elements, types, filer, messager, componentValidator, componentDescriptorFactory)
-            : new ComponentProcessingStep(
-                messager,
-                componentValidator,
-                builderValidator,
-                componentHierarchyValidator,
-                bindingGraphValidator,
-                componentDescriptorFactory,
-                bindingGraphFactory,
-                componentGenerator,
-                bindingGraphPlugins);
-    return ImmutableList.of(
-        new MapKeyProcessingStep(
-            messager, types, mapKeyValidator, annotationCreatorGenerator, unwrappedMapKeyGenerator),
-        new ForReleasableReferencesValidator(messager),
-        new CanReleaseReferencesProcessingStep(
-            messager, canReleaseReferencesValidator, annotationCreatorGenerator),
-        new InjectProcessingStep(injectBindingRegistry),
-        new MonitoringModuleProcessingStep(messager, monitoringModuleGenerator),
-        new ProductionExecutorModuleProcessingStep(messager, productionExecutorModuleGenerator),
-        new MultibindingAnnotationsProcessingStep(messager),
-        new BindsInstanceProcessingStep(messager),
-        new ModuleProcessingStep(
-            messager,
-            moduleValidator,
-            provisionBindingFactory,
-            factoryGenerator,
-            productionBindingFactory,
-            producerFactoryGenerator),
-        componentProcessingStep,
-        new BindingMethodProcessingStep(messager, anyBindingMethodValidator));
+    @Binds
+    InjectBindingRegistry injectBindingRegistry(InjectBindingRegistryImpl impl);
   }
 
   @Override
diff --git a/java/dagger/internal/codegen/ComponentValidator.java b/java/dagger/internal/codegen/ComponentValidator.java
index f4f626f..3b28962 100644
--- a/java/dagger/internal/codegen/ComponentValidator.java
+++ b/java/dagger/internal/codegen/ComponentValidator.java
@@ -50,6 +50,7 @@
 import java.util.List;
 import java.util.Optional;
 import java.util.Set;
+import javax.inject.Inject;
 import javax.lang.model.element.AnnotationMirror;
 import javax.lang.model.element.Element;
 import javax.lang.model.element.ExecutableElement;
@@ -74,6 +75,7 @@
   private final ModuleValidator moduleValidator;
   private final BuilderValidator builderValidator;
 
+  @Inject
   ComponentValidator(
       Elements elements,
       Types types,
diff --git a/java/dagger/internal/codegen/DaggerElements.java b/java/dagger/internal/codegen/DaggerElements.java
index 8620aba..a62a2f5 100644
--- a/java/dagger/internal/codegen/DaggerElements.java
+++ b/java/dagger/internal/codegen/DaggerElements.java
@@ -37,6 +37,7 @@
 import java.util.Set;
 import java.util.function.Predicate;
 import javax.annotation.processing.ProcessingEnvironment;
+import javax.inject.Inject;
 import javax.lang.model.element.AnnotationMirror;
 import javax.lang.model.element.AnnotationValue;
 import javax.lang.model.element.Element;
@@ -56,6 +57,7 @@
   private final Elements elements;
   private final Types types;
 
+  @Inject
   DaggerElements(Elements elements, Types types) {
     this.elements = checkNotNull(elements);
     this.types = checkNotNull(types);
diff --git a/java/dagger/internal/codegen/DaggerTypes.java b/java/dagger/internal/codegen/DaggerTypes.java
index 72ed8b5..5a9618e 100644
--- a/java/dagger/internal/codegen/DaggerTypes.java
+++ b/java/dagger/internal/codegen/DaggerTypes.java
@@ -28,6 +28,7 @@
 import java.util.List;
 import java.util.Optional;
 import javax.annotation.processing.ProcessingEnvironment;
+import javax.inject.Inject;
 import javax.lang.model.element.Element;
 import javax.lang.model.element.TypeElement;
 import javax.lang.model.type.ArrayType;
@@ -48,6 +49,7 @@
   private final Types types;
   private final Elements elements;
 
+  @Inject
   DaggerTypes(Types types, Elements elements) {
     this.types = checkNotNull(types);
     this.elements = checkNotNull(elements);
diff --git a/java/dagger/internal/codegen/DelegateDeclaration.java b/java/dagger/internal/codegen/DelegateDeclaration.java
index f1bf253..3a99feb 100644
--- a/java/dagger/internal/codegen/DelegateDeclaration.java
+++ b/java/dagger/internal/codegen/DelegateDeclaration.java
@@ -29,6 +29,7 @@
 import dagger.internal.codegen.ContributionType.HasContributionType;
 import dagger.model.DependencyRequest;
 import java.util.Optional;
+import javax.inject.Inject;
 import javax.lang.model.element.AnnotationMirror;
 import javax.lang.model.element.ExecutableElement;
 import javax.lang.model.element.TypeElement;
@@ -52,6 +53,7 @@
     private final KeyFactory keyFactory;
     private final DependencyRequestFactory dependencyRequestFactory;
 
+    @Inject
     Factory(Types types, KeyFactory keyFactory, DependencyRequestFactory dependencyRequestFactory) {
       this.types = types;
       this.keyFactory = keyFactory;
diff --git a/java/dagger/internal/codegen/DependencyRequestFactory.java b/java/dagger/internal/codegen/DependencyRequestFactory.java
index 1c58c8f..b3de274 100644
--- a/java/dagger/internal/codegen/DependencyRequestFactory.java
+++ b/java/dagger/internal/codegen/DependencyRequestFactory.java
@@ -40,6 +40,7 @@
 import dagger.model.RequestKind;
 import java.util.List;
 import java.util.Optional;
+import javax.inject.Inject;
 import javax.inject.Provider;
 import javax.lang.model.element.AnnotationMirror;
 import javax.lang.model.element.Element;
@@ -59,6 +60,7 @@
   private final KeyFactory keyFactory;
   private final DaggerTypes types;
 
+  @Inject
   DependencyRequestFactory(KeyFactory keyFactory, DaggerTypes types) {
     this.keyFactory = keyFactory;
     this.types = types;
diff --git a/java/dagger/internal/codegen/DependencyRequestFormatter.java b/java/dagger/internal/codegen/DependencyRequestFormatter.java
index 6b07b90..6443d7d 100644
--- a/java/dagger/internal/codegen/DependencyRequestFormatter.java
+++ b/java/dagger/internal/codegen/DependencyRequestFormatter.java
@@ -69,6 +69,7 @@
 
   private final DaggerTypes types;
 
+  @Inject
   DependencyRequestFormatter(DaggerTypes types) {
     this.types = types;
   }
diff --git a/java/dagger/internal/codegen/FactoryGenerator.java b/java/dagger/internal/codegen/FactoryGenerator.java
index 0c5a26c..da77364 100644
--- a/java/dagger/internal/codegen/FactoryGenerator.java
+++ b/java/dagger/internal/codegen/FactoryGenerator.java
@@ -77,6 +77,7 @@
   private final Types types;
   private final CompilerOptions compilerOptions;
 
+  @Inject
   FactoryGenerator(
       Filer filer,
       Elements elements,
diff --git a/java/dagger/internal/codegen/ForReleasableReferencesValidator.java b/java/dagger/internal/codegen/ForReleasableReferencesValidator.java
index 48947ed..452cb24 100644
--- a/java/dagger/internal/codegen/ForReleasableReferencesValidator.java
+++ b/java/dagger/internal/codegen/ForReleasableReferencesValidator.java
@@ -33,6 +33,7 @@
 import java.lang.annotation.Annotation;
 import java.util.Set;
 import javax.annotation.processing.Messager;
+import javax.inject.Inject;
 import javax.lang.model.element.AnnotationMirror;
 import javax.lang.model.element.Element;
 import javax.lang.model.element.TypeElement;
@@ -42,6 +43,7 @@
 
   private final Messager messager;
 
+  @Inject
   ForReleasableReferencesValidator(Messager messager) {
     this.messager = messager;
   }
diff --git a/java/dagger/internal/codegen/InjectBindingRegistryImpl.java b/java/dagger/internal/codegen/InjectBindingRegistryImpl.java
index 67fc035..c6940ca 100644
--- a/java/dagger/internal/codegen/InjectBindingRegistryImpl.java
+++ b/java/dagger/internal/codegen/InjectBindingRegistryImpl.java
@@ -42,6 +42,7 @@
 import java.util.Set;
 import javax.annotation.processing.Messager;
 import javax.inject.Inject;
+import javax.inject.Singleton;
 import javax.lang.model.element.ExecutableElement;
 import javax.lang.model.element.TypeElement;
 import javax.lang.model.type.DeclaredType;
@@ -57,6 +58,7 @@
  *
  * @author Gregory Kick
  */
+@Singleton
 final class InjectBindingRegistryImpl implements InjectBindingRegistry {
   private final Elements elements;
   private final DaggerTypes types;
@@ -152,6 +154,7 @@
   private final BindingsCollection<MembersInjectionBinding> membersInjectionBindings =
       new BindingsCollection<>(BindingType.MEMBERS_INJECTION);
 
+  @Inject
   InjectBindingRegistryImpl(
       Elements elements,
       DaggerTypes types,
diff --git a/java/dagger/internal/codegen/InjectProcessingStep.java b/java/dagger/internal/codegen/InjectProcessingStep.java
index e9ca5fc..1a47031 100644
--- a/java/dagger/internal/codegen/InjectProcessingStep.java
+++ b/java/dagger/internal/codegen/InjectProcessingStep.java
@@ -38,6 +38,7 @@
 final class InjectProcessingStep implements BasicAnnotationProcessor.ProcessingStep {
   private final InjectBindingRegistry injectBindingRegistry;
 
+  @Inject
   InjectProcessingStep(InjectBindingRegistry injectBindingRegistry) {
     this.injectBindingRegistry = injectBindingRegistry;
   }
diff --git a/java/dagger/internal/codegen/InjectValidator.java b/java/dagger/internal/codegen/InjectValidator.java
index 9eaa82a..b01129b 100644
--- a/java/dagger/internal/codegen/InjectValidator.java
+++ b/java/dagger/internal/codegen/InjectValidator.java
@@ -77,6 +77,7 @@
   private final CompilerOptions compilerOptions;
   private final Optional<Diagnostic.Kind> privateAndStaticInjectionDiagnosticKind;
 
+  @Inject
   InjectValidator(Types types, Elements elements, CompilerOptions compilerOptions) {
     this(types, elements, compilerOptions, Optional.empty());
   }
diff --git a/java/dagger/internal/codegen/KeyFactory.java b/java/dagger/internal/codegen/KeyFactory.java
index d00f102..5f8650b 100644
--- a/java/dagger/internal/codegen/KeyFactory.java
+++ b/java/dagger/internal/codegen/KeyFactory.java
@@ -55,6 +55,7 @@
 import java.util.Set;
 import java.util.concurrent.Executor;
 import java.util.stream.Stream;
+import javax.inject.Inject;
 import javax.inject.Provider;
 import javax.lang.model.element.AnnotationMirror;
 import javax.lang.model.element.ExecutableElement;
@@ -70,6 +71,7 @@
   private final DaggerTypes types;
   private final Elements elements;
 
+  @Inject
   KeyFactory(DaggerTypes types, Elements elements) {
     this.types = checkNotNull(types);
     this.elements = checkNotNull(elements);
diff --git a/java/dagger/internal/codegen/MapKeyProcessingStep.java b/java/dagger/internal/codegen/MapKeyProcessingStep.java
index 241e617..80d892f 100644
--- a/java/dagger/internal/codegen/MapKeyProcessingStep.java
+++ b/java/dagger/internal/codegen/MapKeyProcessingStep.java
@@ -28,6 +28,7 @@
 import java.lang.annotation.Annotation;
 import java.util.Set;
 import javax.annotation.processing.Messager;
+import javax.inject.Inject;
 import javax.lang.model.element.Element;
 import javax.lang.model.element.ElementKind;
 import javax.lang.model.element.TypeElement;
@@ -48,6 +49,7 @@
   private final AnnotationCreatorGenerator annotationCreatorGenerator;
   private final UnwrappedMapKeyGenerator unwrappedMapKeyGenerator;
 
+  @Inject
   MapKeyProcessingStep(
       Messager messager,
       Types types,
diff --git a/java/dagger/internal/codegen/MapKeyValidator.java b/java/dagger/internal/codegen/MapKeyValidator.java
index ca4bed2..965f58b 100644
--- a/java/dagger/internal/codegen/MapKeyValidator.java
+++ b/java/dagger/internal/codegen/MapKeyValidator.java
@@ -23,6 +23,7 @@
 
 import dagger.MapKey;
 import java.util.List;
+import javax.inject.Inject;
 import javax.lang.model.element.Element;
 import javax.lang.model.element.ExecutableElement;
 import javax.lang.model.element.TypeElement;
@@ -39,6 +40,7 @@
 final class MapKeyValidator {
   private final Elements elements;
 
+  @Inject
   MapKeyValidator(Elements elements) {
     this.elements = elements;
   }
diff --git a/java/dagger/internal/codegen/MembersInjectionBinding.java b/java/dagger/internal/codegen/MembersInjectionBinding.java
index 7fe1721..89127d4 100644
--- a/java/dagger/internal/codegen/MembersInjectionBinding.java
+++ b/java/dagger/internal/codegen/MembersInjectionBinding.java
@@ -146,6 +146,7 @@
     private final KeyFactory keyFactory;
     private final DependencyRequestFactory dependencyRequestFactory;
 
+    @Inject
     Factory(
         Elements elements,
         DaggerTypes types,
diff --git a/java/dagger/internal/codegen/MembersInjectorGenerator.java b/java/dagger/internal/codegen/MembersInjectorGenerator.java
index e945f5a..220aead 100644
--- a/java/dagger/internal/codegen/MembersInjectorGenerator.java
+++ b/java/dagger/internal/codegen/MembersInjectorGenerator.java
@@ -54,6 +54,7 @@
 import java.util.Map.Entry;
 import java.util.Optional;
 import javax.annotation.processing.Filer;
+import javax.inject.Inject;
 import javax.lang.model.element.Element;
 import javax.lang.model.util.Elements;
 import javax.lang.model.util.Types;
@@ -67,6 +68,7 @@
 final class MembersInjectorGenerator extends SourceFileGenerator<MembersInjectionBinding> {
   private final Types types;
 
+  @Inject
   MembersInjectorGenerator(Filer filer, Elements elements, Types types) {
     super(filer, elements);
     this.types = types;
diff --git a/java/dagger/internal/codegen/MethodSignatureFormatter.java b/java/dagger/internal/codegen/MethodSignatureFormatter.java
index 66054ed..fc67351 100644
--- a/java/dagger/internal/codegen/MethodSignatureFormatter.java
+++ b/java/dagger/internal/codegen/MethodSignatureFormatter.java
@@ -25,6 +25,7 @@
 import java.util.Iterator;
 import java.util.List;
 import java.util.Optional;
+import javax.inject.Inject;
 import javax.lang.model.element.AnnotationMirror;
 import javax.lang.model.element.ExecutableElement;
 import javax.lang.model.element.TypeElement;
@@ -43,6 +44,7 @@
 final class MethodSignatureFormatter extends Formatter<ExecutableElement> {
   private final Types types;
 
+  @Inject
   MethodSignatureFormatter(Types types) {
     this.types = types;
   }
diff --git a/java/dagger/internal/codegen/ModuleDescriptor.java b/java/dagger/internal/codegen/ModuleDescriptor.java
index 49f4d66..a8082fe 100644
--- a/java/dagger/internal/codegen/ModuleDescriptor.java
+++ b/java/dagger/internal/codegen/ModuleDescriptor.java
@@ -50,6 +50,7 @@
 import java.util.LinkedHashSet;
 import java.util.Optional;
 import java.util.Set;
+import javax.inject.Inject;
 import javax.lang.model.element.AnnotationMirror;
 import javax.lang.model.element.ExecutableElement;
 import javax.lang.model.element.TypeElement;
@@ -144,6 +145,7 @@
     private final SubcomponentDeclaration.Factory subcomponentDeclarationFactory;
     private final OptionalBindingDeclaration.Factory optionalBindingDeclarationFactory;
 
+    @Inject
     Factory(
         DaggerElements elements,
         ProvisionBinding.Factory provisionBindingFactory,
diff --git a/java/dagger/internal/codegen/ModuleProcessingStep.java b/java/dagger/internal/codegen/ModuleProcessingStep.java
index 87ca7ff..dfd313a 100644
--- a/java/dagger/internal/codegen/ModuleProcessingStep.java
+++ b/java/dagger/internal/codegen/ModuleProcessingStep.java
@@ -32,6 +32,7 @@
 import java.util.List;
 import java.util.Set;
 import javax.annotation.processing.Messager;
+import javax.inject.Inject;
 import javax.lang.model.element.Element;
 import javax.lang.model.element.ExecutableElement;
 import javax.lang.model.element.TypeElement;
@@ -49,6 +50,7 @@
   private final ProducerFactoryGenerator producerFactoryGenerator;
   private final Set<TypeElement> processedModuleElements = Sets.newLinkedHashSet();
 
+  @Inject
   ModuleProcessingStep(
       Messager messager,
       ModuleValidator moduleValidator,
diff --git a/java/dagger/internal/codegen/ModuleValidator.java b/java/dagger/internal/codegen/ModuleValidator.java
index ec4ffc2..f12dffb 100644
--- a/java/dagger/internal/codegen/ModuleValidator.java
+++ b/java/dagger/internal/codegen/ModuleValidator.java
@@ -70,6 +70,8 @@
 import java.util.Map.Entry;
 import java.util.Optional;
 import java.util.Set;
+import javax.inject.Inject;
+import javax.inject.Singleton;
 import javax.lang.model.element.AnnotationMirror;
 import javax.lang.model.element.AnnotationValue;
 import javax.lang.model.element.Element;
@@ -90,6 +92,7 @@
  * @author Gregory Kick
  * @since 2.0
  */
+@Singleton
 final class ModuleValidator {
   private static final ImmutableSet<Class<? extends Annotation>> SUBCOMPONENT_TYPES =
       ImmutableSet.of(Subcomponent.class, ProductionSubcomponent.class);
@@ -117,6 +120,7 @@
   private final Map<TypeElement, ValidationReport<TypeElement>> cache = new HashMap<>();
   private final Set<TypeElement> knownModules = new HashSet<>();
 
+  @Inject
   ModuleValidator(
       Types types,
       Elements elements,
diff --git a/java/dagger/internal/codegen/MonitoringModuleGenerator.java b/java/dagger/internal/codegen/MonitoringModuleGenerator.java
index 5f2603e..ae47987 100644
--- a/java/dagger/internal/codegen/MonitoringModuleGenerator.java
+++ b/java/dagger/internal/codegen/MonitoringModuleGenerator.java
@@ -37,6 +37,7 @@
 import dagger.producers.monitoring.internal.Monitors;
 import java.util.Optional;
 import javax.annotation.processing.Filer;
+import javax.inject.Inject;
 import javax.lang.model.element.Element;
 import javax.lang.model.element.TypeElement;
 import javax.lang.model.util.Elements;
@@ -44,6 +45,7 @@
 /** Generates a monitoring module for use with production components. */
 final class MonitoringModuleGenerator extends SourceFileGenerator<TypeElement> {
 
+  @Inject
   MonitoringModuleGenerator(Filer filer, Elements elements) {
     super(filer, elements);
   }
diff --git a/java/dagger/internal/codegen/MonitoringModuleProcessingStep.java b/java/dagger/internal/codegen/MonitoringModuleProcessingStep.java
index 1bd095e..e947589 100644
--- a/java/dagger/internal/codegen/MonitoringModuleProcessingStep.java
+++ b/java/dagger/internal/codegen/MonitoringModuleProcessingStep.java
@@ -25,6 +25,7 @@
 import java.lang.annotation.Annotation;
 import java.util.Set;
 import javax.annotation.processing.Messager;
+import javax.inject.Inject;
 import javax.lang.model.element.Element;
 
 /**
@@ -35,6 +36,7 @@
   private final Messager messager;
   private final MonitoringModuleGenerator monitoringModuleGenerator;
 
+  @Inject
   MonitoringModuleProcessingStep(
       Messager messager, MonitoringModuleGenerator monitoringModuleGenerator) {
     this.messager = messager;
diff --git a/java/dagger/internal/codegen/MultibindingAnnotationsProcessingStep.java b/java/dagger/internal/codegen/MultibindingAnnotationsProcessingStep.java
index df977c2..f646b5c 100644
--- a/java/dagger/internal/codegen/MultibindingAnnotationsProcessingStep.java
+++ b/java/dagger/internal/codegen/MultibindingAnnotationsProcessingStep.java
@@ -33,6 +33,7 @@
 import java.util.Map.Entry;
 import java.util.Set;
 import javax.annotation.processing.Messager;
+import javax.inject.Inject;
 import javax.lang.model.element.AnnotationMirror;
 import javax.lang.model.element.Element;
 import javax.tools.Diagnostic.Kind;
@@ -48,6 +49,7 @@
 
   private final Messager messager;
 
+  @Inject
   MultibindingAnnotationsProcessingStep(Messager messager) {
     this.messager = messager;
   }
diff --git a/java/dagger/internal/codegen/MultibindingDeclaration.java b/java/dagger/internal/codegen/MultibindingDeclaration.java
index dead425..4fa25f5 100644
--- a/java/dagger/internal/codegen/MultibindingDeclaration.java
+++ b/java/dagger/internal/codegen/MultibindingDeclaration.java
@@ -30,6 +30,7 @@
 import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
+import javax.inject.Inject;
 import javax.inject.Provider;
 import javax.lang.model.element.Element;
 import javax.lang.model.element.ExecutableElement;
@@ -75,6 +76,7 @@
     private final Types types;
     private final KeyFactory keyFactory;
 
+    @Inject
     Factory(Types types, KeyFactory keyFactory) {
       this.types = types;
       this.keyFactory = keyFactory;
diff --git a/java/dagger/internal/codegen/MultibindsMethodValidator.java b/java/dagger/internal/codegen/MultibindsMethodValidator.java
index 3be0aa9..fe91086 100644
--- a/java/dagger/internal/codegen/MultibindsMethodValidator.java
+++ b/java/dagger/internal/codegen/MultibindsMethodValidator.java
@@ -28,7 +28,7 @@
 import dagger.Module;
 import dagger.multibindings.Multibinds;
 import dagger.producers.ProducerModule;
-import java.lang.annotation.Annotation;
+import javax.inject.Inject;
 import javax.lang.model.element.ExecutableElement;
 import javax.lang.model.type.TypeMirror;
 import javax.lang.model.util.Elements;
@@ -38,20 +38,13 @@
 class MultibindsMethodValidator extends BindingMethodValidator {
 
   /** Creates a validator for {@link Multibinds @Multibinds} methods. */
+  @Inject
   MultibindsMethodValidator(Elements elements, Types types) {
-    this(elements, types, Multibinds.class, ImmutableSet.of(Module.class, ProducerModule.class));
-  }
-
-  protected MultibindsMethodValidator(
-      Elements elements,
-      Types types,
-      Class<? extends Annotation> methodAnnotation,
-      Iterable<? extends Class<? extends Annotation>> enclosingElementAnnotations) {
     super(
         elements,
         types,
-        methodAnnotation,
-        enclosingElementAnnotations,
+        Multibinds.class,
+        ImmutableSet.of(Module.class, ProducerModule.class),
         MUST_BE_ABSTRACT,
         NO_EXCEPTIONS,
         NO_MULTIBINDINGS);
diff --git a/java/dagger/internal/codegen/OptionalBindingDeclaration.java b/java/dagger/internal/codegen/OptionalBindingDeclaration.java
index 2f32a70..f5e9364 100644
--- a/java/dagger/internal/codegen/OptionalBindingDeclaration.java
+++ b/java/dagger/internal/codegen/OptionalBindingDeclaration.java
@@ -23,6 +23,7 @@
 import dagger.BindsOptionalOf;
 import dagger.model.Key;
 import java.util.Optional;
+import javax.inject.Inject;
 import javax.lang.model.element.Element;
 import javax.lang.model.element.ExecutableElement;
 import javax.lang.model.element.TypeElement;
@@ -43,6 +44,7 @@
   static class Factory {
     private final KeyFactory keyFactory;
 
+    @Inject
     Factory(KeyFactory keyFactory) {
       this.keyFactory = keyFactory;
     }
diff --git a/java/dagger/internal/codegen/OptionalBindingExpression.java b/java/dagger/internal/codegen/OptionalBindingExpression.java
index 86f0bcd..e1f1da8 100644
--- a/java/dagger/internal/codegen/OptionalBindingExpression.java
+++ b/java/dagger/internal/codegen/OptionalBindingExpression.java
@@ -23,6 +23,7 @@
 import com.squareup.javapoet.CodeBlock;
 import dagger.internal.codegen.OptionalType.OptionalKind;
 import dagger.model.DependencyRequest;
+import javax.inject.Inject;
 import javax.lang.model.util.Types;
 
 /** A binding expression for optional bindings. */
@@ -31,6 +32,7 @@
   private final ComponentBindingExpressions componentBindingExpressions;
   private final Types types;
 
+  @Inject
   OptionalBindingExpression(
       ProvisionBinding binding,
       BindingExpression delegate,
diff --git a/java/dagger/internal/codegen/ProcessingOptions.java b/java/dagger/internal/codegen/ProcessingOptions.java
new file mode 100644
index 0000000..105452a
--- /dev/null
+++ b/java/dagger/internal/codegen/ProcessingOptions.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2018 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.internal.codegen;
+
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import java.lang.annotation.Retention;
+import javax.inject.Qualifier;
+
+/**
+ * A qualifier for the {@link javax.annotation.processing.ProcessingEnvironment#getOptions()
+ * processing options} passed to the current invocation of {@code javac}.
+ */
+@Retention(RUNTIME)
+@Qualifier
+@interface ProcessingOptions {}
diff --git a/java/dagger/internal/codegen/ProducerFactoryGenerator.java b/java/dagger/internal/codegen/ProducerFactoryGenerator.java
index a945690..d3344ec 100644
--- a/java/dagger/internal/codegen/ProducerFactoryGenerator.java
+++ b/java/dagger/internal/codegen/ProducerFactoryGenerator.java
@@ -64,6 +64,7 @@
 import java.util.Map;
 import java.util.Optional;
 import javax.annotation.processing.Filer;
+import javax.inject.Inject;
 import javax.lang.model.element.Element;
 import javax.lang.model.type.TypeMirror;
 import javax.lang.model.util.Elements;
@@ -79,6 +80,7 @@
   private final Types types;
   private final CompilerOptions compilerOptions;
 
+  @Inject
   ProducerFactoryGenerator(
       Filer filer, Elements elements, Types types, CompilerOptions compilerOptions) {
     super(filer, elements);
diff --git a/java/dagger/internal/codegen/ProducesMethodValidator.java b/java/dagger/internal/codegen/ProducesMethodValidator.java
index 715aacc..69e889a 100644
--- a/java/dagger/internal/codegen/ProducesMethodValidator.java
+++ b/java/dagger/internal/codegen/ProducesMethodValidator.java
@@ -34,6 +34,7 @@
 import dagger.producers.Produces;
 import java.util.Optional;
 import java.util.Set;
+import javax.inject.Inject;
 import javax.lang.model.element.ExecutableElement;
 import javax.lang.model.type.DeclaredType;
 import javax.lang.model.type.TypeMirror;
@@ -48,6 +49,7 @@
  */
 final class ProducesMethodValidator extends BindingMethodValidator {
 
+  @Inject
   ProducesMethodValidator(Elements elements, Types types) {
     super(
         elements,
diff --git a/java/dagger/internal/codegen/ProductionBinding.java b/java/dagger/internal/codegen/ProductionBinding.java
index 6a7501b..5d827fb 100644
--- a/java/dagger/internal/codegen/ProductionBinding.java
+++ b/java/dagger/internal/codegen/ProductionBinding.java
@@ -36,6 +36,7 @@
 import dagger.producers.Producer;
 import java.util.Optional;
 import java.util.stream.Stream;
+import javax.inject.Inject;
 import javax.lang.model.element.ExecutableElement;
 import javax.lang.model.element.TypeElement;
 import javax.lang.model.type.ExecutableType;
@@ -133,6 +134,7 @@
     private final KeyFactory keyFactory;
     private final DependencyRequestFactory dependencyRequestFactory;
 
+    @Inject
     Factory(Types types, KeyFactory keyFactory, DependencyRequestFactory dependencyRequestFactory) {
       this.types = types;
       this.keyFactory = keyFactory;
diff --git a/java/dagger/internal/codegen/ProductionExecutorModuleGenerator.java b/java/dagger/internal/codegen/ProductionExecutorModuleGenerator.java
index 525ae1e..b069349 100644
--- a/java/dagger/internal/codegen/ProductionExecutorModuleGenerator.java
+++ b/java/dagger/internal/codegen/ProductionExecutorModuleGenerator.java
@@ -32,6 +32,7 @@
 import java.util.Optional;
 import java.util.concurrent.Executor;
 import javax.annotation.processing.Filer;
+import javax.inject.Inject;
 import javax.lang.model.element.Element;
 import javax.lang.model.element.TypeElement;
 import javax.lang.model.util.Elements;
@@ -40,6 +41,7 @@
 // TODO(beder): Replace this with a single class when the producers client library exists.
 final class ProductionExecutorModuleGenerator extends SourceFileGenerator<TypeElement> {
 
+  @Inject
   ProductionExecutorModuleGenerator(Filer filer, Elements elements) {
     super(filer, elements);
   }
diff --git a/java/dagger/internal/codegen/ProductionExecutorModuleProcessingStep.java b/java/dagger/internal/codegen/ProductionExecutorModuleProcessingStep.java
index d508a51..07cd490 100644
--- a/java/dagger/internal/codegen/ProductionExecutorModuleProcessingStep.java
+++ b/java/dagger/internal/codegen/ProductionExecutorModuleProcessingStep.java
@@ -25,6 +25,7 @@
 import java.lang.annotation.Annotation;
 import java.util.Set;
 import javax.annotation.processing.Messager;
+import javax.inject.Inject;
 import javax.lang.model.element.Element;
 
 /**
@@ -35,6 +36,7 @@
   private final Messager messager;
   private final ProductionExecutorModuleGenerator productionExecutorModuleGenerator;
 
+  @Inject
   ProductionExecutorModuleProcessingStep(
       Messager messager, ProductionExecutorModuleGenerator productionExecutorModuleGenerator) {
     this.messager = messager;
diff --git a/java/dagger/internal/codegen/ProvidesMethodValidator.java b/java/dagger/internal/codegen/ProvidesMethodValidator.java
index 9feadc7..6f1e6d7 100644
--- a/java/dagger/internal/codegen/ProvidesMethodValidator.java
+++ b/java/dagger/internal/codegen/ProvidesMethodValidator.java
@@ -25,6 +25,7 @@
 import dagger.Module;
 import dagger.Provides;
 import dagger.producers.ProducerModule;
+import javax.inject.Inject;
 import javax.lang.model.element.ExecutableElement;
 import javax.lang.model.element.VariableElement;
 import javax.lang.model.util.Elements;
@@ -38,6 +39,7 @@
  */
 final class ProvidesMethodValidator extends BindingMethodValidator {
 
+  @Inject
   ProvidesMethodValidator(Elements elements, Types types) {
     super(
         elements,
diff --git a/java/dagger/internal/codegen/ProvisionBinding.java b/java/dagger/internal/codegen/ProvisionBinding.java
index 218330e..4cb7107 100644
--- a/java/dagger/internal/codegen/ProvisionBinding.java
+++ b/java/dagger/internal/codegen/ProvisionBinding.java
@@ -146,6 +146,7 @@
     private final DependencyRequestFactory dependencyRequestFactory;
     private final MembersInjectionBinding.Factory membersInjectionBindingFactory;
 
+    @Inject
     Factory(
         DaggerTypes types,
         KeyFactory keyFactory,
diff --git a/java/dagger/internal/codegen/SubcomponentDeclaration.java b/java/dagger/internal/codegen/SubcomponentDeclaration.java
index af557ad..1d17e59 100644
--- a/java/dagger/internal/codegen/SubcomponentDeclaration.java
+++ b/java/dagger/internal/codegen/SubcomponentDeclaration.java
@@ -26,6 +26,7 @@
 import com.google.common.collect.ImmutableSet;
 import dagger.model.Key;
 import java.util.Optional;
+import javax.inject.Inject;
 import javax.lang.model.element.AnnotationMirror;
 import javax.lang.model.element.ExecutableElement;
 import javax.lang.model.element.TypeElement;
@@ -57,7 +58,8 @@
   static class Factory {
     private final KeyFactory keyFactory;
 
-    public Factory(KeyFactory keyFactory) {
+    @Inject
+    Factory(KeyFactory keyFactory) {
       this.keyFactory = keyFactory;
     }
 
diff --git a/java/dagger/internal/codegen/UnwrappedMapKeyGenerator.java b/java/dagger/internal/codegen/UnwrappedMapKeyGenerator.java
index 86f8d84..23d2d6e 100644
--- a/java/dagger/internal/codegen/UnwrappedMapKeyGenerator.java
+++ b/java/dagger/internal/codegen/UnwrappedMapKeyGenerator.java
@@ -19,6 +19,7 @@
 import dagger.MapKey;
 import java.util.Set;
 import javax.annotation.processing.Filer;
+import javax.inject.Inject;
 import javax.lang.model.element.TypeElement;
 import javax.lang.model.util.Elements;
 
@@ -53,6 +54,7 @@
  */
 final class UnwrappedMapKeyGenerator extends AnnotationCreatorGenerator {
 
+  @Inject
   UnwrappedMapKeyGenerator(Filer filer, Elements elements) {
     super(filer, elements);
   }
diff --git a/java/dagger/internal/codegen/bootstrap_compiler_deploy.jar b/java/dagger/internal/codegen/bootstrap_compiler_deploy.jar
new file mode 100644
index 0000000..0485fa2
--- /dev/null
+++ b/java/dagger/internal/codegen/bootstrap_compiler_deploy.jar
Binary files differ