blob: dbf9daf812e64829697db184e05dac70d7e6a699 [file] [log] [blame]
// 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');
}