1 /* 2 * Copyright (C) 2017 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.writing; 18 19 import static dagger.internal.codegen.xprocessing.XElements.asMethod; 20 21 import com.squareup.javapoet.ClassName; 22 import com.squareup.javapoet.CodeBlock; 23 import dagger.assisted.Assisted; 24 import dagger.assisted.AssistedFactory; 25 import dagger.assisted.AssistedInject; 26 import dagger.internal.Preconditions; 27 import dagger.internal.codegen.binding.BindingGraph; 28 import dagger.internal.codegen.binding.ComponentRequirement; 29 import dagger.internal.codegen.binding.ProvisionBinding; 30 import dagger.internal.codegen.compileroption.CompilerOptions; 31 import dagger.internal.codegen.javapoet.Expression; 32 33 /** A binding expression for component provision methods. */ 34 final class ComponentProvisionRequestRepresentation extends RequestRepresentation { 35 private final ProvisionBinding binding; 36 private final BindingGraph bindingGraph; 37 private final ComponentRequirementExpressions componentRequirementExpressions; 38 private final CompilerOptions compilerOptions; 39 40 @AssistedInject ComponentProvisionRequestRepresentation( @ssisted ProvisionBinding binding, BindingGraph bindingGraph, ComponentImplementation componentImplementation, ComponentRequirementExpressions componentRequirementExpressions, CompilerOptions compilerOptions)41 ComponentProvisionRequestRepresentation( 42 @Assisted ProvisionBinding binding, 43 BindingGraph bindingGraph, 44 ComponentImplementation componentImplementation, 45 ComponentRequirementExpressions componentRequirementExpressions, 46 CompilerOptions compilerOptions) { 47 this.binding = binding; 48 this.bindingGraph = bindingGraph; 49 this.componentRequirementExpressions = componentRequirementExpressions; 50 this.compilerOptions = compilerOptions; 51 } 52 53 @Override getDependencyExpression(ClassName requestingClass)54 Expression getDependencyExpression(ClassName requestingClass) { 55 CodeBlock componentDependency = getComponentRequirementExpression(requestingClass); 56 CodeBlock invocation = 57 CodeBlock.of( 58 "$L.$L()", componentDependency, asMethod(binding.bindingElement().get()).getJvmName()); 59 return Expression.create( 60 binding.contributedPrimitiveType().orElse(binding.key().type().xprocessing()), 61 maybeCheckForNull(binding, compilerOptions, invocation)); 62 } 63 getComponentRequirementExpression(ClassName requestingClass)64 CodeBlock getComponentRequirementExpression(ClassName requestingClass) { 65 return componentRequirementExpressions.getExpression(componentRequirement(), requestingClass); 66 } 67 componentRequirement()68 private ComponentRequirement componentRequirement() { 69 return bindingGraph 70 .componentDescriptor() 71 .getDependencyThatDefinesMethod(binding.bindingElement().get()); 72 } 73 maybeCheckForNull( ProvisionBinding binding, CompilerOptions compilerOptions, CodeBlock invocation)74 static CodeBlock maybeCheckForNull( 75 ProvisionBinding binding, CompilerOptions compilerOptions, CodeBlock invocation) { 76 return binding.shouldCheckForNull(compilerOptions) 77 ? CodeBlock.of("$T.checkNotNullFromComponent($L)", Preconditions.class, invocation) 78 : invocation; 79 } 80 81 @AssistedFactory 82 static interface Factory { create(ProvisionBinding binding)83 ComponentProvisionRequestRepresentation create(ProvisionBinding binding); 84 } 85 } 86