1 /* 2 * Copyright (C) 2018 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 dagger.Module; 20 import dagger.Provides; 21 import dagger.internal.codegen.SourceFileGeneratorsModule.ComponentModule; 22 import dagger.internal.codegen.SourceFileGeneratorsModule.MembersInjectionModule; 23 import dagger.internal.codegen.SourceFileGeneratorsModule.ProductionModule; 24 import dagger.internal.codegen.SourceFileGeneratorsModule.ProvisionModule; 25 import javax.lang.model.element.TypeElement; 26 27 @Module( 28 includes = { 29 ProvisionModule.class, 30 ProductionModule.class, 31 MembersInjectionModule.class, 32 ComponentModule.class 33 }) 34 interface SourceFileGeneratorsModule { 35 @Module 36 abstract class GeneratorModule<T, G extends SourceFileGenerator<T>> { 37 @Provides generator(G generator, CompilerOptions compilerOptions)38 SourceFileGenerator<T> generator(G generator, CompilerOptions compilerOptions) { 39 return compilerOptions.headerCompilation() 40 ? HjarSourceFileGenerator.wrap(generator) 41 : generator; 42 } 43 } 44 45 @Module 46 class ProvisionModule extends GeneratorModule<ProvisionBinding, FactoryGenerator> {} 47 48 @Module 49 class ProductionModule extends GeneratorModule<ProductionBinding, ProducerFactoryGenerator> {} 50 51 @Module 52 class MembersInjectionModule 53 extends GeneratorModule<MembersInjectionBinding, MembersInjectorGenerator> {} 54 55 @Module 56 class ComponentModule extends GeneratorModule<BindingGraph, ComponentGenerator> {} 57 58 // the abstract module is not available because we're using a qualifier 59 @Provides 60 @ModuleGenerator generator( ModuleConstructorProxyGenerator generator, CompilerOptions compilerOptions)61 static SourceFileGenerator<TypeElement> generator( 62 ModuleConstructorProxyGenerator generator, CompilerOptions compilerOptions) { 63 return compilerOptions.headerCompilation() 64 ? HjarSourceFileGenerator.wrap(generator) 65 : generator; 66 } 67 } 68