| Index: compiler/javatests/com/google/dart/compiler/type/TypeAnalyzerCompilerTest.java
|
| diff --git a/compiler/javatests/com/google/dart/compiler/type/TypeAnalyzerCompilerTest.java b/compiler/javatests/com/google/dart/compiler/type/TypeAnalyzerCompilerTest.java
|
| index 954c764c03f1701747edc44fbd56d5e04cad33e3..d2c58b6599818fe4c82352101b01348c9c51faa9 100644
|
| --- a/compiler/javatests/com/google/dart/compiler/type/TypeAnalyzerCompilerTest.java
|
| +++ b/compiler/javatests/com/google/dart/compiler/type/TypeAnalyzerCompilerTest.java
|
| @@ -1978,26 +1978,156 @@ public class TypeAnalyzerCompilerTest extends CompilerTestCase {
|
| }
|
| }
|
|
|
| - public void test_typesPropagation_secondAssign_sameType() throws Exception {
|
| + public void test_typesPropagation_multiAssign() throws Exception {
|
| analyzeLibrary(
|
| "// filler filler filler filler filler filler filler filler filler filler",
|
| "f() {",
|
| " var v = true;",
|
| - " v = false;",
|
| + " var v1 = v;",
|
| + " v = 0;",
|
| + " var v2 = v;",
|
| "}",
|
| "");
|
| - assertInferredElementTypeString(testUnit, "v", "bool");
|
| + assertInferredElementTypeString(testUnit, "v1", "bool");
|
| + assertInferredElementTypeString(testUnit, "v2", "int");
|
| }
|
|
|
| - public void test_typesPropagation_secondAssign_differentType() throws Exception {
|
| + public void test_typesPropagation_multiAssign_noInitialValue() throws Exception {
|
| analyzeLibrary(
|
| "// filler filler filler filler filler filler filler filler filler filler",
|
| "f() {",
|
| - " var v = true;",
|
| + " var v;",
|
| " v = 0;",
|
| + " var v1 = v;",
|
| + "}",
|
| + "");
|
| + assertInferredElementTypeString(testUnit, "v1", "int");
|
| + }
|
| +
|
| + public void test_typesPropagation_multiAssign_IfThen() throws Exception {
|
| + analyzeLibrary(
|
| + "// filler filler filler filler filler filler filler filler filler filler",
|
| + "f() {",
|
| + " var v = true;",
|
| + " var v1 = v;",
|
| + " if (true) {",
|
| + " v = 0;",
|
| + " var v2 = v;",
|
| + " }",
|
| + " var v3 = v;",
|
| + "}",
|
| + "");
|
| + assertInferredElementTypeString(testUnit, "v1", "bool");
|
| + assertInferredElementTypeString(testUnit, "v2", "int");
|
| + assertInferredElementTypeString(testUnit, "v3", "Object");
|
| + }
|
| +
|
| + public void test_typesPropagation_multiAssign_IfThenElse() throws Exception {
|
| + analyzeLibrary(
|
| + "// filler filler filler filler filler filler filler filler filler filler",
|
| + "f() {",
|
| + " var a = true;",
|
| + " var b = true;",
|
| + " var c = true;",
|
| + " var d = true;",
|
| + " if (true) {",
|
| + " a = 0;",
|
| + " b = 0;",
|
| + " } else {",
|
| + " a = 0;",
|
| + " c = 0;",
|
| + " }",
|
| + " var a1 = a;",
|
| + " var b1 = b;",
|
| + " var c1 = c;",
|
| + " var d1 = d;",
|
| + "}",
|
| + "");
|
| + assertInferredElementTypeString(testUnit, "a1", "int");
|
| + assertInferredElementTypeString(testUnit, "b1", "Object");
|
| + assertInferredElementTypeString(testUnit, "c1", "Object");
|
| + assertInferredElementTypeString(testUnit, "d1", "bool");
|
| + }
|
| +
|
| + public void test_typesPropagation_multiAssign_While() throws Exception {
|
| + analyzeLibrary(
|
| + "// filler filler filler filler filler filler filler filler filler filler",
|
| + "f() {",
|
| + " var v = true;",
|
| + " var v1 = v;",
|
| + " while (true) {",
|
| + " var v2 = v;",
|
| + " v = 0;",
|
| + " var v3 = v;",
|
| + " }",
|
| + " var v4 = v;",
|
| + "}",
|
| + "");
|
| + assertInferredElementTypeString(testUnit, "v1", "bool");
|
| + assertInferredElementTypeString(testUnit, "v2", "bool");
|
| + assertInferredElementTypeString(testUnit, "v3", "int");
|
| + assertInferredElementTypeString(testUnit, "v4", "Object");
|
| + }
|
| +
|
| + public void test_typesPropagation_multiAssign_DoWhile() throws Exception {
|
| + analyzeLibrary(
|
| + "// filler filler filler filler filler filler filler filler filler filler",
|
| + "f() {",
|
| + " var v = true;",
|
| + " var v1 = v;",
|
| + " do {",
|
| + " var v2 = v;",
|
| + " v = 0;",
|
| + " var v3 = v;",
|
| + " } while (true);",
|
| + " var v4 = v;",
|
| + "}",
|
| + "");
|
| + assertInferredElementTypeString(testUnit, "v1", "bool");
|
| + assertInferredElementTypeString(testUnit, "v2", "bool");
|
| + assertInferredElementTypeString(testUnit, "v3", "int");
|
| + assertInferredElementTypeString(testUnit, "v4", "int");
|
| + }
|
| +
|
| + public void test_typesPropagation_multiAssign_For() throws Exception {
|
| + analyzeLibrary(
|
| + "// filler filler filler filler filler filler filler filler filler filler",
|
| + "f() {",
|
| + " var v = true;",
|
| + " var v1 = v;",
|
| + " for (int i = 0; i < 10; i++) {",
|
| + " var v2 = v;",
|
| + " v = 0;",
|
| + " var v3 = v;",
|
| + " }",
|
| + " var v4 = v;",
|
| "}",
|
| "");
|
| - assertInferredElementTypeString(testUnit, "v", "<dynamic>");
|
| + assertInferredElementTypeString(testUnit, "v1", "bool");
|
| + assertInferredElementTypeString(testUnit, "v2", "bool");
|
| + assertInferredElementTypeString(testUnit, "v3", "int");
|
| + assertInferredElementTypeString(testUnit, "v4", "Object");
|
| + }
|
| +
|
| + public void test_typesPropagation_multiAssign_ForIn() throws Exception {
|
| + analyzeLibrary(
|
| + "// filler filler filler filler filler filler filler filler filler filler",
|
| + "f() {",
|
| + " var v = true;",
|
| + " var v1 = v;",
|
| + " List<String> names = [];",
|
| + " for (var name in names) {",
|
| + " var v2 = v;",
|
| + " v = 0;",
|
| + " var v3 = v;",
|
| + " }",
|
| + " var v4 = v;",
|
| + "}",
|
| + "");
|
| + assertInferredElementTypeString(testUnit, "v1", "bool");
|
| + assertInferredElementTypeString(testUnit, "v2", "bool");
|
| + assertInferredElementTypeString(testUnit, "v3", "int");
|
| + assertInferredElementTypeString(testUnit, "v4", "Object");
|
| }
|
|
|
| /**
|
| @@ -2382,6 +2512,36 @@ public class TypeAnalyzerCompilerTest extends CompilerTestCase {
|
| // we exited "if" Block, so "assert" may be was not executed, so we don't know type
|
| assertInferredElementTypeString(testUnit, "v5", "<dynamic>");
|
| }
|
| +
|
| + /**
|
| + * <p>
|
| + * http://code.google.com/p/dart/issues/detail?id=4410
|
| + */
|
| + public void test_typesPropagation_assertIsType_twoVariables() throws Exception {
|
| + analyzeLibrary(
|
| + "f(a, b) {",
|
| + " while (true) {",
|
| + " var a1 = a;",
|
| + " var b1 = b;",
|
| + " assert(a is String);",
|
| + " assert(b is String);",
|
| + " var a2 = a;",
|
| + " var b2 = b;",
|
| + " }",
|
| + " var a3 = a;",
|
| + " var b3 = b;",
|
| + "}",
|
| + "");
|
| + // we don't know type initially
|
| + assertInferredElementTypeString(testUnit, "a1", "<dynamic>");
|
| + assertInferredElementTypeString(testUnit, "b1", "<dynamic>");
|
| + // after "assert" all next statements know type
|
| + assertInferredElementTypeString(testUnit, "a2", "String");
|
| + assertInferredElementTypeString(testUnit, "b2", "String");
|
| + // we exited "if" Block, so "assert" may be was not executed, so we don't know type
|
| + assertInferredElementTypeString(testUnit, "a3", "<dynamic>");
|
| + assertInferredElementTypeString(testUnit, "b3", "<dynamic>");
|
| + }
|
|
|
| public void test_typesPropagation_field_inClass_final() throws Exception {
|
| analyzeLibrary(
|
|
|