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
{