| // 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. |
| |
| // Test that everything reachable from a [MirrorSystem] can be accessed. |
| |
| library test.mirrors.reader; |
| |
| import "dart:mirrors" hide SourceLocation; |
| |
| import "package:async_helper/async_helper.dart"; |
| |
| import "mirrors_test_helper.dart"; |
| import "../../../lib/mirrors/mirrors_reader.dart"; |
| import "package:compiler/src/diagnostics/spannable.dart"; |
| import "package:compiler/src/mirrors/dart2js_mirrors.dart"; |
| import "package:compiler/src/mirrors/source_mirrors.dart"; |
| |
| class SourceMirrorsReader extends MirrorsReader { |
| final Dart2JsMirrorSystem mirrorSystem; |
| |
| SourceMirrorsReader(this.mirrorSystem, |
| {bool verbose: false, bool includeStackTrace: false}) |
| : super(verbose: verbose, includeStackTrace: includeStackTrace); |
| |
| evaluate(f()) { |
| try { |
| return f(); |
| } on SpannableAssertionFailure catch (e) { |
| mirrorSystem.compiler.reportAssertionFailure(e); |
| rethrow; |
| } |
| } |
| |
| visitMirror(Mirror mirror) { |
| if (mirror is CombinatorMirror) { |
| visitCombinatorMirror(mirror); |
| } else if (mirror is LibraryDependencyMirror) { |
| visitLibraryDependencyMirror(mirror); |
| } else if (mirror is CommentInstanceMirror) { |
| visitCommentInstanceMirror(mirror); |
| } else if (mirror is ListInstanceMirror) { |
| visitListInstanceMirror(mirror); |
| } else if (mirror is MapInstanceMirror) { |
| visitMapInstanceMirror(mirror); |
| } else if (mirror is TypeInstanceMirror) { |
| visitTypeInstanceMirror(mirror); |
| } else { |
| super.visitMirror(mirror); |
| } |
| } |
| |
| visitDeclarationMirror(DeclarationSourceMirror mirror) { |
| super.visitDeclarationMirror(mirror); |
| visit(mirror, 'isNameSynthetic', () => mirror.isNameSynthetic); |
| } |
| |
| visitClassMirror(ClassSourceMirror mirror) { |
| super.visitClassMirror(mirror); |
| visit(mirror, 'isAbstract', () => mirror.isAbstract); |
| } |
| |
| visitLibraryMirror(LibrarySourceMirror mirror) { |
| super.visitLibraryMirror(mirror); |
| visit(mirror, 'libraryDependencies', () => mirror.libraryDependencies); |
| } |
| |
| visitParameterMirror(ParameterMirror mirror) { |
| super.visitParameterMirror(mirror); |
| if (mirror is ParameterSourceMirror) { |
| visit(mirror, 'isInitializingFormal', () => mirror.isInitializingFormal); |
| visit(mirror, 'initializedField', () => mirror.initializedField); |
| } |
| } |
| |
| visitTypeMirror(TypeSourceMirror mirror) { |
| super.visitTypeMirror(mirror); |
| visit(mirror, 'isVoid', () => mirror.isVoid); |
| visit(mirror, 'isDynamic', () => mirror.isDynamic); |
| } |
| |
| visitSourceLocation(SourceLocation location) { |
| super.visitSourceLocation(location); |
| visit(location, 'line', () => location.line); |
| visit(location, 'column', () => location.column); |
| visit(location, 'offset', () => location.offset); |
| visit(location, 'length', () => location.length); |
| visit(location, 'text', () => location.text); |
| visit(location, 'sourceUri', () => location.sourceUri); |
| visit(location, 'sourceText', () => location.sourceText); |
| } |
| |
| visitCombinatorMirror(CombinatorMirror mirror) { |
| visit(mirror, 'identifiers', () => mirror.identifiers); |
| visit(mirror, 'isShow', () => mirror.isShow); |
| visit(mirror, 'isHide', () => mirror.isHide); |
| } |
| |
| visitLibraryDependencyMirror(LibraryDependencyMirror mirror) { |
| visit(mirror, 'isImport', () => mirror.isImport); |
| visit(mirror, 'isExport', () => mirror.isExport); |
| visit(mirror, 'sourceLibrary', () => mirror.sourceLibrary); |
| visit(mirror, 'targetLibrary', () => mirror.targetLibrary); |
| visit(mirror, 'prefix', () => mirror.prefix); |
| visit(mirror, 'combinators', () => mirror.combinators); |
| visit(mirror, 'location', () => mirror.location); |
| } |
| |
| visitCommentInstanceMirror(CommentInstanceMirror mirror) { |
| visitInstanceMirror(mirror); |
| visit(mirror, 'text', () => mirror.text); |
| visit(mirror, 'trimmedText', () => mirror.trimmedText); |
| visit(mirror, 'isDocComment', () => mirror.isDocComment); |
| } |
| |
| visitListInstanceMirror(ListInstanceMirror mirror) { |
| visitInstanceMirror(mirror); |
| visit(mirror, 'length', () => mirror.length); |
| } |
| |
| visitMapInstanceMirror(MapInstanceMirror mirror) { |
| visitInstanceMirror(mirror); |
| visit(mirror, 'keys', () => mirror.keys); |
| visit(mirror, 'length', () => mirror.length); |
| } |
| |
| visitTypeInstanceMirror(TypeInstanceMirror mirror) { |
| visitInstanceMirror(mirror); |
| visit(mirror, 'representedType', () => mirror.representedType); |
| } |
| } |
| |
| main(List<String> arguments) { |
| asyncTest(() => analyzeUri(Uri.parse('dart:core')). |
| then((MirrorSystem mirrors) { |
| MirrorsReader reader = new SourceMirrorsReader(mirrors, |
| verbose: arguments.contains('-v'), |
| includeStackTrace: arguments.contains('-s')); |
| reader.checkMirrorSystem(mirrors); |
| })); |
| } |