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