• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2023 The Dagger Authors.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package dagger.internal.codegen.validation;
18 
19 import static androidx.room.compiler.processing.compat.XConverters.getProcessingEnv;
20 import static androidx.room.compiler.processing.compat.XConverters.toJavac;
21 import static androidx.room.compiler.processing.compat.XConverters.toKS;
22 import static androidx.room.compiler.processing.compat.XConverters.toKSResolver;
23 import static com.google.common.base.Preconditions.checkState;
24 import static dagger.internal.codegen.extension.DaggerStreams.toImmutableList;
25 import static dagger.internal.codegen.extension.DaggerStreams.toImmutableMap;
26 import static dagger.internal.codegen.extension.DaggerStreams.toImmutableSet;
27 
28 import androidx.room.compiler.processing.XAnnotation;
29 import androidx.room.compiler.processing.XElement;
30 import androidx.room.compiler.processing.XExecutableElement;
31 import androidx.room.compiler.processing.XProcessingEnv;
32 import androidx.room.compiler.processing.XType;
33 import androidx.room.compiler.processing.XTypeElement;
34 import com.google.auto.value.AutoValue;
35 import com.google.auto.value.extension.memoized.Memoized;
36 import com.google.common.base.Equivalence;
37 import com.google.common.collect.ImmutableMap;
38 import com.google.common.collect.ImmutableSetMultimap;
39 import com.google.common.graph.EndpointPair;
40 import com.google.common.graph.ImmutableNetwork;
41 import com.google.common.graph.MutableNetwork;
42 import com.google.common.graph.Network;
43 import com.google.common.graph.NetworkBuilder;
44 import com.google.devtools.ksp.processing.Resolver;
45 import com.google.devtools.ksp.processing.SymbolProcessorEnvironment;
46 import com.google.devtools.ksp.symbol.KSAnnotated;
47 import com.google.devtools.ksp.symbol.KSAnnotation;
48 import com.google.devtools.ksp.symbol.KSClassDeclaration;
49 import com.google.devtools.ksp.symbol.KSFunctionDeclaration;
50 import com.google.devtools.ksp.symbol.KSType;
51 import dagger.internal.codegen.xprocessing.XAnnotations;
52 import dagger.internal.codegen.xprocessing.XElements;
53 import dagger.internal.codegen.xprocessing.XTypes;
54 import dagger.spi.model.Binding;
55 import dagger.spi.model.BindingGraph;
56 import dagger.spi.model.BindingGraph.ChildFactoryMethodEdge;
57 import dagger.spi.model.BindingGraph.ComponentNode;
58 import dagger.spi.model.BindingGraph.DependencyEdge;
59 import dagger.spi.model.BindingGraph.Edge;
60 import dagger.spi.model.BindingGraph.MaybeBinding;
61 import dagger.spi.model.BindingGraph.MissingBinding;
62 import dagger.spi.model.BindingGraph.Node;
63 import dagger.spi.model.BindingGraph.SubcomponentCreatorBindingEdge;
64 import dagger.spi.model.BindingKind;
65 import dagger.spi.model.ComponentPath;
66 import dagger.spi.model.DaggerAnnotation;
67 import dagger.spi.model.DaggerElement;
68 import dagger.spi.model.DaggerExecutableElement;
69 import dagger.spi.model.DaggerProcessingEnv;
70 import dagger.spi.model.DaggerProcessingEnv.Backend;
71 import dagger.spi.model.DaggerType;
72 import dagger.spi.model.DaggerTypeElement;
73 import dagger.spi.model.DependencyRequest;
74 import dagger.spi.model.DiagnosticReporter;
75 import dagger.spi.model.Key;
76 import dagger.spi.model.RequestKind;
77 import dagger.spi.model.Scope;
78 import java.util.Optional;
79 import javax.annotation.processing.ProcessingEnvironment;
80 import javax.lang.model.element.AnnotationMirror;
81 import javax.lang.model.element.Element;
82 import javax.lang.model.element.ExecutableElement;
83 import javax.lang.model.element.TypeElement;
84 import javax.lang.model.type.TypeMirror;
85 import javax.tools.Diagnostic;
86 
87 /** A Utility class for converting to the {@link BindingGraph} used by external plugins. */
88 public final class SpiModelBindingGraphConverter {
SpiModelBindingGraphConverter()89   private SpiModelBindingGraphConverter() {}
90 
toSpiModel( dagger.internal.codegen.model.DiagnosticReporter reporter)91   public static DiagnosticReporter toSpiModel(
92       dagger.internal.codegen.model.DiagnosticReporter reporter) {
93     return DiagnosticReporterImpl.create(reporter);
94   }
95 
toSpiModel( dagger.internal.codegen.model.BindingGraph graph, XProcessingEnv env)96   public static BindingGraph toSpiModel(
97       dagger.internal.codegen.model.BindingGraph graph, XProcessingEnv env) {
98     return BindingGraphImpl.create(graph, env);
99   }
100 
toSpiModel( Network< dagger.internal.codegen.model.BindingGraph.Node, dagger.internal.codegen.model.BindingGraph.Edge> internalNetwork, XProcessingEnv env)101   private static ImmutableNetwork<Node, Edge> toSpiModel(
102       Network<
103               dagger.internal.codegen.model.BindingGraph.Node,
104               dagger.internal.codegen.model.BindingGraph.Edge>
105           internalNetwork,
106       XProcessingEnv env) {
107     MutableNetwork<Node, Edge> network =
108         NetworkBuilder.directed().allowsParallelEdges(true).allowsSelfLoops(true).build();
109 
110     ImmutableMap<dagger.internal.codegen.model.BindingGraph.Node, Node> fromInternalNodes =
111         internalNetwork.nodes().stream()
112             .collect(
113                 toImmutableMap(
114                     node -> node, node -> SpiModelBindingGraphConverter.toSpiModel(node, env)));
115 
116     for (Node node : fromInternalNodes.values()) {
117       network.addNode(node);
118     }
119     for (dagger.internal.codegen.model.BindingGraph.Edge edge : internalNetwork.edges()) {
120       EndpointPair<dagger.internal.codegen.model.BindingGraph.Node> edgePair =
121           internalNetwork.incidentNodes(edge);
122       network.addEdge(
123           fromInternalNodes.get(edgePair.source()),
124           fromInternalNodes.get(edgePair.target()),
125           toSpiModel(edge, env));
126     }
127     return ImmutableNetwork.copyOf(network);
128   }
129 
toSpiModel( dagger.internal.codegen.model.BindingGraph.Node node, XProcessingEnv env)130   private static Node toSpiModel(
131       dagger.internal.codegen.model.BindingGraph.Node node, XProcessingEnv env) {
132     if (node instanceof dagger.internal.codegen.model.Binding) {
133       return BindingNodeImpl.create((dagger.internal.codegen.model.Binding) node, env);
134     } else if (node instanceof dagger.internal.codegen.model.BindingGraph.ComponentNode) {
135       return ComponentNodeImpl.create(
136           (dagger.internal.codegen.model.BindingGraph.ComponentNode) node, env);
137     } else if (node instanceof dagger.internal.codegen.model.BindingGraph.MissingBinding) {
138       return MissingBindingImpl.create(
139           (dagger.internal.codegen.model.BindingGraph.MissingBinding) node, env);
140     } else {
141       throw new IllegalStateException("Unhandled node type: " + node.getClass());
142     }
143   }
144 
toSpiModel( dagger.internal.codegen.model.BindingGraph.Edge edge, XProcessingEnv env)145   private static Edge toSpiModel(
146       dagger.internal.codegen.model.BindingGraph.Edge edge, XProcessingEnv env) {
147     if (edge instanceof dagger.internal.codegen.model.BindingGraph.DependencyEdge) {
148       return DependencyEdgeImpl.create(
149           (dagger.internal.codegen.model.BindingGraph.DependencyEdge) edge, env);
150     } else if (edge instanceof dagger.internal.codegen.model.BindingGraph.ChildFactoryMethodEdge) {
151       return ChildFactoryMethodEdgeImpl.create(
152           (dagger.internal.codegen.model.BindingGraph.ChildFactoryMethodEdge) edge, env);
153     } else if (edge
154         instanceof dagger.internal.codegen.model.BindingGraph.SubcomponentCreatorBindingEdge) {
155       return SubcomponentCreatorBindingEdgeImpl.create(
156           (dagger.internal.codegen.model.BindingGraph.SubcomponentCreatorBindingEdge) edge, env);
157     } else {
158       throw new IllegalStateException("Unhandled edge type: " + edge.getClass());
159     }
160   }
161 
toSpiModel(dagger.internal.codegen.model.Key key)162   private static Key toSpiModel(dagger.internal.codegen.model.Key key) {
163     Key.Builder builder =
164         Key.builder(toSpiModel(key.type().xprocessing()))
165             .qualifier(key.qualifier().map(qualifier -> toSpiModel(qualifier.xprocessing())));
166     if (key.multibindingContributionIdentifier().isPresent()) {
167       return builder
168           .multibindingContributionIdentifier(
169               toSpiModel(
170                   key.multibindingContributionIdentifier()
171                       .get()
172                       .contributingModule()
173                       .xprocessing()),
174               toSpiModel(
175                   key.multibindingContributionIdentifier().get().bindingMethod().xprocessing()))
176           .build();
177     }
178     return builder.build().withoutMultibindingContributionIdentifier();
179   }
180 
toSpiModel(dagger.internal.codegen.model.BindingKind bindingKind)181   private static BindingKind toSpiModel(dagger.internal.codegen.model.BindingKind bindingKind) {
182     return BindingKind.valueOf(bindingKind.name());
183   }
184 
toSpiModel(dagger.internal.codegen.model.RequestKind requestKind)185   private static RequestKind toSpiModel(dagger.internal.codegen.model.RequestKind requestKind) {
186     return RequestKind.valueOf(requestKind.name());
187   }
188 
189   @SuppressWarnings("CheckReturnValue")
toSpiModel( dagger.internal.codegen.model.DependencyRequest request)190   private static DependencyRequest toSpiModel(
191       dagger.internal.codegen.model.DependencyRequest request) {
192     DependencyRequest.Builder builder =
193         DependencyRequest.builder()
194             .kind(toSpiModel(request.kind()))
195             .key(toSpiModel(request.key()))
196             .isNullable(request.isNullable());
197 
198     request.requestElement().ifPresent(e -> builder.requestElement(toSpiModel(e.xprocessing())));
199     return builder.build();
200   }
201 
toSpiModel(dagger.internal.codegen.model.Scope scope)202   private static Scope toSpiModel(dagger.internal.codegen.model.Scope scope) {
203     return Scope.scope(toSpiModel(scope.scopeAnnotation().xprocessing()));
204   }
205 
toSpiModel(dagger.internal.codegen.model.ComponentPath path)206   private static ComponentPath toSpiModel(dagger.internal.codegen.model.ComponentPath path) {
207     return ComponentPath.create(
208         path.components().stream()
209             .map(component -> toSpiModel(component.xprocessing()))
210             .collect(toImmutableList()));
211   }
212 
toSpiModel(XTypeElement typeElement)213   private static DaggerTypeElement toSpiModel(XTypeElement typeElement) {
214     return DaggerTypeElementImpl.from(typeElement);
215   }
216 
toSpiModel(XType type)217   private static DaggerType toSpiModel(XType type) {
218     return DaggerTypeImpl.from(type);
219   }
220 
toSpiModel(XAnnotation annotation)221   static DaggerAnnotation toSpiModel(XAnnotation annotation) {
222     return DaggerAnnotationImpl.from(annotation);
223   }
224 
toSpiModel(XElement element)225   private static DaggerElement toSpiModel(XElement element) {
226     return DaggerElementImpl.from(element);
227   }
228 
toSpiModel(XExecutableElement executableElement)229   private static DaggerExecutableElement toSpiModel(XExecutableElement executableElement) {
230     return DaggerExecutableElementImpl.from(executableElement);
231   }
232 
toSpiModel(XProcessingEnv env)233   static DaggerProcessingEnv toSpiModel(XProcessingEnv env) {
234     return DaggerProcessingEnvImpl.from(env);
235   }
236 
toInternal( ComponentNode componentNode)237   private static dagger.internal.codegen.model.BindingGraph.ComponentNode toInternal(
238       ComponentNode componentNode) {
239     return ((ComponentNodeImpl) componentNode).internalDelegate();
240   }
241 
toInternal( MaybeBinding maybeBinding)242   private static dagger.internal.codegen.model.BindingGraph.MaybeBinding toInternal(
243       MaybeBinding maybeBinding) {
244     if (maybeBinding instanceof MissingBindingImpl) {
245       return ((MissingBindingImpl) maybeBinding).internalDelegate();
246     } else if (maybeBinding instanceof BindingNodeImpl) {
247       return ((BindingNodeImpl) maybeBinding).internalDelegate();
248     } else {
249       throw new IllegalStateException("Unhandled binding type: " + maybeBinding.getClass());
250     }
251   }
252 
toInternal( DependencyEdge dependencyEdge)253   private static dagger.internal.codegen.model.BindingGraph.DependencyEdge toInternal(
254       DependencyEdge dependencyEdge) {
255     return ((DependencyEdgeImpl) dependencyEdge).internalDelegate();
256   }
257 
toInternal( ChildFactoryMethodEdge childFactoryMethodEdge)258   private static dagger.internal.codegen.model.BindingGraph.ChildFactoryMethodEdge toInternal(
259       ChildFactoryMethodEdge childFactoryMethodEdge) {
260     return ((ChildFactoryMethodEdgeImpl) childFactoryMethodEdge).internalDelegate();
261   }
262 
263   @AutoValue
264   abstract static class ComponentNodeImpl implements ComponentNode {
create( dagger.internal.codegen.model.BindingGraph.ComponentNode componentNode, XProcessingEnv env)265     static ComponentNode create(
266         dagger.internal.codegen.model.BindingGraph.ComponentNode componentNode,
267         XProcessingEnv env) {
268       return new AutoValue_SpiModelBindingGraphConverter_ComponentNodeImpl(
269           toSpiModel(componentNode.componentPath()),
270           componentNode.isSubcomponent(),
271           componentNode.isRealComponent(),
272           componentNode.entryPoints().stream()
273               .map(SpiModelBindingGraphConverter::toSpiModel)
274               .collect(toImmutableSet()),
275           componentNode.scopes().stream()
276               .map(SpiModelBindingGraphConverter::toSpiModel)
277               .collect(toImmutableSet()),
278           componentNode);
279     }
280 
internalDelegate()281     abstract dagger.internal.codegen.model.BindingGraph.ComponentNode internalDelegate();
282 
283     @Override
toString()284     public final String toString() {
285       return internalDelegate().toString();
286     }
287   }
288 
289   @AutoValue
290   abstract static class BindingNodeImpl implements Binding {
create(dagger.internal.codegen.model.Binding binding, XProcessingEnv env)291     static Binding create(dagger.internal.codegen.model.Binding binding, XProcessingEnv env) {
292       return new AutoValue_SpiModelBindingGraphConverter_BindingNodeImpl(
293           toSpiModel(binding.key()),
294           toSpiModel(binding.componentPath()),
295           binding.dependencies().stream()
296               .map(SpiModelBindingGraphConverter::toSpiModel)
297               .collect(toImmutableSet()),
298           binding.bindingElement().map(element -> toSpiModel(element.xprocessing())),
299           binding.contributingModule().map(module -> toSpiModel(module.xprocessing())),
300           binding.requiresModuleInstance(),
301           binding.scope().map(SpiModelBindingGraphConverter::toSpiModel),
302           binding.isNullable(),
303           binding.isProduction(),
304           toSpiModel(binding.kind()),
305           binding);
306     }
307 
internalDelegate()308     abstract dagger.internal.codegen.model.Binding internalDelegate();
309 
310     @Override
toString()311     public final String toString() {
312       return internalDelegate().toString();
313     }
314   }
315 
316   @AutoValue
317   abstract static class MissingBindingImpl extends MissingBinding {
create( dagger.internal.codegen.model.BindingGraph.MissingBinding missingBinding, XProcessingEnv env)318     static MissingBinding create(
319         dagger.internal.codegen.model.BindingGraph.MissingBinding missingBinding,
320         XProcessingEnv env) {
321       return new AutoValue_SpiModelBindingGraphConverter_MissingBindingImpl(
322           toSpiModel(missingBinding.componentPath()),
323           toSpiModel(missingBinding.key()),
324           missingBinding);
325     }
326 
internalDelegate()327     abstract dagger.internal.codegen.model.BindingGraph.MissingBinding internalDelegate();
328 
329     @Memoized
330     @Override
hashCode()331     public abstract int hashCode();
332 
333     @Override
equals(Object o)334     public abstract boolean equals(Object o);
335   }
336 
337   @AutoValue
338   abstract static class DependencyEdgeImpl implements DependencyEdge {
create( dagger.internal.codegen.model.BindingGraph.DependencyEdge dependencyEdge, XProcessingEnv env)339     static DependencyEdge create(
340         dagger.internal.codegen.model.BindingGraph.DependencyEdge dependencyEdge,
341         XProcessingEnv env) {
342       return new AutoValue_SpiModelBindingGraphConverter_DependencyEdgeImpl(
343           toSpiModel(dependencyEdge.dependencyRequest()),
344           dependencyEdge.isEntryPoint(),
345           dependencyEdge);
346     }
347 
internalDelegate()348     abstract dagger.internal.codegen.model.BindingGraph.DependencyEdge internalDelegate();
349 
350     @Override
toString()351     public final String toString() {
352       return internalDelegate().toString();
353     }
354   }
355 
356   @AutoValue
357   abstract static class ChildFactoryMethodEdgeImpl implements ChildFactoryMethodEdge {
create( dagger.internal.codegen.model.BindingGraph.ChildFactoryMethodEdge childFactoryMethodEdge, XProcessingEnv env)358     static ChildFactoryMethodEdge create(
359         dagger.internal.codegen.model.BindingGraph.ChildFactoryMethodEdge childFactoryMethodEdge,
360         XProcessingEnv env) {
361       return new AutoValue_SpiModelBindingGraphConverter_ChildFactoryMethodEdgeImpl(
362           toSpiModel(childFactoryMethodEdge.factoryMethod().xprocessing()), childFactoryMethodEdge);
363     }
364 
internalDelegate()365     abstract dagger.internal.codegen.model.BindingGraph.ChildFactoryMethodEdge internalDelegate();
366 
367     @Override
toString()368     public final String toString() {
369       return internalDelegate().toString();
370     }
371   }
372 
373   @AutoValue
374   abstract static class SubcomponentCreatorBindingEdgeImpl
375       implements SubcomponentCreatorBindingEdge {
create( dagger.internal.codegen.model.BindingGraph.SubcomponentCreatorBindingEdge subcomponentCreatorBindingEdge, XProcessingEnv env)376     static SubcomponentCreatorBindingEdge create(
377         dagger.internal.codegen.model.BindingGraph.SubcomponentCreatorBindingEdge
378             subcomponentCreatorBindingEdge,
379         XProcessingEnv env) {
380       return new AutoValue_SpiModelBindingGraphConverter_SubcomponentCreatorBindingEdgeImpl(
381           subcomponentCreatorBindingEdge.declaringModules().stream()
382               .map(module -> toSpiModel(module.xprocessing()))
383               .collect(toImmutableSet()),
384           subcomponentCreatorBindingEdge);
385     }
386 
387     abstract dagger.internal.codegen.model.BindingGraph.SubcomponentCreatorBindingEdge
internalDelegate()388         internalDelegate();
389 
390     @Override
toString()391     public final String toString() {
392       return internalDelegate().toString();
393     }
394   }
395 
396   @AutoValue
397   abstract static class BindingGraphImpl extends BindingGraph {
create( dagger.internal.codegen.model.BindingGraph bindingGraph, XProcessingEnv env)398     static BindingGraph create(
399         dagger.internal.codegen.model.BindingGraph bindingGraph, XProcessingEnv env) {
400       BindingGraphImpl bindingGraphImpl =
401           new AutoValue_SpiModelBindingGraphConverter_BindingGraphImpl(
402               toSpiModel(bindingGraph.network(), env),
403               bindingGraph.isFullBindingGraph(),
404               Backend.valueOf(env.getBackend().name()));
405 
406       bindingGraphImpl.componentNodesByPath =
407           bindingGraphImpl.componentNodes().stream()
408               .collect(toImmutableMap(ComponentNode::componentPath, node -> node));
409 
410       return bindingGraphImpl;
411     }
412 
413     private ImmutableMap<ComponentPath, ComponentNode> componentNodesByPath;
414 
415     // This overrides dagger.model.BindingGraph with a more efficient implementation.
416     @Override
componentNode(ComponentPath componentPath)417     public Optional<ComponentNode> componentNode(ComponentPath componentPath) {
418       return componentNodesByPath.containsKey(componentPath)
419           ? Optional.of(componentNodesByPath.get(componentPath))
420           : Optional.empty();
421     }
422 
423     // This overrides dagger.model.BindingGraph to memoize the output.
424     @Override
425     @Memoized
nodesByClass()426     public ImmutableSetMultimap<Class<? extends Node>, ? extends Node> nodesByClass() {
427       return super.nodesByClass();
428     }
429   }
430 
431   @AutoValue
432   abstract static class DaggerElementImpl extends DaggerElement {
from(XElement element)433     public static DaggerElement from(XElement element) {
434       return new AutoValue_SpiModelBindingGraphConverter_DaggerElementImpl(element);
435     }
436 
element()437     abstract XElement element();
438 
439     @Override
javac()440     public Element javac() {
441       checkIsJavac(backend());
442       return toJavac(element());
443     }
444 
445     @Override
ksp()446     public KSAnnotated ksp() {
447       checkIsKsp(backend());
448       return toKS(element());
449     }
450 
451     @Override
backend()452     public DaggerProcessingEnv.Backend backend() {
453       return getBackend(getProcessingEnv(element()));
454     }
455 
456     @Override
toString()457     public final String toString() {
458       return XElements.toStableString(element());
459     }
460   }
461 
462   @AutoValue
463   abstract static class DaggerTypeElementImpl extends DaggerTypeElement {
from(XTypeElement element)464     public static DaggerTypeElement from(XTypeElement element) {
465       return new AutoValue_SpiModelBindingGraphConverter_DaggerTypeElementImpl(element);
466     }
467 
element()468     abstract XTypeElement element();
469 
470     @Override
javac()471     public TypeElement javac() {
472       checkIsJavac(backend());
473       return toJavac(element());
474     }
475 
476     @Override
ksp()477     public KSClassDeclaration ksp() {
478       checkIsKsp(backend());
479       return toKS(element());
480     }
481 
482     @Override
backend()483     public DaggerProcessingEnv.Backend backend() {
484       return getBackend(getProcessingEnv(element()));
485     }
486 
487     @Override
toString()488     public final String toString() {
489       return XElements.toStableString(element());
490     }
491   }
492 
493   @AutoValue
494   abstract static class DaggerTypeImpl extends DaggerType {
from(XType type)495     public static DaggerType from(XType type) {
496       return new AutoValue_SpiModelBindingGraphConverter_DaggerTypeImpl(
497           XTypes.equivalence().wrap(type));
498     }
499 
type()500     abstract Equivalence.Wrapper<XType> type();
501 
502     @Override
javac()503     public TypeMirror javac() {
504       checkIsJavac(backend());
505       return toJavac(type().get());
506     }
507 
508     @Override
ksp()509     public KSType ksp() {
510       checkIsKsp(backend());
511       return toKS(type().get());
512     }
513 
514     @Override
backend()515     public DaggerProcessingEnv.Backend backend() {
516       return getBackend(getProcessingEnv(type().get()));
517     }
518 
519     @Override
toString()520     public final String toString() {
521       return XTypes.toStableString(type().get());
522     }
523   }
524 
525   @AutoValue
526   abstract static class DaggerAnnotationImpl extends DaggerAnnotation {
from(XAnnotation annotation)527     public static DaggerAnnotation from(XAnnotation annotation) {
528       return new AutoValue_SpiModelBindingGraphConverter_DaggerAnnotationImpl(
529           XAnnotations.equivalence().wrap(annotation));
530     }
531 
annotation()532     abstract Equivalence.Wrapper<XAnnotation> annotation();
533 
534     @Override
annotationTypeElement()535     public DaggerTypeElement annotationTypeElement() {
536       return DaggerTypeElementImpl.from(annotation().get().getTypeElement());
537     }
538 
539     @Override
javac()540     public AnnotationMirror javac() {
541       checkIsJavac(backend());
542       return toJavac(annotation().get());
543     }
544 
545     @Override
ksp()546     public KSAnnotation ksp() {
547       checkIsKsp(backend());
548       return toKS(annotation().get());
549     }
550 
551     @Override
backend()552     public DaggerProcessingEnv.Backend backend() {
553       return getBackend(getProcessingEnv(annotation().get()));
554     }
555 
556     @Override
toString()557     public final String toString() {
558       return XAnnotations.toStableString(annotation().get());
559     }
560   }
561 
562   @AutoValue
563   abstract static class DaggerExecutableElementImpl extends DaggerExecutableElement {
from(XExecutableElement executableElement)564     public static DaggerExecutableElement from(XExecutableElement executableElement) {
565       return new AutoValue_SpiModelBindingGraphConverter_DaggerExecutableElementImpl(
566           executableElement);
567     }
568 
executableElement()569     abstract XExecutableElement executableElement();
570 
571     @Override
javac()572     public ExecutableElement javac() {
573       checkIsJavac(backend());
574       return toJavac(executableElement());
575     }
576 
577     @Override
ksp()578     public KSFunctionDeclaration ksp() {
579       checkIsKsp(backend());
580       return toKS(executableElement());
581     }
582 
583     @Override
backend()584     public DaggerProcessingEnv.Backend backend() {
585       return getBackend(getProcessingEnv(executableElement()));
586     }
587 
588     @Override
toString()589     public final String toString() {
590       return XElements.toStableString(executableElement());
591     }
592   }
593 
594   private static class DaggerProcessingEnvImpl extends DaggerProcessingEnv {
595     private final XProcessingEnv env;
596 
from(XProcessingEnv env)597     public static DaggerProcessingEnv from(XProcessingEnv env) {
598       return new DaggerProcessingEnvImpl(env);
599     }
600 
DaggerProcessingEnvImpl(XProcessingEnv env)601     DaggerProcessingEnvImpl(XProcessingEnv env) {
602       this.env = env;
603     }
604 
605     @Override
javac()606     public ProcessingEnvironment javac() {
607       checkIsJavac(backend());
608       return toJavac(env);
609     }
610 
611     @Override
ksp()612     public SymbolProcessorEnvironment ksp() {
613       checkIsKsp(backend());
614       return toKS(env);
615     }
616 
617     @Override
resolver()618     public Resolver resolver() {
619       return toKSResolver(env);
620     }
621 
622     @Override
backend()623     public DaggerProcessingEnv.Backend backend() {
624       return getBackend(env);
625     }
626   }
627 
checkIsJavac(DaggerProcessingEnv.Backend backend)628   private static void checkIsJavac(DaggerProcessingEnv.Backend backend) {
629     checkState(
630         backend == DaggerProcessingEnv.Backend.JAVAC,
631         "Expected JAVAC backend but was: %s", backend);
632   }
633 
checkIsKsp(DaggerProcessingEnv.Backend backend)634   private static void checkIsKsp(DaggerProcessingEnv.Backend backend) {
635     checkState(
636         backend == DaggerProcessingEnv.Backend.KSP,
637         "Expected KSP backend but was: %s", backend);
638   }
639 
getBackend(XProcessingEnv env)640   private static DaggerProcessingEnv.Backend getBackend(XProcessingEnv env) {
641     switch (env.getBackend()) {
642       case JAVAC:
643         return DaggerProcessingEnv.Backend.JAVAC;
644       case KSP:
645         return DaggerProcessingEnv.Backend.KSP;
646     }
647     throw new AssertionError(String.format("Unexpected backend %s", env.getBackend()));
648   }
649 
650   private static final class DiagnosticReporterImpl extends DiagnosticReporter {
create( dagger.internal.codegen.model.DiagnosticReporter reporter)651     static DiagnosticReporterImpl create(
652         dagger.internal.codegen.model.DiagnosticReporter reporter) {
653       return new DiagnosticReporterImpl(reporter);
654     }
655 
656     private final dagger.internal.codegen.model.DiagnosticReporter delegate;
657 
DiagnosticReporterImpl(dagger.internal.codegen.model.DiagnosticReporter delegate)658     DiagnosticReporterImpl(dagger.internal.codegen.model.DiagnosticReporter delegate) {
659       this.delegate = delegate;
660     }
661 
662     @Override
reportComponent( Diagnostic.Kind diagnosticKind, ComponentNode componentNode, String message)663     public void reportComponent(
664         Diagnostic.Kind diagnosticKind, ComponentNode componentNode, String message) {
665       delegate.reportComponent(diagnosticKind, toInternal(componentNode), message);
666     }
667 
668     @Override
reportBinding( Diagnostic.Kind diagnosticKind, MaybeBinding binding, String message)669     public void reportBinding(
670         Diagnostic.Kind diagnosticKind, MaybeBinding binding, String message) {
671       delegate.reportBinding(diagnosticKind, toInternal(binding), message);
672     }
673 
674     @Override
reportDependency( Diagnostic.Kind diagnosticKind, DependencyEdge dependencyEdge, String message)675     public void reportDependency(
676         Diagnostic.Kind diagnosticKind, DependencyEdge dependencyEdge, String message) {
677       delegate.reportDependency(diagnosticKind, toInternal(dependencyEdge), message);
678     }
679 
680     @Override
reportSubcomponentFactoryMethod( Diagnostic.Kind diagnosticKind, ChildFactoryMethodEdge childFactoryMethodEdge, String message)681     public void reportSubcomponentFactoryMethod(
682         Diagnostic.Kind diagnosticKind,
683         ChildFactoryMethodEdge childFactoryMethodEdge,
684         String message) {
685       delegate.reportSubcomponentFactoryMethod(
686           diagnosticKind, toInternal(childFactoryMethodEdge), message);
687     }
688   }
689 }
690