Fix enum ordinalization black-listing for upcasts in new array initializers

Review at http://gwt-code-reviews.appspot.com/1449812


git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@10280 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/ImplicitUpcastAnalyzer.java b/dev/core/src/com/google/gwt/dev/jjs/impl/ImplicitUpcastAnalyzer.java
index 5a1b0fa..d02a81e 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/ImplicitUpcastAnalyzer.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/ImplicitUpcastAnalyzer.java
@@ -25,6 +25,7 @@
 import com.google.gwt.dev.jjs.ast.JField;
 import com.google.gwt.dev.jjs.ast.JMethod;
 import com.google.gwt.dev.jjs.ast.JMethodCall;
+import com.google.gwt.dev.jjs.ast.JNewArray;
 import com.google.gwt.dev.jjs.ast.JParameter;
 import com.google.gwt.dev.jjs.ast.JPrimitiveType;
 import com.google.gwt.dev.jjs.ast.JProgram;
@@ -147,6 +148,16 @@
   }
 
   @Override
+  public void endVisit(JNewArray x, Context ctx) {
+    JType elementType = x.getArrayType().getElementType();
+    if (x.initializers != null) {
+      for (JExpression init : x.initializers) {
+        processIfTypesNotEqual(init.getType(), elementType, x.getSourceInfo());
+      }
+    }
+  }
+
+  @Override
   public void endVisit(JReturnStatement x, Context ctx) {
     if (x.getExpr() != null) {
       // check against the current method return type
diff --git a/dev/core/test/com/google/gwt/dev/jjs/impl/EnumOrdinalizerTest.java b/dev/core/test/com/google/gwt/dev/jjs/impl/EnumOrdinalizerTest.java
index 34f0a84..bce91d0 100644
--- a/dev/core/test/com/google/gwt/dev/jjs/impl/EnumOrdinalizerTest.java
+++ b/dev/core/test/com/google/gwt/dev/jjs/impl/EnumOrdinalizerTest.java
@@ -32,10 +32,6 @@
  * makes sense to test the output in this way.  Thus, we provide confidence
  * that the AST is left in a coherent state, but it is not a complete test that
  * ordinalization has completed correctly in every respec.
- * 
- * TODO(jbrosenberg): Provide a test to assert that ordinalization has completed 
- * correctly, by inspecting the AST in detail, specifically for ordinal 
- * replacements, after the EnumOrdinalizer completes.
  */
 public class EnumOrdinalizerTest extends OptimizerTestBase {
   @Override
@@ -802,6 +798,68 @@
     assertFalse(tracker.isOrdinalized("test.EntryPoint$Fruit"));
   }
   
+  public void testNotOrdinalizableImplicitUpcastMethodCallArgsNewArray() 
+      throws UnableToCompleteException  {
+    EnumOrdinalizer.resetTracker();
+    
+    setupFruitEnum();
+    addSnippetClassDecl("public static String getEnumString(Enum[] myEnumArray) {",
+                        "  String retString = \"\";",
+                        "  for (Enum myEnum : myEnumArray) {",
+                        "    retString += myEnum.name();",
+                        "  }",
+                        "  return retString;",
+                        "}");
+    optimize("void", "String stringFruits = getEnumString(new Enum[] {Fruit.APPLE, Fruit.ORANGE});");
+    
+    EnumOrdinalizer.Tracker tracker = EnumOrdinalizer.getTracker();
+    assertTrue(tracker.isVisited("test.EntryPoint$Fruit"));
+    assertFalse(tracker.isOrdinalized("test.EntryPoint$Fruit"));
+  }
+
+  public void testNotOrdinalizableImplicitUpcastMethodCallVarArgs() 
+      throws UnableToCompleteException  {
+    EnumOrdinalizer.resetTracker();
+    
+    setupFruitEnum();
+    addSnippetClassDecl("public static String getEnumString(Enum...myEnumArray) {",
+                        "  String retString = \"\";",
+                        "  for (Enum myEnum : myEnumArray) {",
+                        "    retString += myEnum.name();",
+                        "  }",
+                        "  return retString;",
+                        "}");
+    optimize("void", "String stringFruits = getEnumString(Fruit.APPLE, Fruit.ORANGE);");
+    
+    EnumOrdinalizer.Tracker tracker = EnumOrdinalizer.getTracker();
+    assertTrue(tracker.isVisited("test.EntryPoint$Fruit"));
+    assertFalse(tracker.isOrdinalized("test.EntryPoint$Fruit"));
+  }
+
+  public void testNotOrdinalizableImplicitUpcastNewArrayElements() 
+      throws UnableToCompleteException  {
+    EnumOrdinalizer.resetTracker();
+    
+    setupFruitEnum();
+    optimize("void", "Enum[] enums = new Enum[] {Fruit.APPLE, Fruit.ORANGE};");
+    
+    EnumOrdinalizer.Tracker tracker = EnumOrdinalizer.getTracker();
+    assertTrue(tracker.isVisited("test.EntryPoint$Fruit"));
+    assertFalse(tracker.isOrdinalized("test.EntryPoint$Fruit"));
+  }
+  
+  public void testNotOrdinalizableImplicitUpcastNewArrayArrayElements() 
+      throws UnableToCompleteException  {
+    EnumOrdinalizer.resetTracker();
+    
+    setupFruitEnum();
+    optimize("void", "Enum[][] enums = new Enum[][] {{Fruit.APPLE, Fruit.ORANGE},{Fruit.ORANGE, Fruit.APPLE}};");
+    
+    EnumOrdinalizer.Tracker tracker = EnumOrdinalizer.getTracker();
+    assertTrue(tracker.isVisited("test.EntryPoint$Fruit"));
+    assertFalse(tracker.isOrdinalized("test.EntryPoint$Fruit"));
+  }
+  
   public void testNotOrdinalizableImplicitUpcastJsniMethodBodyParams() 
       throws UnableToCompleteException  {
     EnumOrdinalizer.resetTracker();