Author: limpbizkit
Date: Sat Jun 27 15:22:54 2009
New Revision: 1039

Modified:
    trunk/src/com/google/inject/util/Modules.java
    trunk/test/com/google/inject/OverrideModuleTest.java

Log:
Fixing a TODO for modules.override() plus private modules


Modified: trunk/src/com/google/inject/util/Modules.java
==============================================================================
--- trunk/src/com/google/inject/util/Modules.java       (original)
+++ trunk/src/com/google/inject/util/Modules.java       Sat Jun 27 15:22:54 2009
@@ -142,7 +142,7 @@
            final List<Element> elements = Elements.getElements(baseModules);
            final List<Element> overrideElements =  
Elements.getElements(overrides);

-          final Set<Key> overriddenKeys = Sets.newHashSet();
+          final Set<Key<?>> overriddenKeys = Sets.newHashSet();
            final Set<Class<? extends Annotation>> overridesScopeAnnotations  
= Sets.newHashSet();

            // execute the overrides module, keeping track of which keys and  
scopes are bound
@@ -183,30 +183,35 @@
                return null;
              }

-            @Override public Void visit(PrivateElements privateElements) {
+            void rewrite(Binder binder, PrivateElements privateElements,  
Set<Key<?>> keysToSkip) {
                PrivateBinder privateBinder =  
binder.withSource(privateElements.getSource())
                    .newPrivateBinder();

                Set<Key<?>> skippedExposes = Sets.newHashSet();

                for (Key<?> key : privateElements.getExposedKeys()) {
-                if (overriddenKeys.remove(key)) {
+                if (keysToSkip.remove(key)) {
                    skippedExposes.add(key);
                  } else {
                     
privateBinder.withSource(privateElements.getExposedSource(key)).expose(key);
                  }
                }

-              // we're not skipping deep exposes, but that should be okay.  
If we ever need to, we
-              // have to search through this set of elements for  
PrivateElements, recursively
                for (Element element : privateElements.getElements()) {
                  if (element instanceof Binding
-                    && skippedExposes.contains(((Binding)  
element).getKey())) {
+                    && skippedExposes.remove(((Binding)  
element).getKey())) {
+                  continue;
+                }
+                if (element instanceof PrivateElements) {
+                  rewrite(privateBinder, (PrivateElements) element,  
skippedExposes);
                    continue;
                  }
                  element.applyTo(privateBinder);
                }
+            }

+            @Override public Void visit(PrivateElements privateElements) {
+              rewrite(binder, privateElements, overriddenKeys);
                return null;
              }


Modified: trunk/test/com/google/inject/OverrideModuleTest.java
==============================================================================
--- trunk/test/com/google/inject/OverrideModuleTest.java        (original)
+++ trunk/test/com/google/inject/OverrideModuleTest.java        Sat Jun 27  
15:22:54 2009
@@ -387,6 +387,59 @@
      assertEquals(5, reverse.getInstance(Integer.class).intValue());
    }

+  public void testOverrideDeepExpose() {
+    final AtomicReference<Provider<Character>> charAProvider
+        = new AtomicReference<Provider<Character>>();
+
+    Module exposes5 = new PrivateModule() {
+      protected void configure() {
+        install(new PrivateModule() {
+          protected void configure() {
+            bind(Integer.class).toInstance(5);
+            expose(Integer.class);
+            charAProvider.set(getProvider(Character.class));
+            bind(Character.class).toInstance('A');
+          }
+        });
+        expose(Integer.class);
+      }
+    };
+
+    Injector injector =  
Guice.createInjector(Modules.override(exposes5).with(EMPTY_MODULE));
+    assertEquals(5, injector.getInstance(Integer.class).intValue());
+    assertEquals('A', charAProvider.getAndSet(null).get().charValue());
+
+    injector =  
Guice.createInjector(Modules.override(EMPTY_MODULE).with(exposes5));
+    assertEquals(5, injector.getInstance(Integer.class).intValue());
+    assertEquals('A', charAProvider.getAndSet(null).get().charValue());
+
+    final AtomicReference<Provider<Character>> charBProvider
+        = new AtomicReference<Provider<Character>>();
+
+    Module binds15 = new AbstractModule() {
+      protected void configure() {
+        bind(Integer.class).toInstance(15);
+
+        install(new PrivateModule() {
+          protected void configure() {
+            charBProvider.set(getProvider(Character.class));
+            bind(Character.class).toInstance('B');
+          }
+        });
+      }
+    };
+
+    injector =  
Guice.createInjector(Modules.override(binds15).with(exposes5));
+    assertEquals(5, injector.getInstance(Integer.class).intValue());
+    assertEquals('A', charAProvider.getAndSet(null).get().charValue());
+    assertEquals('B', charBProvider.getAndSet(null).get().charValue());
+
+    injector =  
Guice.createInjector(Modules.override(exposes5).with(binds15));
+    assertEquals(15, injector.getInstance(Integer.class).intValue());
+    assertEquals('A', charAProvider.getAndSet(null).get().charValue());
+    assertEquals('B', charBProvider.getAndSet(null).get().charValue());
+  }
+
    @Retention(RUNTIME)
    @Target(TYPE)
    @ScopeAnnotation

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"google-guice-dev" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/google-guice-dev?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to