Adds some additional api area to our test compilation units.
http://gwt-code-reviews.appspot.com/586801/show
Patch by: tobyr
Review by: spoon
git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@8226 8db76d5a-ed1c-0410-87a9-c151d255dfc7
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 05feb9d..92f4f0f 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
@@ -74,7 +74,8 @@
"java.io.Serializable", "java.lang.Object", "java.lang.String",
"java.lang.Class", "java.lang.CharSequence", "java.lang.Cloneable",
"java.lang.Comparable", "java.lang.Enum", "java.lang.Iterable",
- "java.util.Iterator", "com.google.gwt.core.client.GWT",
+ "java.util.Iterator", "java.lang.AssertionError",
+ "com.google.gwt.core.client.GWT",
"com.google.gwt.core.client.JavaScriptObject",
"com.google.gwt.lang.ClassLiteralHolder",
"com.google.gwt.core.client.RunAsyncCallback",
@@ -459,8 +460,8 @@
return x;
}
- public JEnumType createEnum(SourceInfo info, String name) {
- JEnumType x = new JEnumType(info, name);
+ public JEnumType createEnum(SourceInfo info, String name, boolean isAbstract) {
+ JEnumType x = new JEnumType(info, name, isAbstract);
x.setSuperClass(getTypeJavaLangEnum());
allTypes.add(x);
diff --git a/dev/core/test/com/google/gwt/dev/javac/impl/JavaResourceBase.java b/dev/core/test/com/google/gwt/dev/javac/impl/JavaResourceBase.java
index 7bff82a..7a9e6f5 100644
--- a/dev/core/test/com/google/gwt/dev/javac/impl/JavaResourceBase.java
+++ b/dev/core/test/com/google/gwt/dev/javac/impl/JavaResourceBase.java
@@ -49,6 +49,24 @@
StringBuffer code = new StringBuffer();
code.append("package java.lang;\n");
code.append("public class Class<T> {\n");
+ code.append(" public String getName() { return null; }\n");
+ code.append(" public String getSimpleName() { return null; }\n");
+ code.append("}\n");
+ return code;
+ }
+ };
+ public static final MockJavaResource CLASS_NOT_FOUND_EXCEPTION = new MockJavaResource(
+ "java.lang.ClassNotFoundException") {
+ @Override
+ protected CharSequence getContent() {
+ StringBuffer code = new StringBuffer();
+ code.append("package java.lang;\n");
+ code.append("public class ClassNotFoundException extends Exception {\n");
+ code.append(" public ClassNotFoundException() {}\n");
+ code.append(" public ClassNotFoundException(String msg) {}\n");
+ code.append(" public ClassNotFoundException(String msg, Throwable t) {}\n");
+ code.append(" public Throwable getCause() { return null; }\n");
+ code.append(" public Throwable getException() { return null; }\n");
code.append("}\n");
return code;
}
@@ -64,6 +82,24 @@
return code;
}
};
+ public static final MockJavaResource DOUBLE = new MockJavaResource(
+ "java.lang.Double") {
+ @Override
+ protected CharSequence getContent() {
+ StringBuffer code = new StringBuffer();
+ code.append("package java.lang;\n");
+ code.append("public class Double {\n");
+ code.append(" private double value;\n");
+ code.append(" public Double(double value) {\n");
+ code.append(" this.value = value;\n");
+ code.append(" }\n");
+ code.append(" public static boolean isNaN(double d) { return false; }\n");
+ code.append(" public static Double valueOf(double d) { return new Double(d); }\n");
+ code.append(" public double doubleValue() { return value; }\n");
+ code.append("}\n");
+ return code;
+ }
+ };
public static final MockJavaResource ENUM = new MockJavaResource(
"java.lang.Enum") {
@Override
@@ -77,6 +113,17 @@
return code;
}
};
+ public static final MockJavaResource ERROR = new MockJavaResource(
+ "java.lang.Error") {
+ @Override
+ protected CharSequence getContent() {
+ StringBuffer code = new StringBuffer();
+ code.append("package java.lang;\n");
+ code.append("public class Error extends Throwable {\n");
+ code.append("}\n");
+ return code;
+ }
+ };
public static final MockJavaResource EXCEPTION = new MockJavaResource(
"java.lang.Exception") {
@Override
@@ -88,6 +135,23 @@
return code;
}
};
+ public static final MockJavaResource FLOAT = new MockJavaResource(
+ "java.lang.Float") {
+ @Override
+ protected CharSequence getContent() {
+ StringBuffer code = new StringBuffer();
+ code.append("package java.lang;\n");
+ code.append("public class Float {\n");
+ code.append(" private float value;\n");
+ code.append(" public Float(float value) {\n");
+ code.append(" this.value = value;\n");
+ code.append(" }\n");
+ code.append(" public static Float valueOf(float f) { return new Float(f); }\n");
+ code.append(" public float floatValue() { return value; }\n");
+ code.append("}\n");
+ return code;
+ }
+ };
public static final MockJavaResource FOO = new MockJavaResource("test.Foo") {
@Override
protected CharSequence getContent() {
@@ -99,6 +163,23 @@
return code;
}
};
+ public static final MockJavaResource INTEGER = new MockJavaResource(
+ "java.lang.Integer") {
+ @Override
+ protected CharSequence getContent() {
+ StringBuffer code = new StringBuffer();
+ code.append("package java.lang;\n");
+ code.append("public class Integer {\n");
+ code.append(" private int value;\n");
+ code.append(" public Integer(int value) {\n");
+ code.append(" this.value = value;\n");
+ code.append(" }\n");
+ code.append(" public static Integer valueOf(int i) { return new Integer(i); }\n");
+ code.append(" public int intValue() { return value; }\n");
+ code.append("}\n");
+ return code;
+ }
+ };
public static final MockJavaResource IS_SERIALIZABLE = new MockJavaResource(
"com.google.gwt.user.client.rpc.IsSerializable") {
@Override
@@ -132,6 +213,19 @@
return code;
}
};
+ public static final MockJavaResource NO_CLASS_DEF_FOUND_ERROR = new MockJavaResource(
+ "java.lang.NoClassDefFoundError") {
+ @Override
+ protected CharSequence getContent() {
+ StringBuffer code = new StringBuffer();
+ code.append("package java.lang;\n");
+ code.append("public class NoClassDefFoundError extends Error {\n");
+ code.append(" public NoClassDefFoundError() {}\n");
+ code.append(" public NoClassDefFoundError(String msg) {}\n");
+ code.append("}\n");
+ return code;
+ }
+ };
public static final MockJavaResource OBJECT = new MockJavaResource(
"java.lang.Object") {
@Override
@@ -164,8 +258,33 @@
code.append("package java.lang;\n");
code.append("import java.io.Serializable;\n");
code.append("public final class String implements Serializable {\n");
+ /*
+ * TODO(scottb) Can't add String constructors because they are "magic" in
+ * GWT. (They're re-vectored to static calls). Maybe we should generalize
+ * the compiler magic to work via annotations, and annotate only the real
+ * GWT string.
+ */
+ // code.append(" public String(String s) {}\n");
code.append(" private static final long serialVersionUID = 0L;\n");
+ code.append(" public char charAt(int index) { return 'a'; }\n");
+ code.append(" public boolean equals(Object obj) { return false; }\n");
+ code.append(" public boolean equalsIgnoreCase(String str) { return false; }\n");
code.append(" public int length() { return 0; }\n");
+ code.append(" public String replace(char c1, char c2) { return null; }\n");
+ code.append(" public boolean startsWith(String str) { return false; }\n");
+ code.append(" public String toLowerCase() { return null; }\n");
+ code.append(" public static String valueOf(boolean b) { return null; }\n");
+ code.append("}\n");
+ return code;
+ }
+ };
+ public static final MockJavaResource STRING_BUILDER = new MockJavaResource(
+ "java.lang.StringBuilder") {
+ @Override
+ protected CharSequence getContent() {
+ StringBuffer code = new StringBuffer();
+ code.append("package java.lang;\n");
+ code.append("public final class StringBuilder {\n");
code.append("}\n");
return code;
}
@@ -189,6 +308,8 @@
StringBuffer code = new StringBuffer();
code.append("package java.lang;\n");
code.append("public class Throwable {\n");
+ code.append(" public String getMessage() { return \"\"; }\n");
+ code.append(" public Throwable getCause() { return null; }\n");
code.append("}\n");
return code;
}
@@ -196,8 +317,9 @@
public static MockJavaResource[] getStandardResources() {
return new MockJavaResource[] {
- ANNOTATION, CLASS, COLLECTION, ENUM, EXCEPTION, IS_SERIALIZABLE,
- JAVASCRIPTOBJECT, MAP, OBJECT, SERIALIZABLE, STRING, SUPPRESS_WARNINGS,
- THROWABLE};
+ ANNOTATION, CLASS, CLASS_NOT_FOUND_EXCEPTION, COLLECTION, DOUBLE, ENUM,
+ EXCEPTION, ERROR, FLOAT, INTEGER, IS_SERIALIZABLE, JAVASCRIPTOBJECT,
+ MAP, NO_CLASS_DEF_FOUND_ERROR, OBJECT, SERIALIZABLE, STRING,
+ STRING_BUILDER, SUPPRESS_WARNINGS, THROWABLE};
}
}
diff --git a/dev/core/test/com/google/gwt/dev/jjs/JavaAstConstructor.java b/dev/core/test/com/google/gwt/dev/jjs/JavaAstConstructor.java
index 9fbd3bd..a3a360e 100644
--- a/dev/core/test/com/google/gwt/dev/jjs/JavaAstConstructor.java
+++ b/dev/core/test/com/google/gwt/dev/jjs/JavaAstConstructor.java
@@ -57,6 +57,7 @@
StringBuffer code = new StringBuffer();
code.append("package com.google.gwt.lang;\n");
code.append("public final class Array {\n");
+ code.append(" public int length;\n");
code.append("}\n");
return code;
}
diff --git a/dev/core/test/com/google/gwt/dev/jjs/impl/gflow/cfg/CfgBuilderTest.java b/dev/core/test/com/google/gwt/dev/jjs/impl/gflow/cfg/CfgBuilderTest.java
index ffdc7ca..60fadff 100644
--- a/dev/core/test/com/google/gwt/dev/jjs/impl/gflow/cfg/CfgBuilderTest.java
+++ b/dev/core/test/com/google/gwt/dev/jjs/impl/gflow/cfg/CfgBuilderTest.java
@@ -3,7 +3,7 @@
import com.google.gwt.core.ext.UnableToCompleteException;
import com.google.gwt.dev.jjs.ast.JMethodBody;
import com.google.gwt.dev.jjs.ast.JProgram;
-import com.google.gwt.dev.jjs.impl.OptimizerTestBase;
+import com.google.gwt.dev.jjs.impl.JJSTestBase;
import com.google.gwt.dev.jjs.impl.gflow.cfg.CfgBuilder;
import com.google.gwt.dev.jjs.impl.gflow.cfg.CfgEdge;
import com.google.gwt.dev.jjs.impl.gflow.cfg.Cfg;
@@ -15,7 +15,7 @@
/**
* Test class for CfgBuilfer.
*/
-public class CfgBuilderTest extends OptimizerTestBase {
+public class CfgBuilderTest extends JJSTestBase {
@Override
protected void setUp() throws Exception {
super.setUp();
@@ -768,7 +768,7 @@
"READ(b) -> [*]",
"COND (EntryPoint.b) -> [THEN=*, ELSE=1]",
"STMT -> [*]",
- "OPTTHROW(throwCheckedException()) -> [NOTHROW=*, 2, RE=4]",
+ "OPTTHROW(throwCheckedException()) -> [NOTHROW=*, 2, RE=4, E=4]",
"CALL(throwCheckedException) -> [*]",
"1: STMT -> [*]",
"READWRITE(k, null) -> [3]",
@@ -799,7 +799,7 @@
"READ(b) -> [*]",
"COND (EntryPoint.b) -> [THEN=*, ELSE=1]",
"STMT -> [*]",
- "OPTTHROW(throwCheckedException()) -> [NOTHROW=*, 2, RE=3]",
+ "OPTTHROW(throwCheckedException()) -> [NOTHROW=*, 2, RE=3, E=5]",
"CALL(throwCheckedException) -> [*]",
"1: STMT -> [*]",
"READWRITE(k, null) -> [4]",
@@ -811,7 +811,7 @@
"READWRITE(l, null) -> [*]",
"4: STMT -> [*]",
"READWRITE(j, null) -> [*]",
- "END"
+ "5: END"
);
}
@@ -833,7 +833,7 @@
"READ(b) -> [*]",
"COND (EntryPoint.b) -> [THEN=*, ELSE=1]",
"STMT -> [*]",
- "OPTTHROW(throwUncheckedException()) -> [NOTHROW=*, RE=2, RE=3]",
+ "OPTTHROW(throwUncheckedException()) -> [NOTHROW=*, RE=2, RE=3, E=5]",
"CALL(throwUncheckedException) -> [*]",
"1: STMT -> [*]",
"READWRITE(k, null) -> [4]",
@@ -845,7 +845,7 @@
"READWRITE(l, null) -> [*]",
"4: STMT -> [*]",
"READWRITE(j, null) -> [*]",
- "END"
+ "5: END"
);
}
@@ -1017,7 +1017,7 @@
).is(
"BLOCK -> [*]",
"STMT -> [*]",
- "OPTTHROW(createFoo()) -> [NOTHROW=*, RE=1]",
+ "OPTTHROW(createFoo()) -> [NOTHROW=*, RE=1, E=1]",
"CALL(createFoo) -> [*]",
"WRITE(foo, EntryPoint.createFoo()) -> [*]",
"STMT -> [*]",
@@ -1034,7 +1034,7 @@
).is(
"BLOCK -> [*]",
"STMT -> [*]",
- "OPTTHROW(createFoo()) -> [NOTHROW=*, RE=1]",
+ "OPTTHROW(createFoo()) -> [NOTHROW=*, RE=1, E=1]",
"CALL(createFoo) -> [*]",
"WRITE(foo, EntryPoint.createFoo()) -> [*]",
"STMT -> [*]",
@@ -1309,6 +1309,7 @@
"9: END"
);
}
+
public void testSwitchWithLoopAndBreak() throws Exception {
assertCfg("void",
"switch(i) {",
@@ -1345,7 +1346,89 @@
"3: END"
);
}
+
+ public void testBreakStatement1() throws Exception {
+ assertCfg("void",
+ "lbl: {",
+ " break lbl;",
+ "}"
+ ).is(
+ "BLOCK -> [*]",
+ "BLOCK -> [*]",
+ "STMT -> [*]",
+ "GOTO -> [*]",
+ "END");
+ }
+ public void testBreakStatement2() throws Exception {
+ assertCfg("void",
+ "lbl: break lbl;"
+ ).is(
+ "BLOCK -> [*]",
+ "STMT -> [*]",
+ "GOTO -> [*]",
+ "END");
+ }
+
+ public void testBreakStatement3() throws Exception {
+ assertCfg("void",
+ "lbl: {",
+ " i = 1;",
+ " if (b) break lbl;",
+ " i = 2;",
+ "}"
+ ).is(
+ "BLOCK -> [*]",
+ "BLOCK -> [*]",
+ "STMT -> [*]",
+ "WRITE(i, 1) -> [*]",
+ "STMT -> [*]",
+ "READ(b) -> [*]",
+ "COND (EntryPoint.b) -> [THEN=*, ELSE=1]",
+ "STMT -> [*]",
+ "GOTO -> [2]",
+ "1: STMT -> [*]",
+ "WRITE(i, 2) -> [*]",
+ "2: END");
+ }
+
+ public void testBreakStatement4() throws Exception {
+ assertCfg("void",
+ "lbl1: {",
+ " i = 1;",
+ " lbl2: {",
+ " j = 1;",
+ " if (b) break lbl1;",
+ " j = 2;",
+ " if (b) break lbl2;",
+ " }",
+ " i = 2;",
+ "}"
+ ).is(
+ "BLOCK -> [*]",
+ "BLOCK -> [*]",
+ "STMT -> [*]",
+ "WRITE(i, 1) -> [*]",
+ "BLOCK -> [*]",
+ "STMT -> [*]",
+ "WRITE(j, 1) -> [*]",
+ "STMT -> [*]",
+ "READ(b) -> [*]",
+ "COND (EntryPoint.b) -> [THEN=*, ELSE=1]",
+ "STMT -> [*]",
+ "GOTO -> [3]",
+ "1: STMT -> [*]",
+ "WRITE(j, 2) -> [*]",
+ "STMT -> [*]",
+ "READ(b) -> [*]",
+ "COND (EntryPoint.b) -> [THEN=*, ELSE=2]",
+ "STMT -> [*]",
+ "GOTO -> [*]",
+ "2: STMT -> [*]",
+ "WRITE(i, 2) -> [*]",
+ "3: END");
+ }
+
private CfgBuilderResult assertCfg(String returnType, String ...codeSnippet)
throws UnableToCompleteException {
JProgram program = compileSnippet(returnType,
diff --git a/dev/core/test/com/google/gwt/dev/jjs/impl/gflow/constants/ConstantsAnalysisTest.java b/dev/core/test/com/google/gwt/dev/jjs/impl/gflow/constants/ConstantsAnalysisTest.java
index 8a14d53..d3c36e0 100644
--- a/dev/core/test/com/google/gwt/dev/jjs/impl/gflow/constants/ConstantsAnalysisTest.java
+++ b/dev/core/test/com/google/gwt/dev/jjs/impl/gflow/constants/ConstantsAnalysisTest.java
@@ -56,7 +56,7 @@
analyze("void", "int i = foo();").into(
"BLOCK -> [* T]",
"STMT -> [* T]",
- "OPTTHROW(foo()) -> [NOTHROW=* T, RE=1 T]",
+ "OPTTHROW(foo()) -> [NOTHROW=* T, RE=1 T, E=1 T]",
"CALL(foo) -> [* T]",
"WRITE(i, EntryPoint.foo()) -> [* T]",
"1: END");
@@ -129,7 +129,7 @@
"STMT -> [* T]",
"WRITE(j, 0) -> [* {j = 0}]",
"STMT -> [* {j = 0}]",
- "OPTTHROW(foo()) -> [NOTHROW=* {j = 0}, RE=2 {j = 0}]",
+ "OPTTHROW(foo()) -> [NOTHROW=* {j = 0}, RE=2 {j = 0}, E=2 {j = 0}]",
"CALL(foo) -> [* {j = 0}]",
"COND (EntryPoint.foo() == 1) -> [THEN=* {j = 0}, ELSE=1 {j = 0}]",
"STMT -> [* {j = 0}]",
@@ -144,11 +144,11 @@
"STMT -> [* T]",
"WRITE(j, 0) -> [* {j = 0}]",
"STMT -> [* {j = 0}]",
- "OPTTHROW(foo()) -> [NOTHROW=* {j = 0}, RE=2 {j = 0}]",
+ "OPTTHROW(foo()) -> [NOTHROW=* {j = 0}, RE=2 {j = 0}, E=2 {j = 0}]",
"CALL(foo) -> [* {j = 0}]",
"COND (EntryPoint.foo() == 1) -> [THEN=* {j = 0}, ELSE=1 {j = 0}]",
"STMT -> [* {j = 0}]",
- "OPTTHROW(foo()) -> [NOTHROW=* {j = 0}, RE=2 {j = 0}]",
+ "OPTTHROW(foo()) -> [NOTHROW=* {j = 0}, RE=2 {j = 0}, E=2 {j = 0}]",
"CALL(foo) -> [* {j = 0}]",
"WRITE(j, EntryPoint.foo()) -> [* T]",
"1: STMT -> [* T]",