blob: e8c3ca66f3cfb5191df67c64e14ec2a481366649 [file] [log] [blame]
/*
* Copyright (C) 2016 The Dagger Authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package dagger.functional.binds;
import dagger.Binds;
import dagger.Module;
import dagger.Provides;
import dagger.Reusable;
import dagger.functional.NeedsFactory;
import dagger.functional.SomeQualifier;
import dagger.multibindings.ElementsIntoSet;
import dagger.multibindings.IntKey;
import dagger.multibindings.IntoMap;
import dagger.multibindings.IntoSet;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;
import javax.inject.Named;
import javax.inject.Singleton;
@Module(includes = InterfaceModule.class)
abstract class SimpleBindingModule {
// Regression test for b/161853413 that binds an implementation that extends a generated class
// that is processed in the same build unit as the @Binds method.
@Binds
abstract NeedsFactory.SomethingFactory bindFooFactory(NeedsFactory.SomethingFactoryImpl impl);
@Binds
abstract Object bindObject(FooOfStrings impl);
@Binds
@Reusable
@SomeQualifier
abstract Object bindReusableObject(FooOfStrings impl);
@Binds
abstract Foo<String> bindFooOfStrings(FooOfStrings impl);
@Binds
abstract Foo<? extends Number> bindFooOfNumbers(Foo<Integer> fooOfIntegers);
@Binds
@Singleton
@SomeQualifier
abstract Foo<String> bindQualifiedFooOfStrings(FooOfStrings impl);
@Provides
static Foo<Integer> provideFooOfIntegers() {
return new Foo<Integer>() {};
}
@Provides
static Foo<Double> provideFooOfDoubles() {
return new Foo<Double>() {};
}
@Binds
@IntoSet
abstract Foo<? extends Number> bindFooOfIntegersIntoSet(Foo<Integer> fooOfIntegers);
@Binds
@IntoSet
abstract Foo<? extends Number> bindFooExtendsNumberIntoSet(Foo<Double> fooOfDoubles);
@Binds
@ElementsIntoSet
abstract Set<Object> bindSetOfFooNumbersToObjects(Set<Foo<? extends Number>> setOfFooNumbers);
@Binds
@IntoSet
abstract Object bindFooOfStringsIntoSetOfObjects(FooOfStrings impl);
@Provides
static HashSet<String> provideStringHashSet() {
return new HashSet<>(Arrays.asList("hash-string1", "hash-string2"));
}
@Provides
static TreeSet<CharSequence> provideCharSequenceTreeSet() {
return new TreeSet<CharSequence>(Arrays.asList("tree-charSequence1", "tree-charSequence2"));
}
@Provides
static Collection<CharSequence> provideCharSequenceCollection() {
return Arrays.<CharSequence>asList("list-charSequence");
}
@Binds
@ElementsIntoSet
abstract Set<CharSequence> bindHashSetOfStrings(HashSet<String> set);
@Binds
@ElementsIntoSet
abstract Set<CharSequence> bindTreeSetOfCharSequences(TreeSet<CharSequence> set);
@Binds
@ElementsIntoSet
abstract Set<CharSequence> bindCollectionOfCharSequences(Collection<CharSequence> collection);
@Binds
@IntoMap
@IntKey(123)
abstract Object bind123ForMap(@Named("For-123") String string);
@Binds
@IntoMap
@IntKey(456)
abstract Object bind456ForMap(@Named("For-456") String string);
@Provides
@IntoMap
@IntKey(789)
static Object provide789ForMap() {
return "789-string";
}
@Binds
@SomeQualifier
abstract int primitiveToPrimitive(int intValue);
@Binds
@IntoSet
abstract int intValueIntoSet(int intValue);
@Binds
@IntoMap
@IntKey(10)
abstract int intValueIntoMap(int intValue);
@Provides
static int intValue() {
return 100;
}
@Binds
@IntoMap
@IntKey(123)
@SomeQualifier
abstract Object bindFooOfStringsIntoQualifiedMap(FooOfStrings fooOfStrings);
@Provides
@Named("For-123")
static String provide123String() {
return "123-string";
}
@Provides
@Named("For-456")
static String provide456String() {
return "456-string";
}
}