Fixes several compiler problems related to varargs.

1) The original ICE would occur when not specifying any varargs at all to a vararg function.  The problem was trying to get source info from a non-existent parameter.  I fixed this, however...

2) Not specifying any params to a method with a single vararg would fail in a different way, because JDT would give us a null array, causing us to early out and not run the varargs synthesis.  I fixed this by making fixing up the array to a length 0 and running the rest of the function.  However...

3) This caused us to die processing a call to the implicit super constructor in the Enum class, which takes a String and int for name and ordinal.  The synthetic args for these methods are added elsewhere and don't exist in JDT.  I special-cased this special case with an early return and assertion. 

Review by: bobv


git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@1694 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaAST.java b/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaAST.java
index 1343814..5e742ed 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaAST.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaAST.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2007 Google Inc.
+ * Copyright 2008 Google Inc.
  * 
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
@@ -2000,45 +2000,53 @@
 
     private void addCallArgs(Expression[] args, JMethodCall call,
         MethodBinding binding) {
-      if (args != null) {
-        TypeBinding[] params = binding.parameters;
-        int n = params.length;
+      if (args == null) {
+        args = new Expression[0];
+      }
 
-        if (binding.isVarargs()) {
-          // Do everything but the last arg.
-          --n;
-        }
+      TypeBinding[] params = binding.parameters;
+      int n = params.length;
 
-        for (int i = 0; i < n; ++i) {
-          call.getArgs().add(dispProcessExpression(args[i]));
-        }
+      if (binding.isVarargs()) {
+        // Do everything but the last arg.
+        --n;
+      }
 
-        if (binding.isVarargs()) {
-          // Handle the last arg.
-          JArrayType type = (JArrayType) typeMap.get(params[n]);
+      if (args.length < n) {
+        // Hackish, the super call to Enum() won't have enough parameters.
+        assert (call.getTarget().getName().equals("Enum"));
+        return;
+      }
 
-          // See if there is only one arg and it's an array of the correct dims.
-          if (args.length == n + 1) {
-            JType lastArgType = (JType) typeMap.get(args[n].resolvedType);
-            if (lastArgType instanceof JArrayType) {
-              JArrayType lastArgArrayType = (JArrayType) lastArgType;
-              if (lastArgArrayType.getDims() == type.getDims()) {
-                // Looks like it's already an array.
-                call.getArgs().add(dispProcessExpression(args[n]));
-                return;
-              }
+      ArrayList<JExpression> callArgs = call.getArgs();
+
+      for (int i = 0; i < n; ++i) {
+        callArgs.add(dispProcessExpression(args[i]));
+      }
+
+      if (binding.isVarargs()) {
+        // Handle the last arg.
+        JArrayType type = (JArrayType) typeMap.get(params[n]);
+
+        // See if there is only one arg and it's an array of the correct dims.
+        if (args.length == n + 1) {
+          JType lastArgType = (JType) typeMap.get(args[n].resolvedType);
+          if (lastArgType instanceof JArrayType) {
+            JArrayType lastArgArrayType = (JArrayType) lastArgType;
+            if (lastArgArrayType.getDims() == type.getDims()) {
+              // Looks like it's already an array.
+              callArgs.add(dispProcessExpression(args[n]));
+              return;
             }
           }
-
-          // Fall through: must synthesize a new array allocation.
-          SourceInfo info = makeSourceInfo(args[n]);
-          JNewArray newArray = new JNewArray(program, info, type);
-          newArray.initializers = new ArrayList<JExpression>();
-          for (int i = n; i < args.length; ++i) {
-            newArray.initializers.add(dispProcessExpression(args[i]));
-          }
-          call.getArgs().add(newArray);
         }
+
+        JNewArray newArray = new JNewArray(program, call.getSourceInfo(), type);
+        newArray.initializers = new ArrayList<JExpression>();
+        for (int i = n; i < args.length; ++i) {
+          newArray.initializers.add(dispProcessExpression(args[i]));
+        }
+        callArgs.add(newArray);
       }
     }
 
diff --git a/user/test/com/google/gwt/dev/jjs/test/VarargsTest.java b/user/test/com/google/gwt/dev/jjs/test/VarargsTest.java
index da4d1ae..b824191 100644
--- a/user/test/com/google/gwt/dev/jjs/test/VarargsTest.java
+++ b/user/test/com/google/gwt/dev/jjs/test/VarargsTest.java
@@ -1,12 +1,12 @@
 /*
- * Copyright 2007 Google Inc.
- *
+ * Copyright 2008 Google Inc.
+ * 
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- *
+ * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -21,7 +21,6 @@
 
 /**
  * Tests the new JDK 1.5 varargs functionality.
- *
  */
 public class VarargsTest extends GWTTestCase {
 
@@ -30,17 +29,25 @@
   }
 
   public void testVararg() {
-    String[] strings = new String[] { "1", "2", "3" };
-    String[] results = vararg( "1", "2", "3" );
-    assertTrue(Arrays.equals(results, strings));
+    String[] expected = new String[] {"1", "2", "3"};
+    String[] actual = vararg("1", "2", "3");
+    assertTrue(Arrays.equals(expected, actual));
+
+    expected = new String[] {};
+    actual = vararg();
+    assertTrue(Arrays.equals(expected, actual));
   }
 
   public void testVarargBoxing() {
-    int[] ints = new int[] { 1, 2, 3 };
-    int[] results = varargUnboxed( 1, 2, 3 );
-    assertTrue(Arrays.equals(results, ints));
-    int[] results2 = varargUnboxed( new Integer(1), 2, new Integer(3) );
-    assertTrue(Arrays.equals(ints, results2));
+    int[] expected = new int[] {1, 2, 3};
+    int[] actual = varargUnboxed(1, 2, 3);
+    assertTrue(Arrays.equals(expected, actual));
+    actual = varargUnboxed(new Integer(1), 2, new Integer(3));
+    assertTrue(Arrays.equals(expected, actual));
+
+    expected = new int[] {};
+    actual = varargUnboxed();
+    assertTrue(Arrays.equals(expected, actual));
   }
 
   private String[] vararg(String... args) {