| // Copyright (c) 2014, 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. |
| |
| // @dart = 2.9 |
| |
| // Test that everything reachable from a [MirrorSystem] can be accessed. |
| |
| library test.mirrors.reader; |
| |
| import 'dart:mirrors'; |
| import 'package:expect/expect.dart'; |
| import 'mirrors_reader.dart'; |
| |
| class RuntimeMirrorsReader extends MirrorsReader { |
| final MirrorSystem mirrorSystem; |
| final String mirrorSystemType; |
| |
| RuntimeMirrorsReader(MirrorSystem mirrorSystem, |
| {bool verbose: false, bool includeStackTrace: false}) |
| : this.mirrorSystem = mirrorSystem, |
| this.mirrorSystemType = '${mirrorSystem.runtimeType}', |
| super(verbose: verbose, includeStackTrace: includeStackTrace); |
| |
| visitLibraryMirror(LibraryMirror mirror) { |
| super.visitLibraryMirror(mirror); |
| Expect.equals(mirror, mirrorSystem.libraries[mirror.uri]); |
| } |
| |
| visitClassMirror(ClassMirror mirror) { |
| super.visitClassMirror(mirror); |
| Expect.isNotNull(mirror.owner); |
| } |
| |
| bool allowUnsupported(var receiver, String tag, UnsupportedError exception) { |
| if (mirrorSystemType == '_MirrorSystem') { |
| // VM mirror system. |
| if (tag.endsWith('location')) { |
| return receiver is ParameterMirror; |
| } |
| } else if (mirrorSystemType == 'JsMirrorSystem') { |
| // Dart2js runtime mirror system. |
| if (tag.endsWith('.metadata')) { |
| return true; // Issue 10905. |
| } |
| } |
| return false; |
| } |
| |
| bool expectUnsupported(var receiver, String tag, UnsupportedError exception) { |
| // [DeclarationMirror.location] is intentionally not supported in runtime |
| // mirrors. |
| |
| if (mirrorSystemType == '_MirrorSystem') { |
| // VM mirror system. |
| } else if (mirrorSystemType == 'JsMirrorSystem') { |
| // Dart2js runtime mirror system. |
| if (receiver is DeclarationMirror && tag == 'location') { |
| return true; |
| } |
| } |
| return false; |
| } |
| } |
| |
| void main([List<String> arguments = const <String>[]]) { |
| MirrorSystem mirrors = currentMirrorSystem(); |
| MirrorsReader reader = new RuntimeMirrorsReader(mirrors, |
| verbose: arguments.contains('-v'), |
| includeStackTrace: arguments.contains('-s')); |
| reader.checkMirrorSystem(mirrors); |
| } |