• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2015 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;
18 
19 import static com.squareup.javapoet.MethodSpec.constructorBuilder;
20 import static com.squareup.javapoet.MethodSpec.methodBuilder;
21 import static com.squareup.javapoet.TypeSpec.classBuilder;
22 import static dagger.internal.codegen.javapoet.TypeNames.PRODUCTION_COMPONENT_MONITOR_FACTORY;
23 import static dagger.internal.codegen.javapoet.TypeNames.providerOf;
24 import static dagger.internal.codegen.javapoet.TypeNames.setOf;
25 import static javax.lang.model.element.Modifier.ABSTRACT;
26 import static javax.lang.model.element.Modifier.PRIVATE;
27 import static javax.lang.model.element.Modifier.STATIC;
28 
29 import com.squareup.javapoet.ClassName;
30 import com.squareup.javapoet.MethodSpec;
31 import com.squareup.javapoet.TypeSpec;
32 import dagger.Module;
33 import dagger.Provides;
34 import dagger.internal.codegen.langmodel.DaggerElements;
35 import dagger.multibindings.Multibinds;
36 import dagger.producers.ProductionScope;
37 import dagger.producers.monitoring.ProductionComponentMonitor;
38 import dagger.producers.monitoring.internal.Monitors;
39 import java.util.Optional;
40 import javax.annotation.processing.Filer;
41 import javax.inject.Inject;
42 import javax.lang.model.SourceVersion;
43 import javax.lang.model.element.Element;
44 import javax.lang.model.element.TypeElement;
45 
46 /** Generates a monitoring module for use with production components. */
47 final class MonitoringModuleGenerator extends SourceFileGenerator<TypeElement> {
48 
49   @Inject
MonitoringModuleGenerator(Filer filer, DaggerElements elements, SourceVersion sourceVersion)50   MonitoringModuleGenerator(Filer filer, DaggerElements elements, SourceVersion sourceVersion) {
51     super(filer, elements, sourceVersion);
52   }
53 
54   @Override
nameGeneratedType(TypeElement componentElement)55   ClassName nameGeneratedType(TypeElement componentElement) {
56     return SourceFiles.generatedMonitoringModuleName(componentElement);
57   }
58 
59   @Override
originatingElement(TypeElement componentElement)60   Element originatingElement(TypeElement componentElement) {
61     return componentElement;
62   }
63 
64   @Override
write(ClassName generatedTypeName, TypeElement componentElement)65   Optional<TypeSpec.Builder> write(ClassName generatedTypeName, TypeElement componentElement) {
66     return Optional.of(
67         classBuilder(generatedTypeName)
68             .addAnnotation(Module.class)
69             .addModifiers(ABSTRACT)
70             .addMethod(privateConstructor())
71             .addMethod(setOfFactories())
72             .addMethod(monitor(componentElement)));
73   }
74 
privateConstructor()75   private MethodSpec privateConstructor() {
76     return constructorBuilder().addModifiers(PRIVATE).build();
77   }
78 
setOfFactories()79   private MethodSpec setOfFactories() {
80     return methodBuilder("setOfFactories")
81         .addAnnotation(Multibinds.class)
82         .addModifiers(ABSTRACT)
83         .returns(setOf(PRODUCTION_COMPONENT_MONITOR_FACTORY))
84         .build();
85   }
86 
monitor(TypeElement componentElement)87   private MethodSpec monitor(TypeElement componentElement) {
88     return methodBuilder("monitor")
89         .returns(ProductionComponentMonitor.class)
90         .addModifiers(STATIC)
91         .addAnnotation(Provides.class)
92         .addAnnotation(ProductionScope.class)
93         .addParameter(providerOf(ClassName.get(componentElement.asType())), "component")
94         .addParameter(
95             providerOf(setOf(PRODUCTION_COMPONENT_MONITOR_FACTORY)), "factories")
96         .addStatement(
97             "return $T.createMonitorForComponent(component, factories)", Monitors.class)
98         .build();
99   }
100 }
101