| 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 63a43ab49173ee0e6f269a175dd06299fb376ef7..a6a0b02372605e406ea94ddeb7f3727fabba1552 100644
|
| --- a/tests/compiler/dart2js/cpa_inference_test.dart
|
| +++ b/tests/compiler/dart2js/cpa_inference_test.dart
|
| @@ -142,7 +142,12 @@ class AnalysisResult {
|
|
|
| const String CORELIB = r'''
|
| print(var obj) {}
|
| - abstract class num { operator +(x); operator *(x); operator -(x); }
|
| + abstract class num {
|
| + operator +(x);
|
| + operator *(x);
|
| + operator -(x);
|
| + operator ==(x);
|
| + }
|
| abstract class int extends num { }
|
| abstract class double extends num { }
|
| class bool {}
|
| @@ -636,25 +641,55 @@ testOperators() {
|
| result.checkNodeHasType('y', [result.string]);
|
| }
|
|
|
| +testSetIndexOperator() {
|
| + final String source = r"""
|
| + class A {
|
| + var witness1;
|
| + var witness2;
|
| + operator []=(i, x) { witness1 = i; witness2 = x; }
|
| + }
|
| + main() {
|
| + var x = new A()[42] = "abc";
|
| + x;
|
| + }
|
| + """;
|
| + AnalysisResult result = analyze(source);
|
| + result.checkNodeHasType('x', [result.string]);
|
| + // TODO(polux): the two following results should be [:[null, string:], see
|
| + // testFieldInitialization().
|
| + result.checkFieldHasType('A', 'witness1', [result.int]);
|
| + result.checkFieldHasType('A', 'witness2', [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;
|
| + var x1 = 1;
|
| + x1++;
|
| + var x2 = 1;
|
| + ++x2;
|
| + var x3 = 1;
|
| + x3 += 42;
|
| + var x4 = new A();
|
| + x4++;
|
| + var x5 = new A();
|
| + ++x5;
|
| + var x6 = new A();
|
| + x6 += true;
|
| +
|
| + x1; x2; x3; x4; x5; x6;
|
| }
|
| """;
|
| AnalysisResult result = analyze(source);
|
| result.checkNodeHasType('x1', [result.int]);
|
| result.checkNodeHasType('x2', [result.int]);
|
| - result.checkNodeHasType('x3', [result.string]);
|
| + result.checkNodeHasType('x3', [result.int]);
|
| result.checkNodeHasType('x4', [result.string]);
|
| + result.checkNodeHasType('x5', [result.string]);
|
| + result.checkNodeHasType('x6', [result.string]);
|
| }
|
|
|
|
|
| @@ -662,24 +697,58 @@ testCompoundOperators2() {
|
| final String source = r"""
|
| class A {
|
| var xx;
|
| + var yy;
|
| var witness1;
|
| var witness2;
|
| + var witness3;
|
| + var witness4;
|
|
|
| - A(this.xx);
|
| + A(this.xx, this.yy);
|
| get x { witness1 = "foo"; return xx; }
|
| - set x(y) { witness2 = "foo"; xx = y; }
|
| + set x(a) { witness2 = "foo"; xx = a; }
|
| + get y { witness3 = "foo"; return yy; }
|
| + set y(a) { witness4 = "foo"; yy = a; }
|
| }
|
| main () {
|
| - var a = new A(1);
|
| + var a = new A(1, 1);
|
| a.x++;
|
| + a.y++;
|
| }
|
| """;
|
| 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', 'yy', [result.int]);
|
| + // TODO(polux): the four following results should be [:[null, string]:], see
|
| + // testFieldInitialization().
|
| result.checkFieldHasType('A', 'witness1', [result.string]);
|
| result.checkFieldHasType('A', 'witness2', [result.string]);
|
| + result.checkFieldHasType('A', 'witness3', [result.string]);
|
| + result.checkFieldHasType('A', 'witness4', [result.string]);
|
| +}
|
| +
|
| +testInequality() {
|
| + final String source = r"""
|
| + class A {
|
| + var witness;
|
| + operator ==(x) { witness = "foo"; return "abc"; }
|
| + }
|
| + class B {
|
| + operator ==(x) { throw "error"; }
|
| + }
|
| + main() {
|
| + var foo = 1 != 2;
|
| + var bar = new A() != 2;
|
| + var baz = new B() != 2;
|
| + foo; bar; baz;
|
| + }
|
| + """;
|
| + AnalysisResult result = analyze(source);
|
| + result.checkNodeHasType('foo', [result.bool]);
|
| + result.checkNodeHasType('bar', [result.bool]);
|
| + result.checkNodeHasType('baz', []);
|
| + // TODO(polux): the following result should be [:[null, string]:], see
|
| + // fieldInitialization().
|
| + result.checkFieldHasType('A', 'witness', [result.string]);
|
| }
|
|
|
| testFieldInitialization() {
|
| @@ -761,6 +830,8 @@ void main() {
|
| testOperators();
|
| testCompoundOperators1();
|
| testCompoundOperators2();
|
| + testSetIndexOperator();
|
| + testInequality();
|
| // testFieldInitialization(); // TODO(polux)
|
| testSendWithWrongArity();
|
| testDynamicIsAbsorbing();
|
|
|