Various fixes for deRPC.
- If an array type is artificially rescued, it should rescue its component type.
- Don't generate bad RPC proxy code if the legacy type-elision flag is set.
- Correctly handle CustomFieldSerializers that write null Strings.

Patch by: bobv
Review by: jgw (desk)

git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@6323 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/dev/core/src/com/google/gwt/dev/javac/ArtificialRescueChecker.java b/dev/core/src/com/google/gwt/dev/javac/ArtificialRescueChecker.java
index edaaae1..c1ffc49 100644
--- a/dev/core/src/com/google/gwt/dev/javac/ArtificialRescueChecker.java
+++ b/dev/core/src/com/google/gwt/dev/javac/ArtificialRescueChecker.java
@@ -103,6 +103,15 @@
         referencedTypes = Lists.add(referencedTypes, className);
       }
 
+      boolean isArray = false;
+      while (className.endsWith("[]")) {
+        className = className.substring(0, className.length() - 2);
+        if (collectTypes) {
+          referencedTypes = Lists.add(referencedTypes, className);
+        }
+        isArray = true;
+      }
+
       if (!reportErrors) {
         // Nothing else to do
         return;
@@ -110,11 +119,6 @@
 
       // Goal (2)
       // Strip off any array-like extensions and just find base type
-      boolean isArray = false;
-      while (className.endsWith("[]")) {
-        className = className.substring(0, className.length() - 2);
-        isArray = true;
-      }
 
       // Fix JSNI primitive type names to something JDT will understand
       if (isArray && className.length() == 1) {
diff --git a/user/src/com/google/gwt/rpc/rebind/RpcProxyCreator.java b/user/src/com/google/gwt/rpc/rebind/RpcProxyCreator.java
index 5d277be..65dd36d 100644
--- a/user/src/com/google/gwt/rpc/rebind/RpcProxyCreator.java
+++ b/user/src/com/google/gwt/rpc/rebind/RpcProxyCreator.java
@@ -113,6 +113,11 @@
   }
 
   @Override
+  protected void generateStreamWriterOverride(SourceWriter srcWriter) {
+    // Intentional no-op. Called if elideTypeNames is on, which is ignored
+  }
+
+  @Override
   protected void generateTypeHandlers(TreeLogger logger, GeneratorContext ctx,
       SerializableTypeOracle serializationSto,
       SerializableTypeOracle deserializationSto)
diff --git a/user/src/com/google/gwt/rpc/server/CommandServerSerializationStreamReader.java b/user/src/com/google/gwt/rpc/server/CommandServerSerializationStreamReader.java
index 231e0e0..30dc6e0 100644
--- a/user/src/com/google/gwt/rpc/server/CommandServerSerializationStreamReader.java
+++ b/user/src/com/google/gwt/rpc/server/CommandServerSerializationStreamReader.java
@@ -314,7 +314,7 @@
   }
 
   public String readString() throws SerializationException {
-    return readNextCommand(StringValueCommand.class).getValue();
+    return (String) readObject();
   }
 
   private <T extends ValueCommand> T readNextCommand(Class<T> clazz)