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;
- }
}