Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(30)

Unified Diff: compiler/javatests/com/google/dart/compiler/type/TypeAnalyzerCompilerTest.java

Issue 10871063: Infer and merge variable types with multiple assignments in conditional statements (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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(

Powered by Google App Engine
This is Rietveld 408576698