Fix a bug where array return types could not be used with SingleJsoImpl methods.

Reported by: pmuetschard
Patch by: bobv
Review by: jat, scottb


git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@5142 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/dev/core/src/com/google/gwt/dev/shell/CompilingClassLoader.java b/dev/core/src/com/google/gwt/dev/shell/CompilingClassLoader.java
index f2b240f..3b1e2a0 100644
--- a/dev/core/src/com/google/gwt/dev/shell/CompilingClassLoader.java
+++ b/dev/core/src/com/google/gwt/dev/shell/CompilingClassLoader.java
@@ -19,6 +19,7 @@
 import com.google.gwt.core.ext.TreeLogger;
 import com.google.gwt.core.ext.UnableToCompleteException;
 import com.google.gwt.core.ext.TreeLogger.Type;
+import com.google.gwt.core.ext.typeinfo.JArrayType;
 import com.google.gwt.core.ext.typeinfo.JClassType;
 import com.google.gwt.core.ext.typeinfo.JMethod;
 import com.google.gwt.core.ext.typeinfo.JParameter;
@@ -1001,12 +1002,16 @@
   }
 
   private String getBinaryOrPrimitiveName(JType type) {
+    JArrayType asArray = type.isArray();
     JClassType asClass = type.isClassOrInterface();
     JPrimitiveType asPrimitive = type.isPrimitive();
     if (asClass != null) {
       return getBinaryName(asClass);
     } else if (asPrimitive != null) {
       return asPrimitive.getQualifiedSourceName();
+    } else if (asArray != null) {
+      JType componentType = asArray.getComponentType();
+      return getBinaryOrPrimitiveName(componentType) + "[]";
     } else {
       throw new InternalCompilerException("Cannot create binary name for "
           + type.getQualifiedSourceName());
diff --git a/user/test/com/google/gwt/dev/jjs/test/SingleJsoImplTest.java b/user/test/com/google/gwt/dev/jjs/test/SingleJsoImplTest.java
index 7f7f58b..3926e4e 100644
--- a/user/test/com/google/gwt/dev/jjs/test/SingleJsoImplTest.java
+++ b/user/test/com/google/gwt/dev/jjs/test/SingleJsoImplTest.java
@@ -106,6 +106,56 @@
     }
   }
 
+  static class JavaUsesArrays implements UsesArrays {
+    public void acceptInt3Array(int[][][] arr) {
+      assertTrue(arr.length == 3);
+    }
+
+    public void acceptIntArray(int[] arr) {
+      assertTrue(arr.length == 1);
+    }
+
+    public void acceptObject3Array(Object[][][] arr) {
+      assertTrue(arr.length == 3);
+    }
+
+    public void acceptObjectArray(Object[] arr) {
+      assertTrue(arr.length == 1);
+    }
+
+    public void acceptString3Array(String[][][] arr) {
+      assertTrue(arr.length == 3);
+    }
+
+    public void acceptStringArray(String[] arr) {
+      assertTrue(arr.length == 1);
+    }
+
+    public int[][][] returnInt3Array() {
+      return new int[3][2][1];
+    }
+
+    public int[] returnIntArray() {
+      return new int[1];
+    }
+
+    public Object[][][] returnObject3Array() {
+      return new Object[3][2][1];
+    }
+
+    public Object[] returnObjectArray() {
+      return new Object[1];
+    }
+
+    public String[][][] returnString3Array() {
+      return new String[3][2][1];
+    }
+
+    public String[] returnStringArray() {
+      return new String[1];
+    }
+  }
+
   static class JsoAdder extends JavaScriptObject implements Adder {
     protected JsoAdder() {
     }
@@ -223,6 +273,60 @@
     }
   }
 
+  static final class JsoUsesArrays extends JavaScriptObject implements
+      UsesArrays {
+    protected JsoUsesArrays() {
+    }
+
+    public void acceptInt3Array(int[][][] arr) {
+      assertTrue(arr.length == 3);
+    }
+
+    public void acceptIntArray(int[] arr) {
+      assertTrue(arr.length == 1);
+    }
+
+    public void acceptObject3Array(Object[][][] arr) {
+      assertTrue(arr.length == 3);
+    }
+
+    public void acceptObjectArray(Object[] arr) {
+      assertTrue(arr.length == 1);
+    }
+
+    public void acceptString3Array(String[][][] arr) {
+      assertTrue(arr.length == 3);
+    }
+
+    public void acceptStringArray(String[] arr) {
+      assertTrue(arr.length == 1);
+    }
+
+    public int[][][] returnInt3Array() {
+      return new int[3][2][1];
+    }
+
+    public int[] returnIntArray() {
+      return new int[1];
+    }
+
+    public Object[][][] returnObject3Array() {
+      return new Object[3][2][1];
+    }
+
+    public Object[] returnObjectArray() {
+      return new Object[1];
+    }
+
+    public String[][][] returnString3Array() {
+      return new String[3][2][1];
+    }
+
+    public String[] returnStringArray() {
+      return new String[1];
+    }
+  }
+
   /**
    * Ensure that SingleJsoImpl interfaces can be extended and implemented by
    * regular Java types.
@@ -273,6 +377,35 @@
   interface Tag {
   }
 
+  /**
+   * Ensure that arrays are valid return and parameter types.
+   */
+  interface UsesArrays {
+    void acceptInt3Array(int[][][] arr);
+
+    void acceptIntArray(int[] arr);
+
+    void acceptObject3Array(Object[][][] arr);
+
+    void acceptObjectArray(Object[] arr);
+
+    void acceptString3Array(String[][][] arr);
+
+    void acceptStringArray(String[] arr);
+
+    int[][][] returnInt3Array();
+
+    int[] returnIntArray();
+
+    Object[][][] returnObject3Array();
+
+    Object[] returnObjectArray();
+
+    String[][][] returnString3Array();
+
+    String[] returnStringArray();
+  }
+
   private static native JsoAdder makeAdder(int offset) /*-{
     return {offset:offset};
   }-*/;
@@ -301,6 +434,24 @@
     assertEquals(5, i.get());
   }
 
+  public void testCallsWithArrays() {
+    UsesArrays a = JavaScriptObject.createObject().<JsoUsesArrays> cast();
+    a.acceptIntArray(a.returnIntArray());
+    a.acceptInt3Array(a.returnInt3Array());
+    a.acceptStringArray(a.returnStringArray());
+    a.acceptString3Array(a.returnString3Array());
+    a.acceptObjectArray(a.returnStringArray());
+    a.acceptObject3Array(a.returnString3Array());
+
+    a = new JavaUsesArrays();
+    a.acceptIntArray(a.returnIntArray());
+    a.acceptInt3Array(a.returnInt3Array());
+    a.acceptStringArray(a.returnStringArray());
+    a.acceptString3Array(a.returnString3Array());
+    a.acceptObjectArray(a.returnStringArray());
+    a.acceptObject3Array(a.returnString3Array());
+  }
+
   public void testDualCase() {
     // Direct dispatch
     {