// 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 via a mixin, so check for that. if (cls.superinterfaces.isEmpty && object is List) { cls = cls.superclass!.superclass!.mixin; } // 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 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'); }