Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Side by Side Diff: test/codegen/lib/mirrors/mirrors_reader.dart

Issue 2265533002: Add mirrors tests (Closed) Base URL: https://github.com/dart-lang/dev_compiler.git@master
Patch Set: Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICESNE file.
4
5 library mirrors.reader;
6
7 import 'dart:mirrors';
8 import 'mirrors_visitor.dart';
9
10 class ReadError {
11 final String tag;
12 final exception;
13 final StackTrace stackTrace;
14
15 ReadError(this.tag, this.exception, this.stackTrace);
16 }
17
18 class MirrorsReader extends MirrorsVisitor {
19 /// Produce verbose output.
20 final bool verbose;
21 /// Include stack trace in the error report.
22 final bool includeStackTrace;
23
24 bool fatalError = false;
25 Set<Mirror> visited = new Set<Mirror>();
26 Set<TypeMirror> declarations = new Set<TypeMirror>();
27 Set<TypeMirror> instantiations = new Set<TypeMirror>();
28 List<ReadError> errors = <ReadError>[];
29 List<Mirror> queue = <Mirror>[];
30
31 MirrorsReader({this.verbose: false, this.includeStackTrace: false});
32
33 void checkMirrorSystem(MirrorSystem mirrorSystem) {
34 visitMirrorSystem(mirrorSystem);
35 if (!errors.isEmpty) {
36 Set<String> errorMessages = new Set<String>();
37 for (ReadError error in errors) {
38 String text = 'Mirrors read error: ${error.tag}=${error.exception}';
39 if (includeStackTrace) {
40 text = '$text\n${error.stackTrace}';
41 }
42 if (errorMessages.add(text)) {
43 print(text);
44 }
45 }
46 throw 'Unexpected errors occurred reading mirrors.';
47 }
48 }
49
50 // Skip mirrors so that each mirror is only visited once.
51 bool skipMirror(Mirror mirror) {
52 if (fatalError) return true;
53 if (mirror is TypeMirror) {
54 if (mirror.isOriginalDeclaration) {
55 // Visit the declation once.
56 return !declarations.add(mirror);
57 } else {
58 // Visit only one instantiation.
59 return !instantiations.add(mirror.originalDeclaration);
60 }
61 }
62 return !visited.add(mirror);
63 }
64
65 reportError(var receiver, String tag, var exception, StackTrace stackTrace) {
66 String errorTag = '${receiver.runtimeType}.$tag';
67 errors.add(new ReadError(errorTag, exception, stackTrace));
68 }
69
70 visitUnsupported(var receiver, String tag,
71 UnsupportedError exception,
72 StackTrace stackTrace) {
73 if (verbose) print('visitUnsupported:$receiver.$tag:$exception');
74 if (!expectUnsupported(receiver, tag, exception) &&
75 !allowUnsupported(receiver, tag, exception)) {
76 reportError(receiver, tag, exception, stackTrace);
77 }
78 }
79
80 /// Override to specify that access is expected to be unsupported.
81 bool expectUnsupported(var receiver, String tag,
82 UnsupportedError exception) => false;
83
84 /// Override to allow unsupported access.
85 bool allowUnsupported(var receiver, String tag,
86 UnsupportedError exception) => false;
87
88 /// Evaluates the function [f]. Subclasses can override this to handle
89 /// specific exceptions.
90 evaluate(f()) => f();
91
92 visit(var receiver, String tag, var value) {
93 if (value is Function) {
94 try {
95 var result = evaluate(value);
96 if (expectUnsupported(receiver, tag, null)) {
97 reportError(receiver, tag, 'Expected UnsupportedError.', null);
98 }
99 return visit(receiver, tag, result);
100 } on UnsupportedError catch (e, s) {
101 visitUnsupported(receiver, tag, e, s);
102 } on OutOfMemoryError catch (e, s) {
103 reportError(receiver, tag, e, s);
104 fatalError = true;
105 } on StackOverflowError catch (e, s) {
106 reportError(receiver, tag, e, s);
107 fatalError = true;
108 } catch (e, s) {
109 reportError(receiver, tag, e, s);
110 }
111 } else {
112 if (value is Mirror) {
113 if (!skipMirror(value)) {
114 if (verbose) print('visit:$receiver.$tag=$value');
115 bool drain = queue.isEmpty;
116 queue.add(value);
117 if (drain) {
118 while (!queue.isEmpty) {
119 visitMirror(queue.removeLast());
120 }
121 }
122 }
123 } else if (value is MirrorSystem) {
124 visitMirrorSystem(value);
125 } else if (value is SourceLocation) {
126 visitSourceLocation(value);
127 } else if (value is Iterable) {
128 // TODO(johnniwinther): Merge with `immutable_collections_test.dart`.
129 value.forEach((e) {
130 visit(receiver, tag, e);
131 });
132 } else if (value is Map) {
133 value.forEach((k, v) {
134 visit(receiver, tag, k);
135 visit(receiver, tag, v);
136 });
137 }
138 }
139 return value;
140 }
141
142 visitMirrorSystem(MirrorSystem mirrorSystem) {
143 visit(mirrorSystem, 'dynamicType', () => mirrorSystem.dynamicType);
144 visit(mirrorSystem, 'voidType', () => mirrorSystem.voidType);
145 visit(mirrorSystem, 'libraries', () => mirrorSystem.libraries);
146 }
147
148 visitClassMirror(ClassMirror mirror) {
149 super.visitClassMirror(mirror);
150 visit(mirror, 'declarations', () => mirror.declarations);
151 bool hasReflectedType =
152 visit(mirror, 'hasReflectedType', () => mirror.hasReflectedType);
153 visit(mirror, 'instanceMembers', () => mirror.instanceMembers);
154 visit(mirror, 'mixin', () => mirror.mixin);
155 if (hasReflectedType) {
156 visit(mirror, 'reflectedType', () => mirror.reflectedType);
157 }
158 visit(mirror, 'staticMembers', () => mirror.staticMembers);
159 visit(mirror, 'superclass', () => mirror.superclass);
160 visit(mirror, 'superinterfaces', () => mirror.superinterfaces);
161 }
162
163 visitDeclarationMirror(DeclarationMirror mirror) {
164 super.visitDeclarationMirror(mirror);
165 visit(mirror, 'isPrivate', () => mirror.isPrivate);
166 visit(mirror, 'isTopLevel', () => mirror.isTopLevel);
167 visit(mirror, 'location', () => mirror.location);
168 visit(mirror, 'metadata', () => mirror.metadata);
169 visit(mirror, 'owner', () => mirror.owner);
170 visit(mirror, 'qualifiedName', () => mirror.qualifiedName);
171 visit(mirror, 'simpleName', () => mirror.simpleName);
172 }
173
174 visitFunctionTypeMirror(FunctionTypeMirror mirror) {
175 super.visitFunctionTypeMirror(mirror);
176 visit(mirror, 'callMethod', () => mirror.callMethod);
177 visit(mirror, 'parameters', () => mirror.parameters);
178 visit(mirror, 'returnType', () => mirror.returnType);
179 }
180
181 visitInstanceMirror(InstanceMirror mirror) {
182 super.visitInstanceMirror(mirror);
183 bool hasReflectee =
184 visit(mirror, 'hasReflectee', () => mirror.hasReflectee);
185 if (hasReflectee) {
186 visit(mirror, 'reflectee', () => mirror.reflectee);
187 }
188 visit(mirror, 'type', () => mirror.type);
189 }
190
191 visitLibraryMirror(LibraryMirror mirror) {
192 super.visitLibraryMirror(mirror);
193 visit(mirror, 'declarations', () => mirror.declarations);
194 visit(mirror, 'uri', () => mirror.uri);
195 }
196
197 visitMethodMirror(MethodMirror mirror) {
198 super.visitMethodMirror(mirror);
199 visit(mirror, 'constructorName', () => mirror.constructorName);
200 visit(mirror, 'isAbstract', () => mirror.isAbstract);
201 visit(mirror, 'isConstConstructor', () => mirror.isConstConstructor);
202 visit(mirror, 'isConstructor', () => mirror.isConstructor);
203 visit(mirror, 'isFactoryConstructor',
204 () => mirror.isFactoryConstructor);
205 visit(mirror, 'isGenerativeConstructor',
206 () => mirror.isGenerativeConstructor);
207 visit(mirror, 'isGetter', () => mirror.isGetter);
208 visit(mirror, 'isOperator', () => mirror.isOperator);
209 visit(mirror, 'isRedirectingConstructor',
210 () => mirror.isRedirectingConstructor);
211 visit(mirror, 'isRegularMethod', () => mirror.isRegularMethod);
212 visit(mirror, 'isSetter', () => mirror.isSetter);
213 visit(mirror, 'isStatic', () => mirror.isStatic);
214 visit(mirror, 'isSynthetic', () => mirror.isSynthetic);
215 visit(mirror, 'parameters', () => mirror.parameters);
216 visit(mirror, 'returnType', () => mirror.returnType);
217 visit(mirror, 'source', () => mirror.source);
218 }
219
220 visitParameterMirror(ParameterMirror mirror) {
221 super.visitParameterMirror(mirror);
222 bool hasDefaultValue =
223 visit(mirror, 'hasDefaultValue', () => mirror.hasDefaultValue);
224 if (hasDefaultValue) {
225 visit(mirror, 'defaultValue', () => mirror.defaultValue);
226 }
227 visit(mirror, 'isNamed', () => mirror.isNamed);
228 visit(mirror, 'isOptional', () => mirror.isOptional);
229 visit(mirror, 'type', () => mirror.type);
230 }
231
232 visitSourceLocation(SourceLocation location) {
233
234 }
235
236 visitTypedefMirror(TypedefMirror mirror) {
237 super.visitTypedefMirror(mirror);
238 visit(mirror, 'referent', () => mirror.referent);
239 }
240
241 visitTypeMirror(TypeMirror mirror) {
242 super.visitTypeMirror(mirror);
243 visit(mirror, 'isOriginalDeclaration',
244 () => mirror.isOriginalDeclaration);
245 visit(mirror, 'originalDeclaration', () => mirror.originalDeclaration);
246 visit(mirror, 'typeArguments', () => mirror.typeArguments);
247 visit(mirror, 'typeVariables', () => mirror.typeVariables);
248 }
249
250 visitTypeVariableMirror(TypeVariableMirror mirror) {
251 super.visitTypeVariableMirror(mirror);
252 visit(mirror, 'upperBound', () => mirror.upperBound);
253 visit(mirror, 'isStatic', () => mirror.isStatic);
254 }
255
256 visitVariableMirror(VariableMirror mirror) {
257 super.visitVariableMirror(mirror);
258 visit(mirror, 'isConst', () => mirror.isConst);
259 visit(mirror, 'isFinal', () => mirror.isFinal);
260 visit(mirror, 'isStatic', () => mirror.isStatic);
261 visit(mirror, 'type', () => mirror.type);
262 }
263 }
OLDNEW
« no previous file with comments | « test/codegen/lib/mirrors/mirrors_nsm_test.dart ('k') | test/codegen/lib/mirrors/mirrors_reader_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698