|  | // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file | 
|  | // for details. All rights reserved. Use of this source code is governed by a | 
|  | // BSD-style license that can be found in the LICENSE file. | 
|  |  | 
|  | // Test for the evaluation order of getters and setters. | 
|  |  | 
|  | import 'package:expect/expect.dart'; | 
|  |  | 
|  | var trace; | 
|  |  | 
|  | class X { | 
|  | get b { | 
|  | trace.add('get b'); | 
|  | return new X(); | 
|  | } | 
|  |  | 
|  | set c(value) { | 
|  | trace.add('set c'); | 
|  | } | 
|  |  | 
|  | toString() { | 
|  | trace.add('toString'); | 
|  | return 'X'; | 
|  | } | 
|  |  | 
|  | get c { | 
|  | trace.add('get c'); | 
|  | return 42; | 
|  | } | 
|  |  | 
|  | get d { | 
|  | trace.add('get d'); | 
|  | return new X(); | 
|  | } | 
|  |  | 
|  | operator [](index) { | 
|  | trace.add('index'); | 
|  | return 42; | 
|  | } | 
|  |  | 
|  | operator []=(index, value) { | 
|  | trace.add('indexSet'); | 
|  | } | 
|  | } | 
|  |  | 
|  | main() { | 
|  | var x = new X(); | 
|  |  | 
|  | trace = []; | 
|  | x.b.c = '$x'; | 
|  | Expect.listEquals(['get b', 'toString', 'set c'], trace); | 
|  |  | 
|  | trace = []; | 
|  | x.b.c += '$x'.hashCode; | 
|  | Expect.listEquals(['get b', 'get c', 'toString', 'set c'], trace); | 
|  |  | 
|  | trace = []; | 
|  | x.b.c++; | 
|  | Expect.listEquals(['get b', 'get c', 'set c'], trace); | 
|  |  | 
|  | trace = []; | 
|  | x.b.d[42] = '$x'; | 
|  | Expect.listEquals(['get b', 'get d', 'toString', 'indexSet'], trace); | 
|  |  | 
|  | trace = []; | 
|  | x.b.d[42] += '$x'.hashCode; | 
|  | Expect.listEquals(['get b', 'get d', 'index', 'toString', 'indexSet'], trace); | 
|  |  | 
|  | trace = []; | 
|  | x.b.d[42]++; | 
|  | Expect.listEquals(['get b', 'get d', 'index', 'indexSet'], trace); | 
|  |  | 
|  | trace = []; | 
|  | ++x.b.d[42]; | 
|  | Expect.listEquals(['get b', 'get d', 'index', 'indexSet'], trace); | 
|  |  | 
|  | trace = []; | 
|  | x.b.d[x.c] *= '$x'.hashCode; | 
|  | Expect.listEquals( | 
|  | ['get b', 'get d', 'get c', 'index', 'toString', 'indexSet'], trace); | 
|  |  | 
|  | trace = []; | 
|  | x.b.c = x.d.c = '$x'; | 
|  | Expect.listEquals([ | 
|  | 'get b', | 
|  | 'get d', | 
|  | 'toString', | 
|  | 'set c', | 
|  | 'set c', | 
|  | ], trace); | 
|  |  | 
|  | trace = []; | 
|  | x.b.c = x.d[42] *= '$x'.hashCode; | 
|  | Expect.listEquals( | 
|  | ['get b', 'get d', 'index', 'toString', 'indexSet', 'set c'], trace); | 
|  |  | 
|  | trace = []; | 
|  | x.b.c = ++x.d.c; | 
|  | Expect.listEquals(['get b', 'get d', 'get c', 'set c', 'set c'], trace); | 
|  | } |