Fixed some nondeterministic iterator; also some Java 5 updates.

git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@1508 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java b/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
index 607bae4..36c45c8 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
@@ -68,7 +68,6 @@
 import org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;
 
 import java.util.HashSet;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
 
@@ -142,7 +141,7 @@
           // Find the appropriate (noArg) constructor
           JMethod noArgCtor = null;
           for (int j = 0; j < mainClass.methods.size(); ++j) {
-            JMethod ctor = (JMethod) mainClass.methods.get(j);
+            JMethod ctor = mainClass.methods.get(j);
             if (ctor.getName().equals(mainClass.getShortName())) {
               if (ctor.params.size() == 0) {
                 noArgCtor = ctor;
@@ -177,7 +176,7 @@
 
   private static JMethod findMainMethod(JReferenceType referenceType) {
     for (int j = 0; j < referenceType.methods.size(); ++j) {
-      JMethod method = (JMethod) referenceType.methods.get(j);
+      JMethod method = referenceType.methods.get(j);
       if (method.getName().equals("onModuleLoad")) {
         if (method.params.size() == 0) {
           return method;
@@ -202,7 +201,7 @@
   private long lastModified;
   private final boolean obfuscate;
   private final boolean prettyNames;
-  private final Set/* <IProblem> */problemSet = new HashSet/* <IProblem> */();
+  private final Set<IProblem> problemSet = new HashSet<IProblem>();
 
   public JavaToJavaScriptCompiler(final TreeLogger logger,
       final WebModeCompilerFrontEnd compiler, final String[] declEntryPts)
@@ -230,9 +229,9 @@
     // Find all the possible rebound entry points.
     //
     RebindPermutationOracle rpo = compiler.getRebindPermutationOracle();
-    Set allEntryPoints = new HashSet();
-    for (int i = 0; i < declEntryPts.length; i++) {
-      String[] all = rpo.getAllPossibleRebindAnswers(logger, declEntryPts[i]);
+    Set<String> allEntryPoints = new HashSet<String>();
+    for (String element : declEntryPts) {
+      String[] all = rpo.getAllPossibleRebindAnswers(logger, element);
       Util.addAll(allEntryPoints, all);
     }
     String[] entryPts = Util.toStringArray(allEntryPoints);
@@ -262,8 +261,7 @@
     //
     lastModified = 0;
     CompilationUnitProvider newestCup = null;
-    for (int i = 0; i < goldenCuds.length; i++) {
-      CompilationUnitDeclaration cud = goldenCuds[i];
+    for (CompilationUnitDeclaration cud : goldenCuds) {
       ICompilationUnitAdapter icua = (ICompilationUnitAdapter) cud.compilationResult.compilationUnit;
       CompilationUnitProvider cup = icua.getCompilationUnitProvider();
       long cupLastModified = cup.getLastModified();
@@ -427,9 +425,8 @@
     } catch (InternalCompilerException e) {
       TreeLogger topBranch = logger.branch(TreeLogger.ERROR,
           "An internal compiler exception occurred", e);
-      List nodeTrace = e.getNodeTrace();
-      for (Iterator it = nodeTrace.iterator(); it.hasNext();) {
-        NodeInfo nodeInfo = (NodeInfo) it.next();
+      List<NodeInfo> nodeTrace = e.getNodeTrace();
+      for (NodeInfo nodeInfo : nodeTrace) {
         SourceInfo info = nodeInfo.getSourceInfo();
         String msg;
         if (info != null) {
@@ -470,8 +467,7 @@
     if (goldenCuds.length == 0) {
       compilationFailed = true;
     }
-    for (int iCud = 0; iCud < goldenCuds.length; iCud++) {
-      CompilationUnitDeclaration cud = goldenCuds[iCud];
+    for (CompilationUnitDeclaration cud : goldenCuds) {
       CompilationResult result = cud.compilationResult();
       if (result.hasErrors()) {
         compilationFailed = true;
@@ -482,8 +478,7 @@
         TreeLogger branch = logger.branch(TreeLogger.ERROR, "Errors in "
             + String.valueOf(result.getFileName()), null);
         IProblem[] errors = result.getErrors();
-        for (int i = 0; i < errors.length; i++) {
-          IProblem problem = errors[i];
+        for (IProblem problem : errors) {
           if (problemSet.contains(problem)) {
             continue;
           }
diff --git a/dev/core/src/com/google/gwt/dev/jjs/ast/JProgram.java b/dev/core/src/com/google/gwt/dev/jjs/ast/JProgram.java
index 3f5134d..fed1fff 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/ast/JProgram.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/ast/JProgram.java
@@ -28,6 +28,7 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Comparator;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.IdentityHashMap;
@@ -35,6 +36,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.TreeSet;
 
 /**
  * Root for the AST representing an entire Java program.
@@ -113,7 +115,19 @@
 
   public final JTypeOracle typeOracle = new JTypeOracle(this);
 
-  private final List<JArrayType> allArrayTypes = new ArrayList<JArrayType>();
+  /**
+   * Sorted to avoid nondeterministic iteration.
+   */
+  private final Set<JArrayType> allArrayTypes = new TreeSet<JArrayType>(
+      new Comparator<JArrayType>() {
+        public int compare(JArrayType o1, JArrayType o2) {
+          int comp = o1.getDims() - o2.getDims();
+          if (comp != 0) {
+            return comp;
+          }
+          return o1.getName().compareTo(o2.getName());
+        }
+      });
 
   private final List<JReferenceType> allTypes = new ArrayList<JReferenceType>();
 
@@ -398,7 +412,11 @@
     return curType;
   }
 
-  public List<JArrayType> getAllArrayTypes() {
+  /**
+   * Returns a sorted set of array types, so the returned set can be iterated
+   * over without introducing nondeterminism.
+   */
+  public Set<JArrayType> getAllArrayTypes() {
     return allArrayTypes;
   }
 
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/CastNormalizer.java b/dev/core/src/com/google/gwt/dev/jjs/impl/CastNormalizer.java
index 5a3f4ce..c781389 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/CastNormalizer.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/CastNormalizer.java
@@ -43,7 +43,6 @@
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.IdentityHashMap;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -201,15 +200,16 @@
 
       // Find all possible query types which I can satisfy
       Set<JReferenceType> yesSet = null;
-      for (Iterator<JReferenceType> iter = queriedTypes.keySet().iterator(); iter.hasNext();) {
 
-        JReferenceType qType = iter.next();
+      // NOTE: non-deterministic iteration over HashSet and HashMap. This is
+      // okay here because we're just adding things to another HashSet.
+      for (JReferenceType qType : queriedTypes.keySet()) {
+
         Set<JReferenceType> querySet = queriedTypes.get(qType);
         if (program.typeOracle.canTriviallyCast(type, qType)) {
 
-          for (Iterator<JReferenceType> it = querySet.iterator(); it.hasNext();) {
+          for (JReferenceType argType : querySet) {
 
-            JReferenceType argType = it.next();
             if (program.typeOracle.canTriviallyCast(type, argType)) {
               if (yesSet == null) {
                 yesSet = new HashSet<JReferenceType>();
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 8e32999..e45e74e 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
@@ -141,6 +141,7 @@
 import java.util.Map;
 import java.util.Set;
 import java.util.Stack;
+import java.util.TreeMap;
 
 /**
  * Creates a JavaScript AST from a <code>JProgram</code> node.
@@ -1581,7 +1582,13 @@
   }
 
   private final Map<JBlock, JsCatch> catchMap = new IdentityHashMap<JBlock, JsCatch>();
-  private final Map<JType, JsName> classLits = new IdentityHashMap<JType, JsName>();
+
+  /**
+   * Sorted to avoid nondeterministic iteration.
+   */
+  private final Map<JType, JsName> classLits = new TreeMap<JType, JsName>(
+      new HasNameSort());
+
   private final Map<JsName, JsExpression> classObjects = new IdentityHashMap<JsName, JsExpression>();
   private final Map<JClassType, JsScope> classScopes = new IdentityHashMap<JClassType, JsScope>();