Fixing the binding order problem. My strategy was to break binding creation into two steps:
 - creating the binding itself
 - "initializing" the binding, ie. validating the bindings dependencies

This CL is a start of something that we could go further on. In particular, we could change the @ProvidedBy etc. bindings to use a BindingImpl.initialize() method uniformly to separate creating the binding from building its dependencies.

git-svn-id: https://google-guice.googlecode.com/svn/trunk@473 d779f126-a31b-0410-b53b-1d3aecad763e
diff --git a/src/com/google/inject/BindCommandProcessor.java b/src/com/google/inject/BindCommandProcessor.java
index 1ab63c6..59db4b9 100644
--- a/src/com/google/inject/BindCommandProcessor.java
+++ b/src/com/google/inject/BindCommandProcessor.java
@@ -158,18 +158,25 @@
           return null;
         }
 
+        // This cast is safe after the preceeding check.
+        @SuppressWarnings("unchecked")
+        Class<T> clazz = (Class<T>) type;
+        final BindingImpl<T> binding;
+        try {
+          binding = injector.createUnitializedBinding(clazz, scope, source);
+          createBinding(source, shouldPreload, binding);
+        } catch (ResolveFailedException e) {
+          injector.errorHandler.handle(source, e.getMessage());
+          createBinding(source, shouldPreload, invalidBinding(injector, key, source));
+          return null;
+        }
+
         untargettedBindings.add(new Runnable() {
           public void run() {
-            // This cast is safe after the preceeding check.
-            @SuppressWarnings("unchecked")
-            Class<T> clazz = (Class<T>) type;
-
             try {
-              BindingImpl<T> binding = injector.createBindingFromType(clazz, scope, source);
-              createBinding(source, shouldPreload, binding);
+              injector.initializeBinding(binding);
             } catch (ResolveFailedException e) {
               injector.errorHandler.handle(source, e.getMessage());
-              createBinding(source, shouldPreload, invalidBinding(injector, key, source));
             }
           }
         });