| // Copyright (c) 2015, 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. | 
 |  | 
 | import "package:expect/expect.dart"; | 
 |  | 
 | // It is sometimes possible to compile is-checks to 'instanceof', when the class | 
 | // is not in an 'implements' clause or used as a mixin. | 
 |  | 
 | // This test verifies is-checks work with simple classes that have various | 
 | // degrees of instantiation. | 
 |  | 
 | class INSTANTIATED {} // instantiated and used in many ways | 
 |  | 
 | class DEFERRED {} // instantiated after first check | 
 |  | 
 | class UNUSED {} // used only in is-check | 
 |  | 
 | class REMOVED {} // allocated but optimized out of program | 
 |  | 
 | class DEFERRED_AND_REMOVED {} // allocated after first check and removed | 
 |  | 
 | class USED_AS_TYPE_PARAMETER {} // only used as a type parameter | 
 |  | 
 | class USED_AS_TESTED_TYPE_PARAMETER {} // only used as a type parameter | 
 |  | 
 | class Check<T> { | 
 |   bool check(x) => x is T; | 
 | } | 
 |  | 
 | class Check2<T> { | 
 |   bool check(x) => x is USED_AS_TYPE_PARAMETER; | 
 | } | 
 |  | 
 | void main() { | 
 |   var things = []..length = 3; | 
 |   things.setRange(0, 3, [new INSTANTIATED(), 1, new Object()]); | 
 |  | 
 |   var checkX = new Check<INSTANTIATED>(); | 
 |   var checkU1 = new Check<USED_AS_TESTED_TYPE_PARAMETER>(); | 
 |   var checkU2 = new Check<USED_AS_TYPE_PARAMETER>(); | 
 |  | 
 |   var removed = new REMOVED(); // This is optimized out. | 
 |  | 
 |   // Tests that can be compiled to instanceof: | 
 |   Expect.isTrue(things[0] is INSTANTIATED); | 
 |   Expect.isFalse(things[1] is INSTANTIATED); | 
 |   Expect.isFalse(things[1] is REMOVED); | 
 |   Expect.isFalse(things[1] is DEFERRED_AND_REMOVED); | 
 |   Expect.isFalse(things[1] is DEFERRED); | 
 |   // Tests that might be optimized to false since there are no allocations: | 
 |   Expect.isFalse(things[1] is UNUSED); | 
 |   Expect.isFalse(things[1] is USED_AS_TYPE_PARAMETER); | 
 |  | 
 |   Expect.isTrue(checkX.check(things[0])); | 
 |   Expect.isFalse(checkX.check(things[1])); | 
 |   Expect.isFalse(checkU1.check(things[1])); | 
 |   Expect.isFalse(checkU2.check(things[1])); | 
 |  | 
 |   var removed2 = new DEFERRED_AND_REMOVED(); // This is optimized out. | 
 |  | 
 |   // First allocation of DEFERRED is after the above tests. | 
 |   things.setRange(0, 3, [new INSTANTIATED(), 1, new DEFERRED()]); | 
 |  | 
 |   // Tests that can be compiled to instanceof: | 
 |   Expect.isTrue(things[0] is INSTANTIATED); | 
 |   Expect.isFalse(things[1] is INSTANTIATED); | 
 |   Expect.isFalse(things[1] is REMOVED); | 
 |   Expect.isFalse(things[1] is DEFERRED_AND_REMOVED); | 
 |   Expect.isFalse(things[1] is DEFERRED); | 
 |   Expect.isTrue(things[2] is DEFERRED); | 
 |   // Tests that might be optimized to false since there are no allocations: | 
 |   Expect.isFalse(things[1] is UNUSED); | 
 |   Expect.isFalse(things[1] is USED_AS_TYPE_PARAMETER); | 
 | } |