Clean up how tag interfaces are assigned to JavaScriptObject when implemented by SingleJsoImpl types.

Patch by: bobv
Review by: scottb
Reported by: macpherson


git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@4942 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/dev/core/src/com/google/gwt/dev/jjs/ast/JTypeOracle.java b/dev/core/src/com/google/gwt/dev/jjs/ast/JTypeOracle.java
index cdbd1de..d15f794 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/ast/JTypeOracle.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/ast/JTypeOracle.java
@@ -652,6 +652,13 @@
     dualImpl.clear();
     jsoSingleImpls.clear();
 
+    JClassType jsoType = program.getJavaScriptObject();
+    if (jsoType == null) {
+      return;
+    }
+
+    jsoType.implments.clear();
+
     for (JReferenceType type : program.getDeclaredTypes()) {
       if (!program.isJavaScriptObject(type)) {
         if (type instanceof JClassType) {
@@ -675,6 +682,7 @@
           assert intr.methods.size() == 0
               || intr.methods.get(0).getName().equals("$clinit");
           jsoSingleImpls.put(intr, program.getJavaScriptObject());
+          jsoType.implments.add(intr);
           continue;
         }
 
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/JavaScriptObjectNormalizer.java b/dev/core/src/com/google/gwt/dev/jjs/impl/JavaScriptObjectNormalizer.java
index 5d14256..4a793c0 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/JavaScriptObjectNormalizer.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/JavaScriptObjectNormalizer.java
@@ -37,7 +37,6 @@
 import com.google.gwt.dev.jjs.ast.JProgram;
 import com.google.gwt.dev.jjs.ast.JReferenceType;
 import com.google.gwt.dev.jjs.ast.JType;
-import com.google.gwt.dev.jjs.ast.JVisitor;
 import com.google.gwt.dev.jjs.ast.js.JMultiExpression;
 
 import java.util.Map;
@@ -48,19 +47,6 @@
  * Replace references to JSO subtypes with JSO itself.
  */
 public class JavaScriptObjectNormalizer {
-  private class Collector extends JVisitor {
-
-    @Override
-    public void endVisit(JClassType x, Context ctx) {
-      if (program.isJavaScriptObject(x)) {
-        for (JInterfaceType intr : x.implments) {
-          if (isTagInterface(intr) && !jsoType.implments.contains(intr)) {
-            jsoType.implments.add(intr);
-          }
-        }
-      }
-    }
-  }
   /**
    * Map types from JSO subtypes to JSO itself.
    */
@@ -275,43 +261,16 @@
    */
   private final Map<JInterfaceType, JClassType> jsoSingleImpls;
 
-  private final JClassType jsoType;
-
   private final JProgram program;
 
   private JavaScriptObjectNormalizer(JProgram program) {
     this.program = program;
     dualImpl = program.typeOracle.getInterfacesWithJavaAndJsoImpls();
     jsoSingleImpls = program.typeOracle.getSingleJsoImpls();
-
-    jsoType = program.getJavaScriptObject();
-    jsoType.implments.addAll(dualImpl);
   }
 
   private void execImpl() {
-    new Collector().accept(program);
-
     NormalizeVisitor visitor = new NormalizeVisitor();
     visitor.accept(program);
   }
-
-  private boolean isTagInterface(JReferenceType intr) {
-    if (!(intr instanceof JInterfaceType)) {
-      return false;
-    }
-
-    if (intr.methods.size() > 1) {
-      assert intr.methods.size() == 0
-          || intr.methods.get(0).getName().equals("$clinit");
-      return false;
-    }
-
-    for (JInterfaceType t : intr.implments) {
-      if (!isTagInterface(t)) {
-        return false;
-      }
-    }
-
-    return true;
-  }
 }