|  | // 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. | 
|  |  | 
|  | // Ensure that objects handled specially by dart2js can be reflected on. | 
|  |  | 
|  | library test.intercepted_object_test; | 
|  |  | 
|  | import 'dart:mirrors'; | 
|  |  | 
|  | import 'stringify.dart' show stringify, expect; | 
|  |  | 
|  | import 'intercepted_class_test.dart' show checkClassMirrorMethods; | 
|  |  | 
|  | checkImplements(object, String name) { | 
|  | ClassMirror cls = reflect(object).type; | 
|  | checkClassMirrorMethods(cls); | 
|  |  | 
|  | // The VM implements List through an intermediate abstract class. | 
|  | if (cls.superinterfaces.isEmpty && object is List) { | 
|  | // THIS TEST ASSUMES A SPECIFIC TYPE HIERARCHY IN PLATFORM TYPES. | 
|  | // THE TEST IS FRAGILE TO UNRELATED CHANGES. | 
|  |  | 
|  | // Currently assumes the platform `[]` has a type hierarchy of | 
|  | // `_GrowableList` extends `ListBase`, `ListBase` implements `List` | 
|  | cls = cls.superclass!; | 
|  | } | 
|  |  | 
|  | // The VM implements String through an intermediate abstract | 
|  | // class. | 
|  | if (cls.superinterfaces.isEmpty && object is String) { | 
|  | cls = cls.superclass!; | 
|  | } | 
|  |  | 
|  | // The VM implements int through an intermediate abstract | 
|  | // class. | 
|  | if (object is int && | 
|  | stringify(cls.superclass!.simpleName) == 's(_IntegerImplementation)') { | 
|  | cls = cls.superclass!; | 
|  | } | 
|  |  | 
|  | List<ClassMirror> superinterfaces = cls.superinterfaces; | 
|  | String symName = 's($name)'; | 
|  | for (ClassMirror superinterface in superinterfaces) { | 
|  | print(superinterface.simpleName); | 
|  | if (symName == stringify(superinterface.simpleName)) { | 
|  | checkClassMirrorMethods(superinterface); | 
|  | return; | 
|  | } | 
|  | } | 
|  |  | 
|  | // A class implements itself, even if not explicitly declared. | 
|  | if (symName == stringify(cls.simpleName)) { | 
|  | checkClassMirrorMethods(cls); | 
|  | return; | 
|  | } | 
|  |  | 
|  | // TODO(floitsch): use correct fail | 
|  | expect(name, "super interface not found"); | 
|  | } | 
|  |  | 
|  | main() { | 
|  | checkImplements('', 'String'); | 
|  | checkImplements(1, 'int'); | 
|  | checkImplements(1.5, 'double'); | 
|  | checkImplements(true, 'bool'); | 
|  | checkImplements(false, 'bool'); | 
|  | checkImplements([], 'List'); | 
|  | } |