diff options
author | Sam Berlin <sameb@google.com> | 2014-03-10 12:52:01 -0400 |
---|---|---|
committer | Sam Berlin <sameb@google.com> | 2014-03-10 14:01:56 -0400 |
commit | 29ce12be89584ca1ad671408ecbe0f6c343f9382 (patch) | |
tree | a5b1c54f4b11d738fe855d9ca6ad5913717b27a4 /core/src/com/google/inject | |
parent | 10f305d9d4328edd2819396dcbf039e86e8e24b1 (diff) | |
download | guice-29ce12be89584ca1ad671408ecbe0f6c343f9382.tar.gz |
Add an SPI for @Provides methods (using the extensions SPI) so that users can
do more analysis (with the enclosing instance, method, etc..).
Notably, this can let users write analysis that looks for @Provides methods
declared with @Nullable, and compare against injection points w/o @Nullable,
failing if so.
-------------
Created by MOE: http://code.google.com/p/moe-java
MOE_MIGRATED_REVID=62834918
Diffstat (limited to 'core/src/com/google/inject')
3 files changed, 66 insertions, 2 deletions
diff --git a/core/src/com/google/inject/internal/ProviderMethod.java b/core/src/com/google/inject/internal/ProviderMethod.java index 62214992..d8bc18b1 100644 --- a/core/src/com/google/inject/internal/ProviderMethod.java +++ b/core/src/com/google/inject/internal/ProviderMethod.java @@ -24,8 +24,13 @@ import com.google.inject.Key; import com.google.inject.PrivateBinder; import com.google.inject.Provider; import com.google.inject.internal.util.StackTraceElements; +import com.google.inject.spi.BindingTargetVisitor; import com.google.inject.spi.Dependency; -import com.google.inject.spi.ProviderWithDependencies; +import com.google.inject.spi.HasDependencies; +import com.google.inject.spi.ProviderInstanceBinding; +import com.google.inject.spi.ProviderWithExtensionVisitor; +import com.google.inject.spi.ProvidesMethodBinding; +import com.google.inject.spi.ProvidesMethodTargetVisitor; import java.lang.annotation.Annotation; import java.lang.reflect.InvocationTargetException; @@ -38,7 +43,8 @@ import java.util.Set; * * @author jessewilson@google.com (Jesse Wilson) */ -public class ProviderMethod<T> implements ProviderWithDependencies<T> { +public class ProviderMethod<T> implements ProviderWithExtensionVisitor<T>, HasDependencies, + ProvidesMethodBinding<T> { private final Key<T> key; private final Class<? extends Annotation> scopeAnnotation; private final Object instance; @@ -76,6 +82,10 @@ public class ProviderMethod<T> implements ProviderWithDependencies<T> { public Object getInstance() { return instance; } + + public Object getEnclosingInstance() { + return instance; + } public void configure(Binder binder) { binder = binder.withSource(method); @@ -114,6 +124,15 @@ public class ProviderMethod<T> implements ProviderWithDependencies<T> { public Set<Dependency<?>> getDependencies() { return dependencies; } + + @SuppressWarnings("unchecked") + public <B, V> V acceptExtensionVisitor(BindingTargetVisitor<B, V> visitor, + ProviderInstanceBinding<? extends B> binding) { + if (visitor instanceof ProvidesMethodTargetVisitor) { + return ((ProvidesMethodTargetVisitor<T, V>)visitor).visit(this); + } + return visitor.visit(binding); + } @Override public String toString() { return "@Provides " + StackTraceElements.forMember(method).toString(); diff --git a/core/src/com/google/inject/spi/ProvidesMethodBinding.java b/core/src/com/google/inject/spi/ProvidesMethodBinding.java new file mode 100644 index 00000000..f35d9a44 --- /dev/null +++ b/core/src/com/google/inject/spi/ProvidesMethodBinding.java @@ -0,0 +1,24 @@ +package com.google.inject.spi; + +import com.google.inject.Key; +import com.google.inject.Provides; + +import java.lang.reflect.Method; + +/** + * An {@literal @}{@link Provides} binding. + * + * @since 4.0 + * @author sameb@google.com (Sam Berlin) + */ +public interface ProvidesMethodBinding<T> extends HasDependencies { + + /** Returns the method this binding uses. */ + Method getMethod(); + + /** Returns the instance of the object the method is defined in. */ + Object getEnclosingInstance(); + + /** Returns the key of the binding. */ + Key<T> getKey(); +} diff --git a/core/src/com/google/inject/spi/ProvidesMethodTargetVisitor.java b/core/src/com/google/inject/spi/ProvidesMethodTargetVisitor.java new file mode 100644 index 00000000..d6c49734 --- /dev/null +++ b/core/src/com/google/inject/spi/ProvidesMethodTargetVisitor.java @@ -0,0 +1,21 @@ +package com.google.inject.spi; + +import com.google.inject.Provides; +import com.google.inject.spi.BindingTargetVisitor; + +/** + * A visitor for the {@literal @}{@link Provides} bindings. + * <p> + * If your {@link BindingTargetVisitor} implements this interface, bindings created by using + * {@code @Provides} will be visited through this interface. + * + * @since 4.0 + * @author sameb@google.com (Sam Berlin) + */ +public interface ProvidesMethodTargetVisitor<T, V> extends BindingTargetVisitor<T, V> { + + /** + * Visits an {@link ProvidesMethodBinding} created with an {@literal @}{@link Provides} method. + */ + V visit(ProvidesMethodBinding<? extends T> providesMethodBinding); +} |