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.functional.builder;
18 
19 import dagger.Component;
20 
21 @Component(
22     modules = {StringModule.class, IntModuleIncludingDoubleAndFloat.class, LongModule.class},
23     dependencies = DepComponent.class)
24 interface TestComponentWithGenericBuilderAbstractClass {
s()25   String s();
i()26   int i();
l()27   long l();
f()28   float f();
d()29   double d();
30 
31   static abstract class SharedBuilder<B, C, M1, M2> {
build()32     abstract C build(); // Test resolving return type of build()
setM1(M1 m1)33     abstract B setM1(M1 m1); // Test resolving return type & param of setter
setM2(M2 m2)34     abstract SharedBuilder<B, C, M1, M2> setM2(M2 m2); // Test being overridden
doubleModule(DoubleModule doubleModule)35     abstract void doubleModule(DoubleModule doubleModule);  // Test being overridden
depComponent(FloatModule floatModule)36     abstract SharedBuilder<B, C, M1, M2> depComponent(FloatModule floatModule); // Test return type
37   }
38 
39   @Component.Builder
40   static abstract class Builder extends SharedBuilder<Builder,
41       TestComponentWithGenericBuilderAbstractClass, StringModule,
42       IntModuleIncludingDoubleAndFloat> {
setM2(IntModuleIncludingDoubleAndFloat m2)43     @Override abstract Builder setM2(IntModuleIncludingDoubleAndFloat m2); // Test covariant overrides
doubleModule(DoubleModule module3)44     @Override abstract void doubleModule(DoubleModule module3); // Test simple overrides allowed
depComponent(DepComponent depComponent)45     abstract void depComponent(DepComponent depComponent);
46 
47     // Note we're missing LongModule & FloatModule -- they're implicit
48   }
49 }
50