mirror of
https://github.com/dart-lang/sdk
synced 2024-09-16 01:21:07 +00:00
67797ef46f
Pure interfaces made `interface`s implementation classes which cannot/should not be extended made `final`. A class like `HasHMap` which provides the `Map` interface, and no implementation except factory constructors for internal implementations, is made `final`. Unified {List,Set,Map}{Base,Mixin} into their `Base` class. Deprecations are retained in comments for now, to be landed separately. Search for '// TODO: @Deprecated'. Tested: No new test, only adding restrictions on use. CoreLibraryReviewExempt: Everybody's on vacation, everybody everywhere. Change-Id: Ia83b8a3bb20b5b214546b328d4492de6658253db Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/288240 Reviewed-by: Aske Simon Christensen <askesc@google.com> Reviewed-by: Martin Kustermann <kustermann@google.com> Commit-Queue: Lasse Nielsen <lrn@google.com> Reviewed-by: Nate Bosch <nbosch@google.com>
70 lines
2.1 KiB
Dart
70 lines
2.1 KiB
Dart
// 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');
|
|
}
|