xref: /aosp_15_r20/external/dagger2/java/dagger/internal/DelegateFactory.java (revision f585d8a307d0621d6060bd7e80091fdcbf94fe27)
1 /*
2  * Copyright (C) 2014 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;
18 
19 import static dagger.internal.Preconditions.checkNotNull;
20 import static dagger.internal.Providers.asDaggerProvider;
21 
22 /**
23  * A DelegateFactory that is used to stitch Provider/Lazy indirection based dependency cycles.
24  *
25  * @since 2.0.1
26  */
27 public final class DelegateFactory<T> implements Factory<T> {
28   private Provider<T> delegate;
29 
30   @Override
get()31   public T get() {
32     if (delegate == null) {
33       throw new IllegalStateException();
34     }
35     return delegate.get();
36   }
37 
38   // TODO(ronshapiro): remove this once we can reasonably expect generated code is no longer using
39   // this method
40   @Deprecated
setDelegatedProvider(Provider<T> delegate)41   public void setDelegatedProvider(Provider<T> delegate) {
42     setDelegate(this, delegate);
43   }
44 
45   /**
46    * Legacy javax version of the method to support libraries compiled with an older version of
47    * Dagger. Do not use directly.
48    */
49   @Deprecated
setDelegatedProvider(javax.inject.Provider<T> delegate)50   public void setDelegatedProvider(javax.inject.Provider<T> delegate) {
51     setDelegatedProvider(asDaggerProvider(delegate));
52   }
53 
54   /**
55    * Sets {@code delegateFactory}'s delegate provider to {@code delegate}.
56    *
57    * <p>{@code delegateFactory} must be an instance of {@link DelegateFactory}, otherwise this
58    * method will throw a {@link ClassCastException}.
59    */
setDelegate(Provider<T> delegateFactory, Provider<T> delegate)60   public static <T> void setDelegate(Provider<T> delegateFactory, Provider<T> delegate) {
61     DelegateFactory<T> asDelegateFactory = (DelegateFactory<T>) delegateFactory;
62     setDelegateInternal(asDelegateFactory, delegate);
63   }
64 
65   /**
66    * Legacy javax version of the method to support libraries compiled with an older version of
67    * Dagger. Do not use directly.
68    */
69   @Deprecated
setDelegate( javax.inject.Provider<T> delegateFactory, javax.inject.Provider<T> delegate)70   public static <T> void setDelegate(
71       javax.inject.Provider<T> delegateFactory, javax.inject.Provider<T> delegate) {
72     DelegateFactory<T> asDelegateFactory = (DelegateFactory<T>) delegateFactory;
73     setDelegateInternal(asDelegateFactory, asDaggerProvider(delegate));
74   }
75 
setDelegateInternal( DelegateFactory<T> delegateFactory, Provider<T> delegate)76   private static <T> void setDelegateInternal(
77       DelegateFactory<T> delegateFactory, Provider<T> delegate) {
78     checkNotNull(delegate);
79     if (delegateFactory.delegate != null) {
80       throw new IllegalStateException();
81     }
82     delegateFactory.delegate = delegate;
83   }
84 
85   /**
86    * Returns the factory's delegate.
87    *
88    * @throws NullPointerException if the delegate has not been set
89    */
getDelegate()90   Provider<T> getDelegate() {
91     return checkNotNull(delegate);
92   }
93 }
94