diff options
author | Christian Edward Gruber <cgruber@google.com> | 2014-04-01 15:07:02 -0700 |
---|---|---|
committer | Christian Edward Gruber <cgruber@google.com> | 2014-04-01 15:36:38 -0700 |
commit | cade897b45ffe5d9d4e48ae7009cf74d8a91e335 (patch) | |
tree | 5290332fad16ebde9ec54d388207aac47a9bad6f /core/src/com/google/inject | |
parent | 4ab2a909972c14715e3adcbe9e9acd2c1c403935 (diff) | |
download | guice-cade897b45ffe5d9d4e48ae7009cf74d8a91e335.tar.gz |
Preparations for OptionalBinder. This fixes MapBinder's SPI so elements from different MapBinders are distinct, and also fixes ProviderLookup's Provider so it exposes its dependency, which allows MapBinder to properly find its dependencies.
-------------
Created by MOE: http://code.google.com/p/moe-java
MOE_MIGRATED_REVID=63811558
Diffstat (limited to 'core/src/com/google/inject')
-rw-r--r-- | core/src/com/google/inject/spi/ProviderLookup.java | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/core/src/com/google/inject/spi/ProviderLookup.java b/core/src/com/google/inject/spi/ProviderLookup.java index ee4337d5..b80932bc 100644 --- a/core/src/com/google/inject/spi/ProviderLookup.java +++ b/core/src/com/google/inject/spi/ProviderLookup.java @@ -21,10 +21,14 @@ import static com.google.common.base.Preconditions.checkState; import static com.google.inject.internal.RehashableKeys.Keys.needsRehashing; import static com.google.inject.internal.RehashableKeys.Keys.rehash; +import com.google.common.collect.ImmutableSet; import com.google.inject.Binder; import com.google.inject.Key; import com.google.inject.Provider; import com.google.inject.internal.RehashableKeys; +import com.google.inject.util.Types; + +import java.util.Set; /** * A lookup of the provider for a type. Lookups are created explicitly in a module using @@ -40,6 +44,7 @@ public final class ProviderLookup<T> implements Element { private final Object source; private Key<T> key; // effectively final, as it will not change once it escapes into user code private Provider<T> delegate; + private boolean rehashed = false; public ProviderLookup(Object source, Key<T> key) { this.source = checkNotNull(source, "source"); @@ -86,12 +91,25 @@ public final class ProviderLookup<T> implements Element { * IllegalStateException} if you try to use it beforehand. */ public Provider<T> getProvider() { - return new Provider<T>() { + return new ProviderWithDependencies<T>() { public T get() { checkState(delegate != null, "This Provider cannot be used until the Injector has been created."); return delegate.get(); } + + public Set<Dependency<?>> getDependencies() { + // If someone inside a Module is casting the Provider to HasDependencies + // in order to find its dependencies, we give them nothing (because we can't + // guarantee that the key is finalized yet). However, if someone acts on + // a ProviderLookup or ProviderInstanceBinding, it will properly find dependencies. + checkState(rehashed, "Dependencies can not be retrieved until the Injector has been " + + "created (or Elements.getElements finishes)"); + // We depend on Provider<T>, not T directly. This is an important distinction + // for dependency analysis tools that short-circuit on providers. + Key<?> providerKey = key.ofType(Types.providerOf(key.getTypeLiteral().getType())); + return ImmutableSet.<Dependency<?>>of(Dependency.get(providerKey)); + } @Override public String toString() { return "Provider<" + key.getTypeLiteral() + ">"; @@ -102,6 +120,7 @@ public final class ProviderLookup<T> implements Element { RehashableKeys getKeyRehasher() { return new RehashableKeys() { @Override public void rehashKeys() { + rehashed = true; if (needsRehashing(key)) { key = rehash(key); } |