Index: tests/compiler/dart2js/cpa_inference_test.dart |
diff --git a/tests/compiler/dart2js/cpa_inference_test.dart b/tests/compiler/dart2js/cpa_inference_test.dart |
index c52058119f23fefd9a31b2997f7584a2283d8163..a8db3d513305e96e2cd3c225c143ef7157e2eaf3 100644 |
--- a/tests/compiler/dart2js/cpa_inference_test.dart |
+++ b/tests/compiler/dart2js/cpa_inference_test.dart |
@@ -354,34 +354,40 @@ testGetters() { |
var x; |
A(this.x); |
get y => x; |
+ get z => y; |
} |
main() { |
var a = new A(42); |
var foo = a.x; |
var bar = a.y; |
- foo; bar; |
+ var baz = a.z; |
+ foo; bar; baz; |
} |
"""; |
AnalysisResult result = analyze(source); |
result.checkNodeHasType('foo', [result.int]); |
result.checkNodeHasType('bar', [result.int]); |
+ result.checkNodeHasType('baz', [result.int]); |
} |
testSetters() { |
final String source = r""" |
class A { |
var x; |
- A(this.x); |
- set y(a) { x = a; } |
+ var w; |
+ A(this.x, this.w); |
+ set y(a) { x = a; z = a; } |
+ set z(a) { w = a; } |
} |
main() { |
- var a = new A(42); |
+ var a = new A(42, 42); |
a.x = 'abc'; |
a.y = true; |
} |
"""; |
AnalysisResult result = analyze(source); |
result.checkFieldHasType('A', 'x', [result.int, result.string, result.bool]); |
+ result.checkFieldHasType('A', 'w', [result.int, result.bool]); |
} |
testNamedParameters() { |
@@ -521,6 +527,67 @@ testOperators() { |
result.checkNodeHasType('y', [result.string]); |
} |
+testCompoundOperators1() { |
+ final String source = r""" |
+ class A { |
+ operator +(x) => "foo"; |
+ } |
+ main() { |
+ var x1 = 1; x1++; |
+ var x2 = 1; ++x2; |
+ var x3 = new A(); x3++; |
+ var x4 = new A(); ++x4; |
+ |
+ x1; x2; x3; x4; |
+ } |
+ """; |
+ AnalysisResult result = analyze(source); |
+ result.checkNodeHasType('x1', [result.int]); |
+ result.checkNodeHasType('x2', [result.int]); |
+ result.checkNodeHasType('x3', [result.string]); |
+ result.checkNodeHasType('x4', [result.string]); |
+} |
+ |
+ |
+testCompoundOperators2() { |
+ final String source = r""" |
+ class A { |
+ var xx; |
+ var witness1; |
+ var witness2; |
+ |
+ A(this.xx); |
+ get x { witness1 = "foo"; return xx; } |
+ set x(y) { witness2 = "foo"; xx = y; } |
+ } |
+ main () { |
+ var a = new A(1); |
+ a.x++; |
+ } |
+ """; |
+ AnalysisResult result = analyze(source); |
+ result.checkFieldHasType('A', 'xx', [result.int]); |
+ // TODO(polux): the two following results should be {null, string}, see |
+ // fieldInitialization(). |
+ result.checkFieldHasType('A', 'witness1', [result.string]); |
+ result.checkFieldHasType('A', 'witness2', [result.string]); |
+} |
+ |
+testFieldInitialization() { |
+ final String source = r""" |
+ class A { |
+ var x; |
+ var y = 1; |
+ } |
+ main () { |
+ new A(); |
+ } |
+ """; |
+ AnalysisResult result = analyze(source); |
+ result.checkFieldHasType('A', 'x', [result.nullType]); |
+ result.checkFieldHasType('A', 'y', [result.int]); |
+} |
+ |
void main() { |
testLiterals(); |
testRedefinition(); |
@@ -544,4 +611,7 @@ void main() { |
// testNoReturn(); // right now we infer the empty type instead of null |
testArithmeticOperators(); |
testOperators(); |
+ testCompoundOperators1(); |
+ testCompoundOperators2(); |
+ // testFieldInitialization(); // TODO(polux) |
} |