Tests and fix for issue 340.
git-svn-id: https://google-guice.googlecode.com/svn/trunk@936 d779f126-a31b-0410-b53b-1d3aecad763e
diff --git a/src/com/google/inject/BindingProcessor.java b/src/com/google/inject/BindingProcessor.java
index e3a6d38..0013d74 100644
--- a/src/com/google/inject/BindingProcessor.java
+++ b/src/com/google/inject/BindingProcessor.java
@@ -28,6 +28,7 @@
import com.google.inject.internal.LinkedProviderBindingImpl;
import com.google.inject.internal.Lists;
import com.google.inject.internal.ProviderInstanceBindingImpl;
+import com.google.inject.internal.ProviderMethod;
import com.google.inject.internal.Scoping;
import com.google.inject.internal.UntargettedBindingImpl;
import com.google.inject.spi.BindingTargetVisitor;
@@ -66,7 +67,12 @@
final Object source = command.getSource();
if (Void.class.equals(command.getKey().getRawType())) {
- errors.missingConstantValues();
+ if (command instanceof ProviderInstanceBinding
+ && ((ProviderInstanceBinding) command).getProviderInstance() instanceof ProviderMethod) {
+ errors.voidProviderMethod();
+ } else {
+ errors.missingConstantValues();
+ }
return true;
}
diff --git a/src/com/google/inject/internal/Errors.java b/src/com/google/inject/internal/Errors.java
index fb1a10d..e2ac524 100644
--- a/src/com/google/inject/internal/Errors.java
+++ b/src/com/google/inject/internal/Errors.java
@@ -218,6 +218,10 @@
annotationType, scope);
}
+ public Errors voidProviderMethod() {
+ return addMessage("Provider methods must return a value. Do not return void.");
+ }
+
public Errors missingConstantValues() {
return addMessage("Missing constant value. Please call to(...).");
}
diff --git a/test/com/google/inject/spi/ProviderMethodsTest.java b/test/com/google/inject/spi/ProviderMethodsTest.java
index 8d1da8f..81d6776 100644
--- a/test/com/google/inject/spi/ProviderMethodsTest.java
+++ b/test/com/google/inject/spi/ProviderMethodsTest.java
@@ -17,7 +17,7 @@
package com.google.inject.spi;
import com.google.inject.AbstractModule;
-import com.google.inject.Asserts;
+import static com.google.inject.Asserts.assertContains;
import com.google.inject.Binder;
import com.google.inject.BindingAnnotation;
import com.google.inject.CreationException;
@@ -190,7 +190,7 @@
});
fail();
} catch (CreationException expected) {
- Asserts.assertContains(expected.getMessage(),
+ assertContains(expected.getMessage(),
"more than one annotation annotated with @BindingAnnotation:", "Named", "Blue",
"at " + getClass().getName(), ".provideString(ProviderMethodsTest.java:");
}
@@ -353,4 +353,19 @@
assertEquals(ProviderMethod.class, provider.getClass());
assertEquals(methodsObject, ((ProviderMethod) provider).getInstance());
}
+
+ public void testVoidProviderMethods() {
+ try {
+ Guice.createInjector(new AbstractModule() {
+ protected void configure() {}
+
+ @Provides void provideFoo() {}
+ });
+ fail();
+ } catch (CreationException expected) {
+ assertContains(expected.getMessage(),
+ "1) Provider methods must return a value. Do not return void.",
+ getClass().getName(), ".provideFoo(ProviderMethodsTest.java:");
+ }
+ }
}
\ No newline at end of file