Slight naming cleanup for Binding API, and a bit of Javadoc. More to follow . . .
git-svn-id: https://google-guice.googlecode.com/svn/trunk@569 d779f126-a31b-0410-b53b-1d3aecad763e
diff --git a/src/com/google/inject/BindElementProcessor.java b/src/com/google/inject/BindElementProcessor.java
index 489e987..eb66bdb 100644
--- a/src/com/google/inject/BindElementProcessor.java
+++ b/src/com/google/inject/BindElementProcessor.java
@@ -118,7 +118,7 @@
});
command.acceptTargetVisitor(new com.google.inject.Binding.TargetVisitor<T, Void>() {
- public Void visitToInstance(T instance) {
+ public Void visitInstance(T instance) {
if (instance == null) {
errors.cannotBindToNullInstance();
putBinding(invalidBinding(injector, key, source));
@@ -133,7 +133,7 @@
return null;
}
- public Void visitToProvider(Provider<? extends T> provider) {
+ public Void visitProvider(Provider<? extends T> provider) {
InternalFactoryToProviderAdapter<? extends T> factory
= new InternalFactoryToProviderAdapter<T>(provider, source);
memberInjector.requestInjection(provider, source);
@@ -144,7 +144,7 @@
return null;
}
- public Void visitToProviderKey(Key<? extends Provider<? extends T>> providerKey) {
+ public Void visitProviderKey(Key<? extends Provider<? extends T>> providerKey) {
final BoundProviderFactory<T> boundProviderFactory =
new BoundProviderFactory<T>(providerKey, source);
creationListeners.add(boundProviderFactory);
@@ -155,7 +155,7 @@
return null;
}
- public Void visitToKey(Key<? extends T> targetKey) {
+ public Void visitKey(Key<? extends T> targetKey) {
if (key.equals(targetKey)) {
errors.recursiveBinding();
}
@@ -258,7 +258,7 @@
@Override public Boolean visitBindConstant(BindConstant command) {
Object value = command.acceptTargetVisitor(new DefaultBindTargetVisitor<Object, Object>() {
- @Override public Object visitToInstance(Object instance) {
+ @Override public Object visitInstance(Object instance) {
return instance;
}
diff --git a/src/com/google/inject/Binding.java b/src/com/google/inject/Binding.java
index bb8b05f..d0a7438 100644
--- a/src/com/google/inject/Binding.java
+++ b/src/com/google/inject/Binding.java
@@ -21,9 +21,20 @@
import java.lang.reflect.Constructor;
/**
- * A mapping from a key (type and optional annotation) to a provider of
- * instances of that type. This interface is part of the {@link Injector}
- * introspection API and is intended primary for use by tools.
+ * A mapping from a key (type and optional annotation) to the strategy for getting instances of the
+ * type. This interface is part of the introspection API and is intended primarily for use by
+ * tools. Bindings exist on both {@link Module}s and on {@link Injector}s, and their behaviour is
+ * different for each.
+ *
+ * <p><strong>Module bindings</storng> are incomplete and cannot be used to provide instances. This
+ * is because the applicable scopes and interceptors may not be known until an injector is created.
+ * From a tool's perspective, module bindings are like the injector's source code. They can be
+ * inspected or rewritten, but this analysis must be done statically.
+ *
+ * <p><strong>Injector bindings</strong> are complete and valid and can be used to provide
+ * instances. From a tools' perspective, injector bindings are like reflection for an injector.
+ * They have full runtime information, including the complete graph of injections necessary to
+ * satisfy a binding.
*
* @author crazybob@google.com (Bob Lee)
* @author jessewilson@google.com (Jesse Wilson)
@@ -62,11 +73,20 @@
<V> V acceptScopingVisitor(ScopingVisitor<V> visitor);
+ /**
+ * A strategy to find an instance that satisfies an injection.
+ */
interface TargetVisitor<T, V> {
- V visitToInstance(T instance);
- V visitToProvider(Provider<? extends T> provider);
- V visitToProviderKey(Key<? extends Provider<? extends T>> providerKey);
- V visitToKey(Key<? extends T> key);
+
+ /**
+ * Visit a instance binding. The same instance is returned for every injection. This target is
+ * used in both module and injector bindings.
+ */
+ V visitInstance(T instance);
+
+ V visitProvider(Provider<? extends T> provider);
+ V visitProviderKey(Key<? extends Provider<? extends T>> providerKey);
+ V visitKey(Key<? extends T> key);
// module-only bindings
V visitUntargetted();
diff --git a/src/com/google/inject/CreationTimeMemberInjector.java b/src/com/google/inject/CreationTimeMemberInjector.java
index 6492167..c81b762 100644
--- a/src/com/google/inject/CreationTimeMemberInjector.java
+++ b/src/com/google/inject/CreationTimeMemberInjector.java
@@ -17,11 +17,11 @@
package com.google.inject;
import static com.google.common.base.Preconditions.checkNotNull;
-import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.inject.internal.Errors;
import com.google.inject.internal.ErrorsException;
import java.util.Map;
+import java.util.Map.Entry;
import java.util.concurrent.CountDownLatch;
/**
@@ -81,8 +81,11 @@
* arbitrary.
*/
void injectAll(final Errors errors) {
- // loop over a defensive copy since ensureInjected() mutates the set
- for (Map.Entry<Object, Object> entry : Lists.newArrayList(outstandingInjections.entrySet())) {
+ // loop over a defensive copy since ensureInjected() mutates the set. Unfortunately, that copy
+ // is made complicated by a bug in IBM's JDK, wherein entrySet().toArray(Object[]) doesn't work
+ for (Object entryObject : outstandingInjections.entrySet().toArray()) {
+ @SuppressWarnings("unchecked")
+ Entry<Object, Object> entry = (Entry<Object, Object>) entryObject;
try {
Object toInject = entry.getKey();
Object source = entry.getValue();
diff --git a/src/com/google/inject/InstanceBindingImpl.java b/src/com/google/inject/InstanceBindingImpl.java
index 9f61613..8c99cc1 100644
--- a/src/com/google/inject/InstanceBindingImpl.java
+++ b/src/com/google/inject/InstanceBindingImpl.java
@@ -47,7 +47,7 @@
}
public <V> V acceptTargetVisitor(TargetVisitor<? super T, V> visitor) {
- return visitor.visitToInstance(instance);
+ return visitor.visitInstance(instance);
}
public T getInstance() {
diff --git a/src/com/google/inject/LinkedBindingImpl.java b/src/com/google/inject/LinkedBindingImpl.java
index db273c6..d88e0e9 100644
--- a/src/com/google/inject/LinkedBindingImpl.java
+++ b/src/com/google/inject/LinkedBindingImpl.java
@@ -43,7 +43,7 @@
}
public <V> V acceptTargetVisitor(TargetVisitor<? super T, V> visitor) {
- return visitor.visitToKey(targetKey);
+ return visitor.visitKey(targetKey);
}
public OldVersionBinding<? extends T> getTargetBinding() {
diff --git a/src/com/google/inject/LinkedProviderBindingImpl.java b/src/com/google/inject/LinkedProviderBindingImpl.java
index e42eb45..7e198e4 100644
--- a/src/com/google/inject/LinkedProviderBindingImpl.java
+++ b/src/com/google/inject/LinkedProviderBindingImpl.java
@@ -47,7 +47,7 @@
}
public <V> V acceptTargetVisitor(TargetVisitor<? super T, V> visitor) {
- return visitor.visitToProviderKey(providerKey);
+ return visitor.visitProviderKey(providerKey);
}
@Override public String toString() {
diff --git a/src/com/google/inject/ProviderInstanceBindingImpl.java b/src/com/google/inject/ProviderInstanceBindingImpl.java
index a96980b..59490f2 100644
--- a/src/com/google/inject/ProviderInstanceBindingImpl.java
+++ b/src/com/google/inject/ProviderInstanceBindingImpl.java
@@ -45,7 +45,7 @@
}
public <V> V acceptTargetVisitor(TargetVisitor<? super T, V> visitor) {
- return visitor.visitToProvider(providerInstance);
+ return visitor.visitProvider(providerInstance);
}
public Provider<? extends T> getProviderInstance() {
diff --git a/src/com/google/inject/internal/ModuleBinding.java b/src/com/google/inject/internal/ModuleBinding.java
index 94f90ce..a955c2e 100644
--- a/src/com/google/inject/internal/ModuleBinding.java
+++ b/src/com/google/inject/internal/ModuleBinding.java
@@ -54,7 +54,7 @@
return true;
}
- @Override public Boolean visitToInstance(Object instance) {
+ @Override public Boolean visitInstance(Object instance) {
return false;
}
};
@@ -157,7 +157,7 @@
checkNotTargetted();
target = new Target<T>() {
public <V> V acceptTargetVisitor(TargetVisitor<? super T, V> visitor) {
- return visitor.visitToKey(targetKey);
+ return visitor.visitKey(targetKey);
}
@Override public String toString() {
return String.valueOf(targetKey);
@@ -170,7 +170,7 @@
checkNotTargetted();
target = new Target<T>() {
public <V> V acceptTargetVisitor(TargetVisitor<? super T, V> visitor) {
- return visitor.visitToInstance(instance);
+ return visitor.visitInstance(instance);
}
};
}
@@ -180,7 +180,7 @@
checkNotTargetted();
target = new Target<T>() {
public <V> V acceptTargetVisitor(TargetVisitor<? super T, V> visitor) {
- return visitor.visitToProvider(provider);
+ return visitor.visitProvider(provider);
}
};
return this;
@@ -197,7 +197,7 @@
checkNotTargetted();
target = new Target<T>() {
public <V> V acceptTargetVisitor(TargetVisitor<? super T, V> visitor) {
- return visitor.visitToProviderKey(providerKey);
+ return visitor.visitProviderKey(providerKey);
}
};
return this;
diff --git a/src/com/google/inject/spi/BindConstant.java b/src/com/google/inject/spi/BindConstant.java
index 3189dd8..0fd54c1 100644
--- a/src/com/google/inject/spi/BindConstant.java
+++ b/src/com/google/inject/spi/BindConstant.java
@@ -85,7 +85,7 @@
return type;
}
public <V> V acceptTargetVisitor(TargetVisitor<? super T, V> visitor) {
- return visitor.visitToInstance(value);
+ return visitor.visitInstance(value);
}
@Override public String toString() {
return String.valueOf(value);
diff --git a/src/com/google/inject/spi/DefaultBindTargetVisitor.java b/src/com/google/inject/spi/DefaultBindTargetVisitor.java
index 98046de..c0d0633 100644
--- a/src/com/google/inject/spi/DefaultBindTargetVisitor.java
+++ b/src/com/google/inject/spi/DefaultBindTargetVisitor.java
@@ -27,19 +27,19 @@
return null;
}
- public V visitToInstance(T instance) {
+ public V visitInstance(T instance) {
return visitTarget();
}
- public V visitToProvider(Provider<? extends T> provider) {
+ public V visitProvider(Provider<? extends T> provider) {
return visitTarget();
}
- public V visitToProviderKey(Key<? extends Provider<? extends T>> providerKey) {
+ public V visitProviderKey(Key<? extends Provider<? extends T>> providerKey) {
return visitTarget();
}
- public V visitToKey(Key<? extends T> key) {
+ public V visitKey(Key<? extends T> key) {
return visitTarget();
}
diff --git a/src/com/google/inject/spi/Elements.java b/src/com/google/inject/spi/Elements.java
index d1f6857..ce2f5fa 100644
--- a/src/com/google/inject/spi/Elements.java
+++ b/src/com/google/inject/spi/Elements.java
@@ -51,7 +51,7 @@
public final class Elements {
private static final TargetVisitor<Object, Object> GET_INSTANCE_VISITOR
= new DefaultBindTargetVisitor<Object, Object>() {
- @Override public Object visitToInstance(Object instance) {
+ @Override public Object visitInstance(Object instance) {
return instance;
}
diff --git a/src/com/google/inject/spi/ModuleWriter.java b/src/com/google/inject/spi/ModuleWriter.java
index 0664995..a85d106 100644
--- a/src/com/google/inject/spi/ModuleWriter.java
+++ b/src/com/google/inject/spi/ModuleWriter.java
@@ -171,20 +171,20 @@
public <T> ScopedBindingBuilder applyTarget(Binding<T> binding,
final LinkedBindingBuilder<T> linkedBindingBuilder) {
return binding.acceptTargetVisitor(new com.google.inject.Binding.TargetVisitor<T, ScopedBindingBuilder>() {
- public ScopedBindingBuilder visitToInstance(T instance) {
+ public ScopedBindingBuilder visitInstance(T instance) {
linkedBindingBuilder.toInstance(instance);
return null;
}
- public ScopedBindingBuilder visitToProvider(Provider<? extends T> provider) {
+ public ScopedBindingBuilder visitProvider(Provider<? extends T> provider) {
return linkedBindingBuilder.toProvider(provider);
}
- public ScopedBindingBuilder visitToProviderKey(Key<? extends Provider<? extends T>> providerKey) {
+ public ScopedBindingBuilder visitProviderKey(Key<? extends Provider<? extends T>> providerKey) {
return linkedBindingBuilder.toProvider(providerKey);
}
- public ScopedBindingBuilder visitToKey(Key<? extends T> key) {
+ public ScopedBindingBuilder visitKey(Key<? extends T> key) {
return linkedBindingBuilder.to(key);
}
diff --git a/src/com/google/inject/spi/oldversion/InstanceBinding.java b/src/com/google/inject/spi/oldversion/InstanceBinding.java
index 844303e..fa593d9 100644
--- a/src/com/google/inject/spi/oldversion/InstanceBinding.java
+++ b/src/com/google/inject/spi/oldversion/InstanceBinding.java
@@ -24,7 +24,7 @@
* <p>Example: {@code bind(Runnable.class).toInstance(new MyRunnable());}
*
* @deprecated replaced with {@link
- * com.google.inject.Binding.TargetVisitor#visitToInstance(Object)}
+ * com.google.inject.Binding.TargetVisitor#visitInstance(Object)}
*
* @author crazybob@google.com (Bob Lee)
*/
diff --git a/src/com/google/inject/spi/oldversion/LinkedBinding.java b/src/com/google/inject/spi/oldversion/LinkedBinding.java
index dfe5cce..552876b 100644
--- a/src/com/google/inject/spi/oldversion/LinkedBinding.java
+++ b/src/com/google/inject/spi/oldversion/LinkedBinding.java
@@ -22,7 +22,7 @@
* <p>Example: {@code bind(Collection.class).to(List.class);}
*
* @deprecated replaced with {@link
- * com.google.inject.Binding.TargetVisitor#visitToKey(com.google.inject.Key)}
+ * com.google.inject.Binding.TargetVisitor#visitKey(com.google.inject.Key)}
*
* @author crazybob@google.com (Bob Lee)
*/
diff --git a/src/com/google/inject/spi/oldversion/LinkedProviderBinding.java b/src/com/google/inject/spi/oldversion/LinkedProviderBinding.java
index 4bb8043..2ea8ee9 100644
--- a/src/com/google/inject/spi/oldversion/LinkedProviderBinding.java
+++ b/src/com/google/inject/spi/oldversion/LinkedProviderBinding.java
@@ -25,7 +25,7 @@
* <p>Example: {@code bind(Foo.class).toProvider(FooProvider.class);}
*
* @deprecated replaced with {@link
- * com.google.inject.Binding.TargetVisitor#visitToProviderKey(com.google.inject.Key)}
+ * com.google.inject.Binding.TargetVisitor#visitProviderKey(com.google.inject.Key)}
*
* @author crazybob@google.com (Bob Lee)
*/
diff --git a/src/com/google/inject/spi/oldversion/ProviderInstanceBinding.java b/src/com/google/inject/spi/oldversion/ProviderInstanceBinding.java
index ede4f43..7d8e139 100644
--- a/src/com/google/inject/spi/oldversion/ProviderInstanceBinding.java
+++ b/src/com/google/inject/spi/oldversion/ProviderInstanceBinding.java
@@ -25,7 +25,7 @@
* <p>Example: {@code bind(Foo.class).toProvider(new FooProvider());}
*
* @deprecated replaced with {@link
- * com.google.inject.Binding.TargetVisitor#visitToProvider(com.google.inject.Provider)}
+ * com.google.inject.Binding.TargetVisitor#visitProvider(com.google.inject.Provider)}
*
* @author crazybob@google.com (Bob Lee)
*/
diff --git a/test/com/google/inject/BinderTest.java b/test/com/google/inject/BinderTest.java
index 6f96ae0..5b3d8bb 100644
--- a/test/com/google/inject/BinderTest.java
+++ b/test/com/google/inject/BinderTest.java
@@ -35,7 +35,10 @@
* @author crazybob@google.com (Bob Lee)
*/
public class BinderTest extends TestCase {
-
+ private static final Boolean CONSTANT = false;
+ CONSTANT.toString()
+public static final Date PROMOTION_END_DATE = new Date(2008, 12, 31);
+
private ParameterizedType parameterizedWithVariable;
private ParameterizedType parameterizedWithWildcard;
private TypeVariable typeVariable;
diff --git a/test/com/google/inject/spi/ElementsTest.java b/test/com/google/inject/spi/ElementsTest.java
index db5b34d..ebf713b 100644
--- a/test/com/google/inject/spi/ElementsTest.java
+++ b/test/com/google/inject/spi/ElementsTest.java
@@ -351,7 +351,7 @@
@Override public <T> Void visitBinding(Binding<T> command) {
assertEquals(Key.get(String.class), command.getKey());
command.acceptTargetVisitor(new FailingTargetVisitor<T>() {
- public Void visitToProvider(Provider<? extends T> provider) {
+ public Void visitProvider(Provider<? extends T> provider) {
assertSame(aProvider, provider);
return null;
}
@@ -364,7 +364,7 @@
@Override public <T> Void visitBinding(Binding<T> command) {
assertEquals(Key.get(List.class), command.getKey());
command.acceptTargetVisitor(new FailingTargetVisitor<T>() {
- public Void visitToProviderKey(Key<? extends Provider<? extends T>> providerKey) {
+ public Void visitProviderKey(Key<? extends Provider<? extends T>> providerKey) {
assertEquals(Key.get(ListProvider.class), providerKey);
return null;
}
@@ -377,7 +377,7 @@
@Override public <T> Void visitBinding(Binding<T> command) {
assertEquals(Key.get(Collection.class), command.getKey());
command.acceptTargetVisitor(new FailingTargetVisitor<T>() {
- public Void visitToProviderKey(Key<? extends Provider<? extends T>> providerKey) {
+ public Void visitProviderKey(Key<? extends Provider<? extends T>> providerKey) {
assertEquals(Key.get(ListProvider.class), providerKey);
return null;
}
@@ -402,7 +402,7 @@
@Override public <T> Void visitBinding(Binding<T> command) {
assertEquals(Key.get(List.class), command.getKey());
command.acceptTargetVisitor(new FailingTargetVisitor<T>() {
- public Void visitToKey(Key<? extends T> key) {
+ public Void visitKey(Key<? extends T> key) {
assertEquals(Key.get(ArrayList.class), key);
return null;
}
@@ -415,7 +415,7 @@
@Override public <T> Void visitBinding(Binding<T> command) {
assertEquals(Key.get(Map.class), command.getKey());
command.acceptTargetVisitor(new FailingTargetVisitor<T>() {
- public Void visitToKey(Key<? extends T> key) {
+ public Void visitKey(Key<? extends T> key) {
assertEquals(Key.get(new TypeLiteral<HashMap<Integer, String>>() {}), key);
return null;
}
@@ -428,7 +428,7 @@
@Override public <T> Void visitBinding(Binding<T> command) {
assertEquals(Key.get(Set.class), command.getKey());
command.acceptTargetVisitor(new FailingTargetVisitor<T>() {
- public Void visitToKey(Key<? extends T> key) {
+ public Void visitKey(Key<? extends T> key) {
assertEquals(Key.get(TreeSet.class, SampleAnnotation.class), key);
return null;
}
diff --git a/test/com/google/inject/spi/SpiBindingsTest.java b/test/com/google/inject/spi/SpiBindingsTest.java
index 2349fb8..83d95e5 100644
--- a/test/com/google/inject/spi/SpiBindingsTest.java
+++ b/test/com/google/inject/spi/SpiBindingsTest.java
@@ -76,7 +76,7 @@
assertContains(command.getSource().toString(), "SpiBindingsTest.java");
assertEquals(Key.get(String.class), command.getKey());
command.acceptTargetVisitor(new FailingTargetVisitor<T>() {
- @Override public Void visitToInstance(T instance) {
+ @Override public Void visitInstance(T instance) {
assertEquals("A", instance);
return null;
}
@@ -102,7 +102,7 @@
assertContains(command.getSource().toString(), "SpiBindingsTest.java");
assertEquals(Key.get(String.class), command.getKey());
command.acceptTargetVisitor(new FailingTargetVisitor<T>() {
- @Override public Void visitToProvider(Provider<? extends T> provider) {
+ @Override public Void visitProvider(Provider<? extends T> provider) {
assertSame(stringProvider, provider);
return null;
}
@@ -126,7 +126,7 @@
assertContains(command.getSource().toString(), "SpiBindingsTest.java");
assertEquals(Key.get(String.class), command.getKey());
command.acceptTargetVisitor(new FailingTargetVisitor<T>() {
- @Override public Void visitToProviderKey(Key<? extends Provider<? extends T>> key) {
+ @Override public Void visitProviderKey(Key<? extends Provider<? extends T>> key) {
assertEquals(Key.get(StringProvider.class), key);
return null;
}
@@ -154,7 +154,7 @@
assertContains(command.getSource().toString(), "SpiBindingsTest.java");
assertEquals(aKey, command.getKey());
command.acceptTargetVisitor(new FailingTargetVisitor<T>() {
- @Override public Void visitToKey(Key<? extends T> key) {
+ @Override public Void visitKey(Key<? extends T> key) {
assertEquals(bKey, key);
return null;
}