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