OLD | NEW |
| (Empty) |
1 // Copyright (c) 2012, 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 LICENSE file. | |
4 | |
5 // Commented out until supported by VM. | |
6 // part of dart.mirrors; | |
7 | |
8 // For the purposes of the mirrors library, we adopt a naming | |
9 // convention with respect to getters and setters. Specifically, for | |
10 // some variable or field... | |
11 // | |
12 // var myField; | |
13 // | |
14 // ...the getter is named 'myField' and the setter is named | |
15 // 'myField='. This allows us to assign unique names to getters and | |
16 // setters for the purposes of member lookup. | |
17 | |
18 /** | |
19 * A [MirrorSystem] is the main interface used to reflect on a set of | |
20 * associated libraries. | |
21 * | |
22 * At runtime each running isolate has a distinct [MirrorSystem]. | |
23 * | |
24 * It is also possible to have a [MirrorSystem] which represents a set | |
25 * of libraries which are not running -- perhaps at compile-time. In | |
26 * this case, all available reflective functionality would be | |
27 * supported, but runtime functionality (such as invoking a function | |
28 * or inspecting the contents of a variable) would fail dynamically. | |
29 */ | |
30 abstract class MirrorSystem { | |
31 /** | |
32 * An immutable map from from library names to mirrors for all | |
33 * libraries known to this mirror system. | |
34 */ | |
35 Map<String, LibraryMirror> get libraries; | |
36 | |
37 /** | |
38 * A mirror on the isolate associated with this [MirrorSystem]. | |
39 * This may be null if this mirror system is not running. | |
40 */ | |
41 IsolateMirror get isolate; | |
42 | |
43 /** | |
44 * A mirror on the [:dynamic:] type. | |
45 */ | |
46 TypeMirror get dynamicType; | |
47 | |
48 /** | |
49 * A mirror on the [:void:] type. | |
50 */ | |
51 TypeMirror get voidType; | |
52 } | |
53 | |
54 /** | |
55 * Returns a [MirrorSystem] for the current isolate. | |
56 */ | |
57 MirrorSystem currentMirrorSystem() { | |
58 return _Mirrors.currentMirrorSystem(); | |
59 } | |
60 | |
61 /** | |
62 * Creates a [MirrorSystem] for the isolate which is listening on | |
63 * the [SendPort]. | |
64 */ | |
65 Future<MirrorSystem> mirrorSystemOf(SendPort port) { | |
66 return _Mirrors.mirrorSystemOf(port); | |
67 } | |
68 | |
69 /** | |
70 * Returns an [InstanceMirror] for some Dart language object. | |
71 * | |
72 * This only works if this mirror system is associated with the | |
73 * current running isolate. | |
74 */ | |
75 InstanceMirror reflect(Object reflectee) { | |
76 return _Mirrors.reflect(reflectee); | |
77 } | |
78 | |
79 /** | |
80 * A [Mirror] reflects some Dart language entity. | |
81 * | |
82 * Every [Mirror] originates from some [MirrorSystem]. | |
83 */ | |
84 abstract class Mirror { | |
85 /** | |
86 * The [MirrorSystem] that contains this mirror. | |
87 */ | |
88 MirrorSystem get mirrors; | |
89 } | |
90 | |
91 /** | |
92 * An [IsolateMirror] reflects an isolate. | |
93 */ | |
94 abstract class IsolateMirror implements Mirror { | |
95 /** | |
96 * A unique name used to refer to an isolate in debugging messages. | |
97 */ | |
98 String get debugName; | |
99 | |
100 /** | |
101 * Does this mirror reflect the currently running isolate? | |
102 */ | |
103 bool get isCurrent; | |
104 | |
105 /** | |
106 * A mirror on the root library for this isolate. | |
107 */ | |
108 LibraryMirror get rootLibrary; | |
109 } | |
110 | |
111 /** | |
112 * A [DeclarationMirror] reflects some entity declared in a Dart program. | |
113 */ | |
114 abstract class DeclarationMirror implements Mirror { | |
115 /** | |
116 * The simple name for this Dart language entity. | |
117 * | |
118 * The simple name is in most cases the the identifier name of the | |
119 * entity, such as 'method' for a method [:void method() {...}:] or | |
120 * 'mylibrary' for a [:#library('mylibrary');:] declaration. | |
121 */ | |
122 String get simpleName; | |
123 | |
124 /** | |
125 * The fully-qualified name for this Dart language entity. | |
126 * | |
127 * This name is qualified by the name of the owner. For instance, | |
128 * the qualified name of a method 'method' in class 'Class' in | |
129 * library 'library' is 'library.Class.method'. | |
130 * | |
131 * TODO(turnidge): Specify whether this name is unique. Currently | |
132 * this is a gray area due to lack of clarity over whether library | |
133 * names are unique. | |
134 */ | |
135 String get qualifiedName; | |
136 | |
137 /** | |
138 * A mirror on the owner of this function. This is the declaration | |
139 * immediately surrounding the reflectee. | |
140 * | |
141 * Note that for libraries, the owner will be [:null:]. | |
142 */ | |
143 DeclarationMirror get owner; | |
144 | |
145 /** | |
146 * Is this declaration private? | |
147 * | |
148 * Note that for libraries, this will be [:false:]. | |
149 */ | |
150 bool get isPrivate; | |
151 | |
152 /** | |
153 * Is this declaration top-level? | |
154 * | |
155 * This is defined to be equivalent to: | |
156 * [:mirror.owner != null && mirror.owner is LibraryMirror:] | |
157 */ | |
158 bool get isTopLevel; | |
159 | |
160 /** | |
161 * The source location of this Dart language entity. | |
162 */ | |
163 SourceLocation get location; | |
164 } | |
165 | |
166 /** | |
167 * An [ObjectMirror] is a common superinterface of [InstanceMirror], | |
168 * [ClassMirror], and [LibraryMirror] that represents their shared | |
169 * functionality. | |
170 * | |
171 * For the purposes of the mirrors library, these types are all | |
172 * object-like, in that they support method invocation and field | |
173 * access. Real Dart objects are represented by the [InstanceMirror] | |
174 * type. | |
175 * | |
176 * See [InstanceMirror], [ClassMirror], and [LibraryMirror]. | |
177 */ | |
178 abstract class ObjectMirror implements Mirror { | |
179 /** | |
180 * Invokes the named function and returns a mirror on the result. | |
181 * | |
182 * TODO(turnidge): Properly document. | |
183 * TODO(turnidge): Handle ambiguous names. | |
184 * TODO(turnidge): Handle optional & named arguments. | |
185 */ | |
186 Future<InstanceMirror> invoke(String memberName, | |
187 List<Object> positionalArguments, | |
188 [Map<String,Object> namedArguments]); | |
189 | |
190 /** | |
191 * Invokes a getter and returns a mirror on the result. The getter | |
192 * can be the implicit getter for a field or a user-defined getter | |
193 * method. | |
194 * | |
195 * TODO(turnidge): Handle ambiguous names. | |
196 */ | |
197 Future<InstanceMirror> getField(String fieldName); | |
198 | |
199 /** | |
200 * Invokes a setter and returns a mirror on the result. The setter | |
201 * may be either the implicit setter for a non-final field or a | |
202 * user-defined setter method. | |
203 * | |
204 * TODO(turnidge): Handle ambiguous names. | |
205 */ | |
206 Future<InstanceMirror> setField(String fieldName, Object value); | |
207 } | |
208 | |
209 /** | |
210 * An [InstanceMirror] reflects an instance of a Dart language object. | |
211 */ | |
212 abstract class InstanceMirror implements ObjectMirror { | |
213 /** | |
214 * A mirror on the type of the reflectee. | |
215 */ | |
216 ClassMirror get type; | |
217 | |
218 /** | |
219 * Does [reflectee] contain the instance reflected by this mirror? | |
220 * This will always be true in the local case (reflecting instances | |
221 * in the same isolate), but only true in the remote case if this | |
222 * mirror reflects a simple value. | |
223 * | |
224 * A value is simple if one of the following holds: | |
225 * - the value is null | |
226 * - the value is of type [num] | |
227 * - the value is of type [bool] | |
228 * - the value is of type [String] | |
229 */ | |
230 bool get hasReflectee; | |
231 | |
232 /** | |
233 * If the [InstanceMirror] reflects an instance it is meaningful to | |
234 * have a local reference to, we provide access to the actual | |
235 * instance here. | |
236 * | |
237 * If you access [reflectee] when [hasReflectee] is false, an | |
238 * exception is thrown. | |
239 */ | |
240 get reflectee; | |
241 } | |
242 | |
243 /** | |
244 * A [ClosureMirror] reflects a closure. | |
245 * | |
246 * A [ClosureMirror] provides access to its captured variables and | |
247 * provides the ability to execute its reflectee. | |
248 */ | |
249 abstract class ClosureMirror implements InstanceMirror { | |
250 /** | |
251 * A mirror on the function associated with this closure. | |
252 */ | |
253 MethodMirror get function; | |
254 | |
255 /** | |
256 * The source code for this closure, if available. Otherwise null. | |
257 * | |
258 * TODO(turnidge): Would this just be available in function? | |
259 */ | |
260 String get source; | |
261 | |
262 /** | |
263 * Executes the closure. The arguments given in the descriptor need to | |
264 * be InstanceMirrors or simple values. | |
265 * | |
266 * A value is simple if one of the following holds: | |
267 * - the value is null | |
268 * - the value is of type [num] | |
269 * - the value is of type [bool] | |
270 * - the value is of type [String] | |
271 */ | |
272 Future<InstanceMirror> apply(List<Object> positionalArguments, | |
273 [Map<String,Object> namedArguments]); | |
274 | |
275 /** | |
276 * Looks up the value of a name in the scope of the closure. The | |
277 * result is a mirror on that value. | |
278 */ | |
279 Future<InstanceMirror> findInContext(String name); | |
280 } | |
281 | |
282 /** | |
283 * A [LibraryMirror] reflects a Dart language library, providing | |
284 * access to the variables, functions, and classes of the | |
285 * library. | |
286 */ | |
287 abstract class LibraryMirror implements DeclarationMirror, ObjectMirror { | |
288 /** | |
289 * The url of the library. | |
290 * | |
291 * TODO(turnidge): Document where this url comes from. Will this | |
292 * value be sensible? | |
293 */ | |
294 String get url; | |
295 | |
296 /** | |
297 * An immutable map from from names to mirrors for all members in | |
298 * this library. | |
299 * | |
300 * The members of a library are its top-level classes, | |
301 * functions, variables, getters, and setters. | |
302 */ | |
303 Map<String, Mirror> get members; | |
304 | |
305 /** | |
306 * An immutable map from names to mirrors for all class | |
307 * declarations in this library. | |
308 */ | |
309 Map<String, ClassMirror> get classes; | |
310 | |
311 /** | |
312 * An immutable map from names to mirrors for all function, getter, | |
313 * and setter declarations in this library. | |
314 */ | |
315 Map<String, MethodMirror> get functions; | |
316 | |
317 /** | |
318 * An immutable map from names to mirrors for all getter | |
319 * declarations in this library. | |
320 */ | |
321 Map<String, MethodMirror> get getters; | |
322 | |
323 /** | |
324 * An immutable map from names to mirrors for all setter | |
325 * declarations in this library. | |
326 */ | |
327 Map<String, MethodMirror> get setters; | |
328 | |
329 /** | |
330 * An immutable map from names to mirrors for all variable | |
331 * declarations in this library. | |
332 */ | |
333 Map<String, VariableMirror> get variables; | |
334 } | |
335 | |
336 /** | |
337 * A [TypeMirror] reflects a Dart language class, typedef | |
338 * or type variable. | |
339 */ | |
340 abstract class TypeMirror implements DeclarationMirror { | |
341 } | |
342 | |
343 /** | |
344 * A [ClassMirror] reflects a Dart language class. | |
345 */ | |
346 abstract class ClassMirror implements TypeMirror, ObjectMirror { | |
347 /** | |
348 * A mirror on the superclass on the reflectee. | |
349 * | |
350 * If this type is [:Object:] or a typedef, the superClass will be | |
351 * null. | |
352 */ | |
353 ClassMirror get superclass; | |
354 | |
355 /** | |
356 * A list of mirrors on the superinterfaces of the reflectee. | |
357 */ | |
358 List<ClassMirror> get superinterfaces; | |
359 | |
360 /** | |
361 * An immutable map from from names to mirrors for all members of | |
362 * this type. | |
363 * | |
364 * The members of a type are its methods, fields, getters, and | |
365 * setters. Note that constructors and type variables are not | |
366 * considered to be members of a type. | |
367 * | |
368 * This does not include inherited members. | |
369 */ | |
370 Map<String, Mirror> get members; | |
371 | |
372 /** | |
373 * An immutable map from names to mirrors for all method, | |
374 * declarations for this type. This does not include getters and | |
375 * setters. | |
376 */ | |
377 Map<String, MethodMirror> get methods; | |
378 | |
379 /** | |
380 * An immutable map from names to mirrors for all getter | |
381 * declarations for this type. | |
382 */ | |
383 Map<String, MethodMirror> get getters; | |
384 | |
385 /** | |
386 * An immutable map from names to mirrors for all setter | |
387 * declarations for this type. | |
388 */ | |
389 Map<String, MethodMirror> get setters; | |
390 | |
391 /** | |
392 * An immutable map from names to mirrors for all variable | |
393 * declarations for this type. | |
394 */ | |
395 Map<String, VariableMirror> get variables; | |
396 | |
397 /** | |
398 * An immutable map from names to mirrors for all constructor | |
399 * declarations for this type. | |
400 */ | |
401 Map<String, MethodMirror> get constructors; | |
402 | |
403 /** | |
404 * An immutable map from names to mirrors for all type variables for | |
405 * this type. | |
406 * | |
407 * This map preserves the order of declaration of the type variables. | |
408 */ | |
409 Map<String, TypeVariableMirror> get typeVariables; | |
410 | |
411 /** | |
412 * An immutable map from names to mirrors for all type arguments for | |
413 * this type. | |
414 * | |
415 * This map preserves the order of declaration of the type variables. | |
416 */ | |
417 Map<String, TypeMirror> get typeArguments; | |
418 | |
419 /** | |
420 * Is this the original declaration of this type? | |
421 * | |
422 * For most classes, they are their own original declaration. For | |
423 * generic classes, however, there is a distinction between the | |
424 * original class declaration, which has unbound type variables, and | |
425 * the instantiations of generic classes, which have bound type | |
426 * variables. | |
427 */ | |
428 bool get isOriginalDeclaration; | |
429 | |
430 /** | |
431 * A mirror on the original declaration of this type. | |
432 * | |
433 * For most classes, they are their own original declaration. For | |
434 * generic classes, however, there is a distinction between the | |
435 * original class declaration, which has unbound type variables, and | |
436 * the instantiations of generic classes, which have bound type | |
437 * variables. | |
438 */ | |
439 ClassMirror get originalDeclaration; | |
440 | |
441 /** | |
442 * Invokes the named constructor and returns a mirror on the result. | |
443 * | |
444 * TODO(turnidge): Properly document. | |
445 */ | |
446 Future<InstanceMirror> newInstance(String constructorName, | |
447 List<Object> positionalArguments, | |
448 [Map<String,Object> namedArguments]); | |
449 | |
450 /** | |
451 * Does this mirror represent a class? | |
452 * | |
453 * TODO(turnidge): This functions goes away after the | |
454 * class/interface changes. | |
455 */ | |
456 bool get isClass; | |
457 | |
458 /** | |
459 * A mirror on the default factory class or null if there is none. | |
460 * | |
461 * TODO(turnidge): This functions goes away after the | |
462 * class/interface changes. | |
463 */ | |
464 ClassMirror get defaultFactory; | |
465 } | |
466 | |
467 /** | |
468 * A [FunctionTypeMirror] represents the type of a function in the | |
469 * Dart language. | |
470 */ | |
471 abstract class FunctionTypeMirror implements ClassMirror { | |
472 /** | |
473 * The return type of the reflectee. | |
474 */ | |
475 TypeMirror get returnType; | |
476 | |
477 /** | |
478 * A list of the parameter types of the reflectee. | |
479 */ | |
480 List<ParameterMirror> get parameters; | |
481 | |
482 /** | |
483 * A mirror on the [:call:] method for the reflectee. | |
484 * | |
485 * TODO(turnidge): What is this and what is it for? | |
486 */ | |
487 MethodMirror get callMethod; | |
488 } | |
489 | |
490 /** | |
491 * A [TypeVariableMirror] represents a type parameter of a generic | |
492 * type. | |
493 */ | |
494 abstract class TypeVariableMirror extends TypeMirror { | |
495 /** | |
496 * A mirror on the type that is the upper bound of this type variable. | |
497 */ | |
498 TypeMirror get upperBound; | |
499 } | |
500 | |
501 /** | |
502 * A [TypedefMirror] represents a typedef in a Dart language program. | |
503 */ | |
504 abstract class TypedefMirror implements ClassMirror { | |
505 /** | |
506 * The defining type for this typedef. | |
507 * | |
508 * For instance [:void f(int):] is the value for [:typedef void f(int):]. | |
509 */ | |
510 TypeMirror get value; | |
511 } | |
512 | |
513 /** | |
514 * A [MethodMirror] reflects a Dart language function, method, | |
515 * constructor, getter, or setter. | |
516 */ | |
517 abstract class MethodMirror implements DeclarationMirror { | |
518 /** | |
519 * A mirror on the return type for the reflectee. | |
520 */ | |
521 TypeMirror get returnType; | |
522 | |
523 /** | |
524 * A list of mirrors on the parameters for the reflectee. | |
525 */ | |
526 List<ParameterMirror> get parameters; | |
527 | |
528 /** | |
529 * Is the reflectee static? | |
530 * | |
531 * For the purposes of the mirrors library, a top-level function is | |
532 * considered static. | |
533 */ | |
534 bool get isStatic; | |
535 | |
536 /** | |
537 * Is the reflectee abstract? | |
538 */ | |
539 bool get isAbstract; | |
540 | |
541 /** | |
542 * Is the reflectee a regular function or method? | |
543 * | |
544 * A function or method is regular if it is not a getter, setter, or | |
545 * constructor. Note that operators, by this definition, are | |
546 * regular methods. | |
547 */ | |
548 bool get isRegularMethod; | |
549 | |
550 /** | |
551 * Is the reflectee an operator? | |
552 */ | |
553 bool get isOperator; | |
554 | |
555 /** | |
556 * Is the reflectee a getter? | |
557 */ | |
558 bool get isGetter; | |
559 | |
560 /** | |
561 * Is the reflectee a setter? | |
562 */ | |
563 bool get isSetter; | |
564 | |
565 /** | |
566 * Is the reflectee a constructor? | |
567 */ | |
568 bool get isConstructor; | |
569 | |
570 /** | |
571 * The constructor name for named constructors and factory methods. | |
572 * | |
573 * For unnamed constructors, this is the empty string. For | |
574 * non-constructors, this is the empty string. | |
575 * | |
576 * For example, [:'bar':] is the constructor name for constructor | |
577 * [:Foo.bar:] of type [:Foo:]. | |
578 */ | |
579 String get constructorName; | |
580 | |
581 /** | |
582 * Is the reflectee a const constructor? | |
583 */ | |
584 bool get isConstConstructor; | |
585 | |
586 /** | |
587 * Is the reflectee a generative constructor? | |
588 */ | |
589 bool get isGenerativeConstructor; | |
590 | |
591 /** | |
592 * Is the reflectee a redirecting constructor? | |
593 */ | |
594 bool get isRedirectingConstructor; | |
595 | |
596 /** | |
597 * Is the reflectee a factory constructor? | |
598 */ | |
599 bool get isFactoryConstructor; | |
600 } | |
601 | |
602 /** | |
603 * A [VariableMirror] reflects a Dart language variable declaration. | |
604 */ | |
605 abstract class VariableMirror implements DeclarationMirror { | |
606 /** | |
607 * A mirror on the type of the reflectee. | |
608 */ | |
609 TypeMirror get type; | |
610 | |
611 /** | |
612 * Is the reflectee a static variable? | |
613 * | |
614 * For the purposes of the mirror library, top-level variables are | |
615 * implicitly declared static. | |
616 */ | |
617 bool get isStatic; | |
618 | |
619 /** | |
620 * Is the reflectee a final variable? | |
621 */ | |
622 bool get isFinal; | |
623 } | |
624 | |
625 /** | |
626 * A [ParameterMirror] reflects a Dart formal parameter declaration. | |
627 */ | |
628 abstract class ParameterMirror implements VariableMirror { | |
629 /** | |
630 * A mirror on the type of this parameter. | |
631 */ | |
632 TypeMirror get type; | |
633 | |
634 /** | |
635 * Is this parameter optional? | |
636 */ | |
637 bool get isOptional; | |
638 | |
639 /** | |
640 * Is this parameter named? | |
641 */ | |
642 bool get isNamed; | |
643 | |
644 /** | |
645 * Does this parameter have a default value? | |
646 */ | |
647 bool get hasDefaultValue; | |
648 | |
649 /** | |
650 * A mirror on the default value for this parameter, if it exists. | |
651 * | |
652 * TODO(turnidge): String may not be a good representation of this | |
653 * at runtime. | |
654 */ | |
655 String get defaultValue; | |
656 } | |
657 | |
658 /** | |
659 * A [SourceLocation] describes the span of an entity in Dart source code. | |
660 */ | |
661 abstract class SourceLocation { | |
662 } | |
663 | |
664 /** | |
665 * When an error occurs during the mirrored execution of code, a | |
666 * [MirroredError] is thrown. | |
667 * | |
668 * In general, there are three main classes of failure that can happen | |
669 * during mirrored execution of code in some isolate: | |
670 * | |
671 * - An exception is thrown but not caught. This is caught by the | |
672 * mirrors framework and a [MirroredUncaughtExceptionError] is | |
673 * created and thrown. | |
674 * | |
675 * - A compile-time error occurs, such as a syntax error. This is | |
676 * suppressed by the mirrors framework and a | |
677 * [MirroredCompilationError] is created and thrown. | |
678 * | |
679 * - A truly fatal error occurs, causing the isolate to be exited. If | |
680 * the reflector and reflectee share the same isolate, then they | |
681 * will both suffer. If the reflector and reflectee are in distinct | |
682 * isolates, then we hope to provide some information about the | |
683 * isolate death, but this has yet to be implemented. | |
684 * | |
685 * TODO(turnidge): Specify the behavior for remote fatal errors. | |
686 */ | |
687 abstract class MirroredError implements Exception { | |
688 } | |
689 | |
690 /** | |
691 * When an uncaught exception occurs during the mirrored execution | |
692 * of code, a [MirroredUncaughtExceptionError] is thrown. | |
693 * | |
694 * This exception contains a mirror on the original exception object. | |
695 * It also contains an object which can be used to recover the | |
696 * stacktrace. | |
697 */ | |
698 class MirroredUncaughtExceptionError extends MirroredError { | |
699 MirroredUncaughtExceptionError(this.exception_mirror, | |
700 this.exception_string, | |
701 this.stacktrace) {} | |
702 | |
703 /** A mirror on the exception object. */ | |
704 final InstanceMirror exception_mirror; | |
705 | |
706 /** The result of toString() for the exception object. */ | |
707 final String exception_string; | |
708 | |
709 /** A stacktrace object for the uncaught exception. */ | |
710 final Object stacktrace; | |
711 | |
712 String toString() { | |
713 return | |
714 "Uncaught exception during mirrored execution: <${exception_string}>"; | |
715 } | |
716 } | |
717 | |
718 /** | |
719 * When a compile-time error occurs during the mirrored execution | |
720 * of code, a [MirroredCompilationError] is thrown. | |
721 * | |
722 * This exception includes the compile-time error message that would | |
723 * have been displayed to the user, if the function had not been | |
724 * invoked via mirror. | |
725 */ | |
726 class MirroredCompilationError extends MirroredError { | |
727 MirroredCompilationError(this.message) {} | |
728 | |
729 final String message; | |
730 | |
731 String toString() { | |
732 return "Compile-time error during mirrored execution: <$message>"; | |
733 } | |
734 } | |
735 | |
736 /** | |
737 * A [MirrorException] is used to indicate errors within the mirrors | |
738 * framework. | |
739 */ | |
740 class MirrorException implements Exception { | |
741 const MirrorException(String this._message); | |
742 String toString() => "MirrorException: '$_message'"; | |
743 final String _message; | |
744 } | |
OLD | NEW |