Add equals/hashCode to Providers.guicify(...) results.
-------------
Created by MOE: http://code.google.com/p/moe-java
MOE_MIGRATED_REVID=65072672
diff --git a/core/src/com/google/inject/util/Providers.java b/core/src/com/google/inject/util/Providers.java
index e191b01..c18d351 100644
--- a/core/src/com/google/inject/util/Providers.java
+++ b/core/src/com/google/inject/util/Providers.java
@@ -97,40 +97,60 @@
     Set<InjectionPoint> injectionPoints =
         InjectionPoint.forInstanceMethodsAndFields(provider.getClass());
     if(injectionPoints.isEmpty()) {
-      return new Provider<T>() {
-        public T get() {
-          return delegate.get();
-        }
-    
-        @Override public String toString() {
-          return "guicified(" + delegate + ")";
-        }
-      };
+      return new GuicifiedProvider<T>(delegate);
     } else {
       Set<Dependency<?>> mutableDeps = Sets.newHashSet();
       for(InjectionPoint ip : injectionPoints) {
         mutableDeps.addAll(ip.getDependencies());
       }
       final Set<Dependency<?>> dependencies = ImmutableSet.copyOf(mutableDeps);
-      return new ProviderWithDependencies<T>() {
-        @SuppressWarnings("unused")
-        @Inject
-        void initialize(Injector injector) {
-          injector.injectMembers(delegate);
-        }
-        
-        public Set<Dependency<?>> getDependencies() {
-          return dependencies;
-        }
-        
-        public T get() {
-          return delegate.get();
-        }
-    
-        @Override public String toString() {
-          return "guicified(" + delegate + ")";
-        }
-      };
+      return new GuicifiedProviderWithDependencies<T>(dependencies, delegate);
+    }
+  }
+
+  private static class GuicifiedProvider<T> implements Provider<T> {
+    protected final javax.inject.Provider<T> delegate;
+
+    private GuicifiedProvider(javax.inject.Provider<T> delegate) {
+      this.delegate = delegate;
+    }
+
+    public T get() {
+      return delegate.get();
+    }
+
+    @Override public String toString() {
+      return "guicified(" + delegate + ")";
+    }
+
+    @Override public boolean equals(Object obj) {
+      return (obj instanceof GuicifiedProvider)
+          && Objects.equal(delegate, ((GuicifiedProvider<?>) obj).delegate);
+    }
+
+    @Override public int hashCode() {
+      return Objects.hashCode(delegate);
+    }
+  }
+
+  private static final class GuicifiedProviderWithDependencies<T>
+      extends GuicifiedProvider<T> implements ProviderWithDependencies<T> {
+    private final Set<Dependency<?>> dependencies;
+
+    private GuicifiedProviderWithDependencies(Set<Dependency<?>> dependencies,
+        javax.inject.Provider<T> delegate) {
+      super(delegate);
+      this.dependencies = dependencies;
+    }
+
+    @SuppressWarnings("unused")
+    @Inject
+    void initialize(Injector injector) {
+      injector.injectMembers(delegate);
+    }
+
+    public Set<Dependency<?>> getDependencies() {
+      return dependencies;
     }
   }
 }
diff --git a/core/test/com/google/inject/util/ProvidersTest.java b/core/test/com/google/inject/util/ProvidersTest.java
index d03b5bc..e442c40 100644
--- a/core/test/com/google/inject/util/ProvidersTest.java
+++ b/core/test/com/google/inject/util/ProvidersTest.java
@@ -16,11 +16,14 @@
 
 package com.google.inject.util;
 
+import com.google.common.base.Objects;
 import com.google.common.testing.EqualsTester;
 import com.google.inject.Provider;
 
 import junit.framework.TestCase;
 
+import javax.inject.Inject;
+
 /**
  * Unit tests for {@link Providers}.
  *
@@ -50,4 +53,58 @@
             Providers.of("Hello"))
         .testEquals();
   }
+  
+  public void testGuicifyEquality() {
+    new EqualsTester()
+        .addEqualityGroup(
+            Providers.guicify(new JavaxProvider(10)),
+            Providers.guicify(new JavaxProvider(10)))
+        .addEqualityGroup(
+            Providers.guicify(new JavaxProvider(11)),
+            Providers.guicify(new JavaxProvider(11)))
+        .addEqualityGroup(
+            Providers.guicify(new JavaxProviderWithDependencies()),
+            Providers.guicify(new JavaxProviderWithDependencies()))
+        .testEquals();
+  }
+  
+  private static class JavaxProvider implements javax.inject.Provider<Integer> {
+    private final int value;
+
+    public JavaxProvider(int value) {
+      this.value = value;
+    }
+    
+    public Integer get() {
+      return value;
+    }
+
+    @Override public int hashCode() {
+      return Objects.hashCode(value);
+    }
+
+    @Override public boolean equals(Object obj) {
+      return (obj instanceof JavaxProvider) && (value == ((JavaxProvider) obj).value);
+    }
+  }
+  
+  private static class JavaxProviderWithDependencies implements javax.inject.Provider<Integer> {
+    private int value;
+    
+    @Inject void setValue(int value) {
+      this.value = value;
+    }
+    
+    public Integer get() {
+      return value;
+    }
+
+    @Override public int hashCode() {
+      return 42;
+    }
+
+    @Override public boolean equals(Object obj) {
+      return (obj instanceof JavaxProviderWithDependencies);
+    }
+  }
 }