aboutsummaryrefslogtreecommitdiff
path: root/core/src/com/google/inject
diff options
context:
space:
mode:
authorSam Berlin <sameb@google.com>2014-03-10 12:52:01 -0400
committerSam Berlin <sameb@google.com>2014-03-10 14:01:56 -0400
commit29ce12be89584ca1ad671408ecbe0f6c343f9382 (patch)
treea5b1c54f4b11d738fe855d9ca6ad5913717b27a4 /core/src/com/google/inject
parent10f305d9d4328edd2819396dcbf039e86e8e24b1 (diff)
downloadguice-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')
-rw-r--r--core/src/com/google/inject/internal/ProviderMethod.java23
-rw-r--r--core/src/com/google/inject/spi/ProvidesMethodBinding.java24
-rw-r--r--core/src/com/google/inject/spi/ProvidesMethodTargetVisitor.java21
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);
+}