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