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