Fixed compiler crash that could occur when a superclass literal is not being generated.
git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@2286 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptAST.java b/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptAST.java
index ab2c8eb..2b990ba 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptAST.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptAST.java
@@ -23,7 +23,6 @@
import com.google.gwt.dev.jjs.ast.JAbsentArrayDimension;
import com.google.gwt.dev.jjs.ast.JAbstractMethodBody;
import com.google.gwt.dev.jjs.ast.JArrayRef;
-import com.google.gwt.dev.jjs.ast.JArrayType;
import com.google.gwt.dev.jjs.ast.JAssertStatement;
import com.google.gwt.dev.jjs.ast.JBinaryOperation;
import com.google.gwt.dev.jjs.ast.JBinaryOperator;
@@ -90,7 +89,6 @@
import com.google.gwt.dev.js.ast.JsConditional;
import com.google.gwt.dev.js.ast.JsContext;
import com.google.gwt.dev.js.ast.JsContinue;
-import com.google.gwt.dev.js.ast.JsNumberLiteral;
import com.google.gwt.dev.js.ast.JsDefault;
import com.google.gwt.dev.js.ast.JsDoWhile;
import com.google.gwt.dev.js.ast.JsExprStmt;
@@ -105,6 +103,7 @@
import com.google.gwt.dev.js.ast.JsNameRef;
import com.google.gwt.dev.js.ast.JsNew;
import com.google.gwt.dev.js.ast.JsNode;
+import com.google.gwt.dev.js.ast.JsNumberLiteral;
import com.google.gwt.dev.js.ast.JsObjectLiteral;
import com.google.gwt.dev.js.ast.JsParameter;
import com.google.gwt.dev.js.ast.JsPostfixOperation;
@@ -131,6 +130,7 @@
import java.util.HashSet;
import java.util.IdentityHashMap;
import java.util.Iterator;
+import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -1207,42 +1207,15 @@
}
private void generateClassLiterals(JsVars vars) {
- Set<JType> alreadyGenerated = new HashSet<JType>();
for (JType type : classLits.keySet()) {
- generateClassLiteralsRecursive(alreadyGenerated, type, vars);
+ JsName jsName = classLits.get(type);
+ JsExpression classObjectAlloc = classObjects.get(jsName);
+ JsVar var = new JsVar(jsName);
+ var.setInitExpr(classObjectAlloc);
+ vars.add(var);
}
}
- private void generateClassLiteralsRecursive(Set<JType> alreadyGenerated,
- JType type, JsVars vars) {
- if (alreadyGenerated.contains(type)) {
- return;
- }
- alreadyGenerated.add(type);
-
- if (type instanceof JClassType && !(type instanceof JArrayType)) {
- /*
- * If this type is a regular class or an enum, then ensure that its
- * superclass's class literal is generated before its own.
- *
- * NOTE: JInterfaceTypes can have their JReferenceType.extnds member set
- * to its first implemented interface. JArrayTypes always have Object as
- * their superclass so there is no need to explicitly set it here.
- */
- JClassType classType = (JClassType) type;
- if (classType.extnds != null) {
- generateClassLiteralsRecursive(alreadyGenerated, classType.extnds,
- vars);
- }
- }
-
- JsName jsName = classLits.get(type);
- JsExpression classObjectAlloc = classObjects.get(jsName);
- JsVar var = new JsVar(jsName);
- var.setInitExpr(classObjectAlloc);
- vars.add(var);
- }
-
private void generateClassSetup(JClassType x, List<JsStatement> globalStmts) {
generateSeedFuncAndPrototype(x, globalStmts);
generateVTables(x, globalStmts);
@@ -1640,10 +1613,9 @@
private final Map<JBlock, JsCatch> catchMap = new IdentityHashMap<JBlock, JsCatch>();
/**
- * Sorted to avoid nondeterministic iteration.
+ * Must preserve order so that superclass literals generate before subclasses.
*/
- private final Map<JType, JsName> classLits = new TreeMap<JType, JsName>(
- new HasNameSort());
+ private final Map<JType, JsName> classLits = new LinkedHashMap<JType, JsName>();
private final Map<JsName, JsExpression> classObjects = new IdentityHashMap<JsName, JsExpression>();
private final Map<JClassType, JsScope> classScopes = new IdentityHashMap<JClassType, JsScope>();