Support anonymous enum types in AutoBean ValueCodex.
Issue 6504.
http://gwt-code-reviews.appspot.com/1467802/
Patch by: t.broyer
Review by: bobv


git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@10359 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/web/bindery/autobean/shared/ValueCodex.java b/user/src/com/google/web/bindery/autobean/shared/ValueCodex.java
index 4bcb304..a08a57d 100644
--- a/user/src/com/google/web/bindery/autobean/shared/ValueCodex.java
+++ b/user/src/com/google/web/bindery/autobean/shared/ValueCodex.java
@@ -124,6 +124,11 @@
     },
     ENUM(Enum.class) {
       @Override
+      public boolean canUpcast(Object value) {
+        return value instanceof Enum;
+      }
+
+      @Override
       public Enum<?> decode(Class<?> clazz, Splittable value) {
         return (Enum<?>) clazz.getEnumConstants()[(int) value.asNumber()];
       }
@@ -352,7 +357,7 @@
    * May return <code>null</code>.
    */
   private static <T> Type findType(Class<T> clazz) {
-    if (clazz.isEnum()) {
+    if (clazz.isEnum() || (clazz.getSuperclass() != null && clazz.getSuperclass().isEnum())) {
       return Type.ENUM;
     }
     return TYPES_BY_CLASS.get(clazz);
diff --git a/user/test/com/google/web/bindery/autobean/shared/AutoBeanCodexTest.java b/user/test/com/google/web/bindery/autobean/shared/AutoBeanCodexTest.java
index 13f69b3..bc10735 100644
--- a/user/test/com/google/web/bindery/autobean/shared/AutoBeanCodexTest.java
+++ b/user/test/com/google/web/bindery/autobean/shared/AutoBeanCodexTest.java
@@ -141,7 +141,17 @@
   }
 
   enum MyEnum {
-    FOO, BAR,
+    FOO,
+    /**
+     * Contains a method that cannot even be called, but is enough to make
+     * MyEnum.BAR.getClass().isEnum()==false, because BAR's class is now an
+     * anonymous subclass of MyEnum.
+     */
+    BAR {
+      @SuppressWarnings("unused")
+      private void dummy() {
+      }
+    },
     // The eclipse formatter wants to put this annotation inline
     @PropertyName("quux")
     BAZ;
diff --git a/user/test/com/google/web/bindery/requestfactory/shared/SimpleEnum.java b/user/test/com/google/web/bindery/requestfactory/shared/SimpleEnum.java
index b338e5f..cfbc18f 100644
--- a/user/test/com/google/web/bindery/requestfactory/shared/SimpleEnum.java
+++ b/user/test/com/google/web/bindery/requestfactory/shared/SimpleEnum.java
@@ -19,5 +19,15 @@
  * Test enum class.
  */
 public enum SimpleEnum {
-  FOO, BAR
+  FOO,
+  /**
+   * Contains a method that cannot even be called, but is enough to make
+   * SimpleEnum.BAR.getClass().isEnum()==false, because BAR's class is now an
+   * anonymous subclass of MyEnum.
+   */
+  BAR {
+    @SuppressWarnings("unused")
+    private void dummy() {
+    }
+  }
 }