Reviewers: cromwellian, zundel,

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


Please review this at http://gwt-code-reviews.appspot.com/1449812/

Affected files:
  M dev/core/src/com/google/gwt/dev/jjs/impl/ImplicitUpcastAnalyzer.java
  M dev/core/test/com/google/gwt/dev/jjs/impl/EnumOrdinalizerTest.java


Index: dev/core/src/com/google/gwt/dev/jjs/impl/ImplicitUpcastAnalyzer.java
===================================================================
--- dev/core/src/com/google/gwt/dev/jjs/impl/ImplicitUpcastAnalyzer.java (revision 10269) +++ dev/core/src/com/google/gwt/dev/jjs/impl/ImplicitUpcastAnalyzer.java (working copy)
@@ -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
Index: dev/core/test/com/google/gwt/dev/jjs/impl/EnumOrdinalizerTest.java
===================================================================
--- dev/core/test/com/google/gwt/dev/jjs/impl/EnumOrdinalizerTest.java (revision 10269) +++ dev/core/test/com/google/gwt/dev/jjs/impl/EnumOrdinalizerTest.java (working copy)
@@ -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
@@ -796,6 +792,68 @@
                         "  return retString;",
                         "}");
     optimize("void", "String stringApple = getEnumString(Fruit.APPLE);");
+
+    EnumOrdinalizer.Tracker tracker = EnumOrdinalizer.getTracker();
+    assertTrue(tracker.isVisited("test.EntryPoint$Fruit"));
+    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"));


--
http://groups.google.com/group/Google-Web-Toolkit-Contributors

Reply via email to