xref: /aosp_15_r20/external/dagger2/javatests/dagger/functional/producers/SimpleProducerModule.java (revision f585d8a307d0621d6060bd7e80091fdcbf94fe27)
1*f585d8a3SJacky Wang /*
2*f585d8a3SJacky Wang  * Copyright (C) 2015 The Dagger Authors.
3*f585d8a3SJacky Wang  *
4*f585d8a3SJacky Wang  * Licensed under the Apache License, Version 2.0 (the "License");
5*f585d8a3SJacky Wang  * you may not use this file except in compliance with the License.
6*f585d8a3SJacky Wang  * You may obtain a copy of the License at
7*f585d8a3SJacky Wang  *
8*f585d8a3SJacky Wang  * http://www.apache.org/licenses/LICENSE-2.0
9*f585d8a3SJacky Wang  *
10*f585d8a3SJacky Wang  * Unless required by applicable law or agreed to in writing, software
11*f585d8a3SJacky Wang  * distributed under the License is distributed on an "AS IS" BASIS,
12*f585d8a3SJacky Wang  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*f585d8a3SJacky Wang  * See the License for the specific language governing permissions and
14*f585d8a3SJacky Wang  * limitations under the License.
15*f585d8a3SJacky Wang  */
16*f585d8a3SJacky Wang 
17*f585d8a3SJacky Wang package dagger.functional.producers;
18*f585d8a3SJacky Wang 
19*f585d8a3SJacky Wang import com.google.common.collect.ImmutableSet;
20*f585d8a3SJacky Wang import com.google.common.util.concurrent.Futures;
21*f585d8a3SJacky Wang import com.google.common.util.concurrent.ListenableFuture;
22*f585d8a3SJacky Wang import com.google.common.util.concurrent.SettableFuture;
23*f585d8a3SJacky Wang import dagger.Lazy;
24*f585d8a3SJacky Wang import dagger.multibindings.ElementsIntoSet;
25*f585d8a3SJacky Wang import dagger.multibindings.IntoSet;
26*f585d8a3SJacky Wang import dagger.producers.Produced;
27*f585d8a3SJacky Wang import dagger.producers.Producer;
28*f585d8a3SJacky Wang import dagger.producers.ProducerModule;
29*f585d8a3SJacky Wang import dagger.producers.Produces;
30*f585d8a3SJacky Wang import java.io.IOException;
31*f585d8a3SJacky Wang import java.util.Set;
32*f585d8a3SJacky Wang import javax.inject.Provider;
33*f585d8a3SJacky Wang import javax.inject.Qualifier;
34*f585d8a3SJacky Wang 
35*f585d8a3SJacky Wang /**
36*f585d8a3SJacky Wang  * A module that contains various signatures of produces methods. This is not used in any
37*f585d8a3SJacky Wang  * components.
38*f585d8a3SJacky Wang  */
39*f585d8a3SJacky Wang @ProducerModule
40*f585d8a3SJacky Wang final class SimpleProducerModule {
41*f585d8a3SJacky Wang   @Qualifier @interface Qual {
value()42*f585d8a3SJacky Wang     int value();
43*f585d8a3SJacky Wang   }
44*f585d8a3SJacky Wang 
45*f585d8a3SJacky Wang   // Unique bindings.
46*f585d8a3SJacky Wang 
47*f585d8a3SJacky Wang   @Produces
48*f585d8a3SJacky Wang   @Qual(-2)
throwingProducer()49*f585d8a3SJacky Wang   static ListenableFuture<String> throwingProducer() {
50*f585d8a3SJacky Wang     throw new RuntimeException("monkey");
51*f585d8a3SJacky Wang   }
52*f585d8a3SJacky Wang 
53*f585d8a3SJacky Wang   @Produces
54*f585d8a3SJacky Wang   @Qual(-1)
settableFutureStr(SettableFuture<String> future)55*f585d8a3SJacky Wang   static ListenableFuture<String> settableFutureStr(SettableFuture<String> future) {
56*f585d8a3SJacky Wang     return future;
57*f585d8a3SJacky Wang   }
58*f585d8a3SJacky Wang 
59*f585d8a3SJacky Wang   @Produces
60*f585d8a3SJacky Wang   @Qual(0)
str()61*f585d8a3SJacky Wang   static String str() {
62*f585d8a3SJacky Wang     return "str";
63*f585d8a3SJacky Wang   }
64*f585d8a3SJacky Wang 
65*f585d8a3SJacky Wang   @Produces
66*f585d8a3SJacky Wang   @Qual(1)
futureStr()67*f585d8a3SJacky Wang   static ListenableFuture<String> futureStr() {
68*f585d8a3SJacky Wang     return Futures.immediateFuture("future str");
69*f585d8a3SJacky Wang   }
70*f585d8a3SJacky Wang 
71*f585d8a3SJacky Wang   @Produces
72*f585d8a3SJacky Wang   @Qual(2)
strWithArg(@uppressWarnings"unused") int i)73*f585d8a3SJacky Wang   static String strWithArg(@SuppressWarnings("unused") int i) {
74*f585d8a3SJacky Wang     return "str with arg";
75*f585d8a3SJacky Wang   }
76*f585d8a3SJacky Wang 
77*f585d8a3SJacky Wang   @Produces
78*f585d8a3SJacky Wang   @Qual(3)
futureStrWithArg(@uppressWarnings"unused") int i)79*f585d8a3SJacky Wang   static ListenableFuture<String> futureStrWithArg(@SuppressWarnings("unused") int i) {
80*f585d8a3SJacky Wang     return Futures.immediateFuture("future str with arg");
81*f585d8a3SJacky Wang   }
82*f585d8a3SJacky Wang 
83*f585d8a3SJacky Wang   @Produces
84*f585d8a3SJacky Wang   @Qual(4)
85*f585d8a3SJacky Wang   @SuppressWarnings("unused") // unthrown exception for test
strThrowingException()86*f585d8a3SJacky Wang   static String strThrowingException() throws IOException {
87*f585d8a3SJacky Wang     return "str throwing exception";
88*f585d8a3SJacky Wang   }
89*f585d8a3SJacky Wang 
90*f585d8a3SJacky Wang   @Produces
91*f585d8a3SJacky Wang   @Qual(5)
92*f585d8a3SJacky Wang   @SuppressWarnings("unused") // unthrown exception for test
futureStrThrowingException()93*f585d8a3SJacky Wang   static ListenableFuture<String> futureStrThrowingException() throws IOException {
94*f585d8a3SJacky Wang     return Futures.immediateFuture("future str throwing exception");
95*f585d8a3SJacky Wang   }
96*f585d8a3SJacky Wang 
97*f585d8a3SJacky Wang   @Produces
98*f585d8a3SJacky Wang   @Qual(6)
99*f585d8a3SJacky Wang   @SuppressWarnings("unused") // unthrown exception for test, unused parameter for test
strWithArgThrowingException(int i)100*f585d8a3SJacky Wang   static String strWithArgThrowingException(int i) throws IOException {
101*f585d8a3SJacky Wang     return "str with arg throwing exception";
102*f585d8a3SJacky Wang   }
103*f585d8a3SJacky Wang 
104*f585d8a3SJacky Wang   @Produces
105*f585d8a3SJacky Wang   @Qual(7)
106*f585d8a3SJacky Wang   @SuppressWarnings("unused") // unthrown exception for test, unused parameter for test
futureStrWithArgThrowingException(int i)107*f585d8a3SJacky Wang   static ListenableFuture<String> futureStrWithArgThrowingException(int i) throws IOException {
108*f585d8a3SJacky Wang     return Futures.immediateFuture("future str with arg throwing exception");
109*f585d8a3SJacky Wang   }
110*f585d8a3SJacky Wang 
111*f585d8a3SJacky Wang   @Produces
112*f585d8a3SJacky Wang   @Qual(8)
strWithArgs( @uppressWarnings"unused") int i, @SuppressWarnings("unused") Produced<Double> b, @SuppressWarnings("unused") Producer<Object> c, @SuppressWarnings("unused") Provider<Boolean> d)113*f585d8a3SJacky Wang   static String strWithArgs(
114*f585d8a3SJacky Wang       @SuppressWarnings("unused") int i,
115*f585d8a3SJacky Wang       @SuppressWarnings("unused") Produced<Double> b,
116*f585d8a3SJacky Wang       @SuppressWarnings("unused") Producer<Object> c,
117*f585d8a3SJacky Wang       @SuppressWarnings("unused") Provider<Boolean> d) {
118*f585d8a3SJacky Wang     return "str with args";
119*f585d8a3SJacky Wang   }
120*f585d8a3SJacky Wang 
121*f585d8a3SJacky Wang   @Produces
122*f585d8a3SJacky Wang   @Qual(9)
123*f585d8a3SJacky Wang   @SuppressWarnings("unused") // unthrown exception for test, unused parameters for test
strWithArgsThrowingException( int i, Produced<Double> b, Producer<Object> c, Provider<Boolean> d)124*f585d8a3SJacky Wang   static String strWithArgsThrowingException(
125*f585d8a3SJacky Wang       int i, Produced<Double> b, Producer<Object> c, Provider<Boolean> d) throws IOException {
126*f585d8a3SJacky Wang     return "str with args throwing exception";
127*f585d8a3SJacky Wang   }
128*f585d8a3SJacky Wang 
129*f585d8a3SJacky Wang   @Produces
130*f585d8a3SJacky Wang   @Qual(10)
futureStrWithArgs( @uppressWarnings"unused") int i, @SuppressWarnings("unused") Produced<Double> b, @SuppressWarnings("unused") Producer<Object> c, @SuppressWarnings("unused") Provider<Boolean> d)131*f585d8a3SJacky Wang   static ListenableFuture<String> futureStrWithArgs(
132*f585d8a3SJacky Wang       @SuppressWarnings("unused") int i,
133*f585d8a3SJacky Wang       @SuppressWarnings("unused") Produced<Double> b,
134*f585d8a3SJacky Wang       @SuppressWarnings("unused") Producer<Object> c,
135*f585d8a3SJacky Wang       @SuppressWarnings("unused") Provider<Boolean> d) {
136*f585d8a3SJacky Wang     return Futures.immediateFuture("future str with args");
137*f585d8a3SJacky Wang   }
138*f585d8a3SJacky Wang 
139*f585d8a3SJacky Wang   @Produces
140*f585d8a3SJacky Wang   @Qual(11)
141*f585d8a3SJacky Wang   @SuppressWarnings("unused") // unthrown exception for test, unused parameter for test
futureStrWithArgsThrowingException( int i, Produced<Double> b, Producer<Object> c, Provider<Boolean> d)142*f585d8a3SJacky Wang   static ListenableFuture<String> futureStrWithArgsThrowingException(
143*f585d8a3SJacky Wang       int i, Produced<Double> b, Producer<Object> c, Provider<Boolean> d) throws IOException {
144*f585d8a3SJacky Wang     return Futures.immediateFuture("str with args throwing exception");
145*f585d8a3SJacky Wang   }
146*f585d8a3SJacky Wang 
147*f585d8a3SJacky Wang   @Produces
148*f585d8a3SJacky Wang   @Qual(12)
strWithFrameworkTypeArgs( @uppressWarnings"unused") @ual1) int i, @SuppressWarnings("unused") @Qual(1) Provider<Integer> iProvider, @SuppressWarnings("unused") @Qual(1) Lazy<Integer> iLazy, @SuppressWarnings("unused") @Qual(2) int j, @SuppressWarnings("unused") @Qual(2) Produced<Integer> jProduced, @SuppressWarnings("unused") @Qual(2) Producer<Integer> jProducer, @SuppressWarnings("unused") @Qual(3) Produced<Integer> kProduced, @SuppressWarnings("unused") @Qual(3) Producer<Integer> kProducer)149*f585d8a3SJacky Wang   static String strWithFrameworkTypeArgs(
150*f585d8a3SJacky Wang       @SuppressWarnings("unused") @Qual(1) int i,
151*f585d8a3SJacky Wang       @SuppressWarnings("unused") @Qual(1) Provider<Integer> iProvider,
152*f585d8a3SJacky Wang       @SuppressWarnings("unused") @Qual(1) Lazy<Integer> iLazy,
153*f585d8a3SJacky Wang       @SuppressWarnings("unused") @Qual(2) int j,
154*f585d8a3SJacky Wang       @SuppressWarnings("unused") @Qual(2) Produced<Integer> jProduced,
155*f585d8a3SJacky Wang       @SuppressWarnings("unused") @Qual(2) Producer<Integer> jProducer,
156*f585d8a3SJacky Wang       @SuppressWarnings("unused") @Qual(3) Produced<Integer> kProduced,
157*f585d8a3SJacky Wang       @SuppressWarnings("unused") @Qual(3) Producer<Integer> kProducer) {
158*f585d8a3SJacky Wang     return "str with framework type args";
159*f585d8a3SJacky Wang   }
160*f585d8a3SJacky Wang 
161*f585d8a3SJacky Wang   // Set bindings.
162*f585d8a3SJacky Wang 
163*f585d8a3SJacky Wang   @Produces
164*f585d8a3SJacky Wang   @IntoSet
setOfStrElement()165*f585d8a3SJacky Wang   static String setOfStrElement() {
166*f585d8a3SJacky Wang     return "set of str element";
167*f585d8a3SJacky Wang   }
168*f585d8a3SJacky Wang 
169*f585d8a3SJacky Wang   @Produces
170*f585d8a3SJacky Wang   @IntoSet
171*f585d8a3SJacky Wang   @SuppressWarnings("unused") // unthrown exception for test
setOfStrElementThrowingException()172*f585d8a3SJacky Wang   static String setOfStrElementThrowingException() throws IOException {
173*f585d8a3SJacky Wang     return "set of str element throwing exception";
174*f585d8a3SJacky Wang   }
175*f585d8a3SJacky Wang 
176*f585d8a3SJacky Wang   @Produces
177*f585d8a3SJacky Wang   @IntoSet
setOfStrFutureElement()178*f585d8a3SJacky Wang   static ListenableFuture<String> setOfStrFutureElement() {
179*f585d8a3SJacky Wang     return Futures.immediateFuture("set of str element");
180*f585d8a3SJacky Wang   }
181*f585d8a3SJacky Wang 
182*f585d8a3SJacky Wang   @Produces
183*f585d8a3SJacky Wang   @IntoSet
184*f585d8a3SJacky Wang   @SuppressWarnings("unused") // unthrown exception for test
setOfStrFutureElementThrowingException()185*f585d8a3SJacky Wang   static ListenableFuture<String> setOfStrFutureElementThrowingException() throws IOException {
186*f585d8a3SJacky Wang     return Futures.immediateFuture("set of str element throwing exception");
187*f585d8a3SJacky Wang   }
188*f585d8a3SJacky Wang 
189*f585d8a3SJacky Wang   @Produces
190*f585d8a3SJacky Wang   @IntoSet
setOfStrElementWithArg(@uppressWarnings"unused") int i)191*f585d8a3SJacky Wang   static String setOfStrElementWithArg(@SuppressWarnings("unused") int i) {
192*f585d8a3SJacky Wang     return "set of str element with arg";
193*f585d8a3SJacky Wang   }
194*f585d8a3SJacky Wang 
195*f585d8a3SJacky Wang   @Produces
196*f585d8a3SJacky Wang   @IntoSet
197*f585d8a3SJacky Wang   @SuppressWarnings("unused") // unthrown exception for test, unused parameter for test
setOfStrElementWithArgThrowingException(int i)198*f585d8a3SJacky Wang   static String setOfStrElementWithArgThrowingException(int i) throws IOException {
199*f585d8a3SJacky Wang     return "set of str element with arg throwing exception";
200*f585d8a3SJacky Wang   }
201*f585d8a3SJacky Wang 
202*f585d8a3SJacky Wang   @Produces
203*f585d8a3SJacky Wang   @IntoSet
setOfStrFutureElementWithArg(@uppressWarnings"unused") int i)204*f585d8a3SJacky Wang   static ListenableFuture<String> setOfStrFutureElementWithArg(@SuppressWarnings("unused") int i) {
205*f585d8a3SJacky Wang     return Futures.immediateFuture("set of str element with arg");
206*f585d8a3SJacky Wang   }
207*f585d8a3SJacky Wang 
208*f585d8a3SJacky Wang   @Produces
209*f585d8a3SJacky Wang   @IntoSet
210*f585d8a3SJacky Wang   @SuppressWarnings("unused") // unthrown exception for test, unused parameter for test
setOfStrFutureElementWithArgThrowingException(int i)211*f585d8a3SJacky Wang   static ListenableFuture<String> setOfStrFutureElementWithArgThrowingException(int i)
212*f585d8a3SJacky Wang       throws IOException {
213*f585d8a3SJacky Wang     return Futures.immediateFuture("set of str element with arg throwing exception");
214*f585d8a3SJacky Wang   }
215*f585d8a3SJacky Wang 
216*f585d8a3SJacky Wang   @Produces
217*f585d8a3SJacky Wang   @ElementsIntoSet
setOfStrValues()218*f585d8a3SJacky Wang   static Set<String> setOfStrValues() {
219*f585d8a3SJacky Wang     return ImmutableSet.of("set of str 1", "set of str 2");
220*f585d8a3SJacky Wang   }
221*f585d8a3SJacky Wang 
222*f585d8a3SJacky Wang   @Produces
223*f585d8a3SJacky Wang   @ElementsIntoSet
224*f585d8a3SJacky Wang   @SuppressWarnings("unused") // unthrown exception for test
setOfStrValuesThrowingException()225*f585d8a3SJacky Wang   static Set<String> setOfStrValuesThrowingException() throws IOException {
226*f585d8a3SJacky Wang     return ImmutableSet.of("set of str 1", "set of str 2 throwing exception");
227*f585d8a3SJacky Wang   }
228*f585d8a3SJacky Wang 
229*f585d8a3SJacky Wang   @Produces
230*f585d8a3SJacky Wang   @ElementsIntoSet
setOfStrFutureValues()231*f585d8a3SJacky Wang   static ListenableFuture<Set<String>> setOfStrFutureValues() {
232*f585d8a3SJacky Wang     return Futures.<Set<String>>immediateFuture(ImmutableSet.of("set of str 1", "set of str 2"));
233*f585d8a3SJacky Wang   }
234*f585d8a3SJacky Wang 
235*f585d8a3SJacky Wang   @Produces
236*f585d8a3SJacky Wang   @ElementsIntoSet
237*f585d8a3SJacky Wang   @SuppressWarnings("unused") // unthrown exception for test
setOfStrFutureValuesThrowingException()238*f585d8a3SJacky Wang   static ListenableFuture<Set<String>> setOfStrFutureValuesThrowingException() throws IOException {
239*f585d8a3SJacky Wang     return Futures.<Set<String>>immediateFuture(
240*f585d8a3SJacky Wang         ImmutableSet.of("set of str 1", "set of str 2 throwing exception"));
241*f585d8a3SJacky Wang   }
242*f585d8a3SJacky Wang 
243*f585d8a3SJacky Wang   @Produces
244*f585d8a3SJacky Wang   @ElementsIntoSet
setOfStrValuesWithArg(@uppressWarnings"unused") int i)245*f585d8a3SJacky Wang   static Set<String> setOfStrValuesWithArg(@SuppressWarnings("unused") int i) {
246*f585d8a3SJacky Wang     return ImmutableSet.of("set of str with arg 1", "set of str with arg 2");
247*f585d8a3SJacky Wang   }
248*f585d8a3SJacky Wang 
249*f585d8a3SJacky Wang   @Produces
250*f585d8a3SJacky Wang   @ElementsIntoSet
251*f585d8a3SJacky Wang   @SuppressWarnings("unused") // unthrown exception for test, unused parameter for test
setOfStrValuesWithArgThrowingException(int i)252*f585d8a3SJacky Wang   static Set<String> setOfStrValuesWithArgThrowingException(int i) throws IOException {
253*f585d8a3SJacky Wang     return ImmutableSet.of("set of str with arg 1", "set of str with arg 2 throwing exception");
254*f585d8a3SJacky Wang   }
255*f585d8a3SJacky Wang 
256*f585d8a3SJacky Wang   @Produces
257*f585d8a3SJacky Wang   @ElementsIntoSet
setOfStrFutureValuesWithArg( @uppressWarnings"unused") int i)258*f585d8a3SJacky Wang   static ListenableFuture<Set<String>> setOfStrFutureValuesWithArg(
259*f585d8a3SJacky Wang       @SuppressWarnings("unused") int i) {
260*f585d8a3SJacky Wang     return Futures.<Set<String>>immediateFuture(
261*f585d8a3SJacky Wang         ImmutableSet.of("set of str with arg 1", "set of str with arg 2"));
262*f585d8a3SJacky Wang   }
263*f585d8a3SJacky Wang 
264*f585d8a3SJacky Wang   @Produces
265*f585d8a3SJacky Wang   @ElementsIntoSet
266*f585d8a3SJacky Wang   @SuppressWarnings("unused") // unthrown exception for test, unused parameter for test
setOfStrFutureValuesWithArgThrowingException(int i)267*f585d8a3SJacky Wang   static ListenableFuture<Set<String>> setOfStrFutureValuesWithArgThrowingException(int i)
268*f585d8a3SJacky Wang       throws IOException {
269*f585d8a3SJacky Wang     return Futures.<Set<String>>immediateFuture(
270*f585d8a3SJacky Wang         ImmutableSet.of("set of str with arg 1", "set of str with arg 2 throwing exception"));
271*f585d8a3SJacky Wang   }
272*f585d8a3SJacky Wang 
273*f585d8a3SJacky Wang   /**
274*f585d8a3SJacky Wang    * A binding method that might result in a generated factory with conflicting field and parameter
275*f585d8a3SJacky Wang    * names.
276*f585d8a3SJacky Wang    */
277*f585d8a3SJacky Wang   @Produces
object(int foo, Provider<String> fooProvider)278*f585d8a3SJacky Wang   static Object object(int foo, Provider<String> fooProvider) {
279*f585d8a3SJacky Wang     return foo + fooProvider.get();
280*f585d8a3SJacky Wang   }
281*f585d8a3SJacky Wang }
282