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();