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

Side by Side Diff: tests/lib/mirrors/mirrors_reader.dart

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

Powered by Google App Engine
This is Rietveld 408576698