• 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.processingstep;
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 androidx.room.compiler.processing.XElement;
30 import androidx.room.compiler.processing.XFiler;
31 import androidx.room.compiler.processing.XProcessingEnv;
32 import androidx.room.compiler.processing.XTypeElement;
33 import com.google.common.collect.ImmutableList;
34 import com.squareup.javapoet.MethodSpec;
35 import com.squareup.javapoet.TypeSpec;
36 import dagger.Module;
37 import dagger.internal.codegen.base.SourceFileGenerator;
38 import dagger.internal.codegen.binding.MonitoringModules;
39 import dagger.internal.codegen.binding.SourceFiles;
40 import dagger.internal.codegen.javapoet.TypeNames;
41 import dagger.multibindings.Multibinds;
42 import javax.inject.Inject;
43 
44 /** Generates a monitoring module for use with production components. */
45 final class MonitoringModuleGenerator extends SourceFileGenerator<XTypeElement> {
46   private final MonitoringModules monitoringModules;
47 
48   @Inject
MonitoringModuleGenerator( XFiler filer, XProcessingEnv processingEnv, MonitoringModules monitoringModules)49   MonitoringModuleGenerator(
50       XFiler filer,
51       XProcessingEnv processingEnv,
52       MonitoringModules monitoringModules) {
53     super(filer, processingEnv);
54     this.monitoringModules = monitoringModules;
55   }
56 
57   @Override
originatingElement(XTypeElement componentElement)58   public XElement originatingElement(XTypeElement componentElement) {
59     return componentElement;
60   }
61 
62   @Override
topLevelTypes(XTypeElement componentElement)63   public ImmutableList<TypeSpec.Builder> topLevelTypes(XTypeElement componentElement) {
64     monitoringModules.add(SourceFiles.generatedMonitoringModuleName(componentElement));
65     return ImmutableList.of(
66         classBuilder(SourceFiles.generatedMonitoringModuleName(componentElement))
67             .addAnnotation(Module.class)
68             .addModifiers(ABSTRACT)
69             .addMethod(privateConstructor())
70             .addMethod(setOfFactories())
71             .addMethod(monitor(componentElement)));
72   }
73 
privateConstructor()74   private MethodSpec privateConstructor() {
75     return constructorBuilder().addModifiers(PRIVATE).build();
76   }
77 
setOfFactories()78   private MethodSpec setOfFactories() {
79     return methodBuilder("setOfFactories")
80         .addAnnotation(Multibinds.class)
81         .addModifiers(ABSTRACT)
82         .returns(setOf(PRODUCTION_COMPONENT_MONITOR_FACTORY))
83         .build();
84   }
85 
monitor(XTypeElement componentElement)86   private MethodSpec monitor(XTypeElement componentElement) {
87     return methodBuilder("monitor")
88         .returns(TypeNames.PRODUCTION_COMPONENT_MONITOR)
89         .addModifiers(STATIC)
90         .addAnnotation(TypeNames.PROVIDES)
91         .addAnnotation(TypeNames.PRODUCTION_SCOPE)
92         .addParameter(providerOf(componentElement.getType().getTypeName()), "component")
93         .addParameter(providerOf(setOf(PRODUCTION_COMPONENT_MONITOR_FACTORY)), "factories")
94         .addStatement(
95             "return $T.createMonitorForComponent(component, factories)", TypeNames.MONITORS)
96         .build();
97   }
98 }
99