• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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