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

Side by Side Diff: tool/input_sdk/lib/mirrors/mirrors.dart

Issue 1186683005: dart:mirrors (Closed) Base URL: https://github.com/dart-lang/dev_compiler.git@master
Patch Set: Address comments Created 5 years, 6 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) 2013, 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 // For the purposes of the mirrors library, we adopt a naming
6 // convention with respect to getters and setters. Specifically, for
7 // some variable or field...
8 //
9 // var myField;
10 //
11 // ...the getter is named 'myField' and the setter is named
12 // 'myField='. This allows us to assign unique names to getters and
13 // setters for the purposes of member lookup.
14
15 /**
16 * Basic reflection in Dart,
17 * with support for introspection and dynamic evaluation.
18 *
19 * *Introspection* is that subset of reflection by which a running
20 * program can examine its own structure. For example, a function
21 * that prints out the names of all the members of an arbitrary object.
22 *
23 * *Dynamic evaluation* refers the ability to evaluate code that
24 * has not been literally specified at compile time, such as calling a method
25 * whose name is provided as an argument (because it is looked up
26 * in a database, or provided interactively by the user).
27 *
28 * ## How to interpret this library's documentation
29 *
30 * As a rule, the names of Dart declarations are represented using
31 * instances of class [Symbol]. Whenever the doc speaks of an object *s*
32 * of class [Symbol] denoting a name, it means the string that
33 * was used to construct *s*.
34 *
35 * The documentation frequently abuses notation with
36 * Dart pseudo-code such as [:o.x(a):], where
37 * o and a are defined to be objects; what is actually meant in these
38 * cases is [:o'.x(a'):] where *o'* and *a'* are Dart variables
39 * bound to *o* and *a* respectively. Furthermore, *o'* and *a'*
40 * are assumed to be fresh variables (meaning that they are
41 * distinct from any other variables in the program).
42 *
43 * Sometimes the documentation refers to *serializable* objects.
44 * An object is serializable across isolates if and only if it is an instance of
45 * num, bool, String, a list of objects that are serializable
46 * across isolates, or a map with keys and values that are all serializable acro ss
47 * isolates.
48 *
49 * ## Status: Unstable
50 *
51 * The dart:mirrors library is unstable and its API might change slightly as a
52 * result of user feedback. This library is platform dependent and therefore it
53 * has implementations for both dart2js and the Dart VM. Both are under
54 * development and may not support all operations yet.
55 */
56 library dart.mirrors;
57
58 /**
59 * A [MirrorSystem] is the main interface used to reflect on a set of
60 * associated libraries.
61 *
62 * At runtime each running isolate has a distinct [MirrorSystem].
63 *
64 * It is also possible to have a [MirrorSystem] which represents a set
65 * of libraries which are not running -- perhaps at compile-time. In
66 * this case, all available reflective functionality would be
67 * supported, but runtime functionality (such as invoking a function
68 * or inspecting the contents of a variable) would fail dynamically.
69 */
70 abstract class MirrorSystem {
71 /**
72 * Returns an immutable map from URIs to mirrors for all
73 * libraries known to this mirror system.
74 */
75 Map<Uri, LibraryMirror> get libraries;
76
77 /**
78 * Returns the unique library named [libraryName] if it exists.
79 *
80 * If no unique library exists, an error is thrown.
81 */
82 LibraryMirror findLibrary(Symbol libraryName) {
83 return libraries.values.singleWhere(
84 (library) => library.simpleName == libraryName);
85 }
86
87 /**
88 * A mirror on the isolate associated with this [MirrorSystem].
89 * This may be null if this mirror system is not running.
90 */
91 IsolateMirror get isolate;
92
93 /**
94 * A mirror on the [:dynamic:] type.
95 */
96 TypeMirror get dynamicType;
97
98 /**
99 * A mirror on the [:void:] type.
100 */
101 TypeMirror get voidType;
102
103 /**
104 * Returns the name of [symbol].
105 *
106 * The following text is non-normative:
107 *
108 * Using this method may result in larger output. If possible, use
109 * [MirrorsUsed] to specify which symbols must be retained in clear text.
110 */
111 external static String getName(Symbol symbol);
112
113 /**
114 * Returns a symbol for [name]. If [library] is not a [LibraryMirror] or if
115 * [name] is a private identifier and [library] is [:null:], throws an
116 * [ArgumentError]. If [name] is a private identifier, the symbol returned is
117 * with respect to [library].
118 *
119 * The following text is non-normative:
120 *
121 * Using this method may result in larger output. If possible, use
122 * the const constructor of Symbol or symbol literals.
123 */
124 external static Symbol getSymbol(String name, [LibraryMirror library]);
125 }
126
127 /**
128 * Returns a [MirrorSystem] for the current isolate.
129 */
130 external MirrorSystem currentMirrorSystem();
131
132 /**
133 * Reflects an instance.
134 * Returns an [InstanceMirror] reflecting [reflectee].
135 * If [reflectee] is a function or an instance of a class
136 * that has a [:call:] method, the returned instance mirror
137 * will be a [ClosureMirror].
138 *
139 * Note that since one cannot obtain an object from
140 * another isolate, this function can only be used to
141 * obtain mirrors on objects of the current isolate.
142 */
143 external InstanceMirror reflect(Object reflectee);
144
145 /**
146 * Reflects a class declaration.
147 * Let *C* be the original class declaration of the class
148 * represented by [key].
149 * This function returns a [ClassMirror] reflecting *C*.
150 *
151 * If [key] is not an instance of [Type] then this function
152 * throws an [ArgumentError]. If [key] is the Type for dynamic
153 * or a function typedef, throws an [ArgumentError].
154 *
155 * Note that since one cannot obtain a [Type] object from
156 * another isolate, this function can only be used to
157 * obtain class mirrors on classes of the current isolate.
158 */
159 external ClassMirror reflectClass(Type key);
160
161 /**
162 * This function returns a [TypeMirror] reflecting the type
163 * represented by [key].
164 *
165 * If [key] is not an instance of [Type] then this function
166 * throws an [ArgumentError].
167 *
168 * Note that since one cannot obtain a [Type] object from
169 * another isolate, this function can only be used to
170 * obtain type mirrors on types of the current isolate.
171 */
172 external TypeMirror reflectType(Type key);
173
174 /**
175 * A [Mirror] reflects some Dart language entity.
176 *
177 * Every [Mirror] originates from some [MirrorSystem].
178 */
179 abstract class Mirror {}
180
181 /**
182 * An [IsolateMirror] reflects an isolate.
183 */
184 abstract class IsolateMirror implements Mirror {
185 /**
186 * Returns a unique name used to refer to an isolate
187 * in debugging messages.
188 */
189 String get debugName;
190
191 /**
192 * Returns [:true:] if and only if this mirror reflects
193 * the currently running isolate. Otherwise returns
194 * [:false:].
195 */
196 bool get isCurrent;
197
198 /**
199 * Returns a [LibraryMirror] on the root library for this
200 * isolate.
201 */
202 LibraryMirror get rootLibrary;
203
204 /**
205 * Returns [:true:] if this mirror is equal to [other].
206 * Otherwise returns [:false:].
207 * The equality holds if and only if
208 * (1) [other] is a mirror of the same kind
209 * and
210 * (2) the isolate being reflected by this mirror is the same
211 * isolate being reflected by [other].
212 */
213 bool operator == (other);
214 }
215
216 /**
217 * A [DeclarationMirror] reflects some entity declared in a Dart program.
218 */
219 abstract class DeclarationMirror implements Mirror {
220 /**
221 * The simple name for this Dart language entity.
222 *
223 * The simple name is in most cases the the identifier name of the
224 * entity, such as 'method' for a method [:void method() {...}:] or
225 * 'mylibrary' for a [:library 'mylibrary';:] declaration.
226 */
227 Symbol get simpleName;
228
229 /**
230 * The fully-qualified name for this Dart language entity.
231 *
232 * This name is qualified by the name of the owner. For instance,
233 * the qualified name of a method 'method' in class 'Class' in
234 * library 'library' is 'library.Class.method'.
235 *
236 * Returns a [Symbol] constructed from a string representing the
237 * fully qualified name of the reflectee.
238 * Let *o* be the [owner] of this mirror, let *r* be the reflectee of
239 * this mirror, let *p* be the fully qualified
240 * name of the reflectee of *o*, and let *s* be the simple name of *r*
241 * computed by [simpleName].
242 * The fully qualified name of *r* is the
243 * concatenation of *p*, '.', and *s*.
244 *
245 * Because an isolate can contain more than one library with the same name (at
246 * different URIs), a fully-qualified name does not uniquely identify any
247 * language entity.
248 */
249 Symbol get qualifiedName;
250
251 /**
252 * A mirror on the owner of this Dart language entity. This is the declaration
253 * immediately surrounding the reflectee.
254 *
255 * For a library, the owner is [:null:].
256 * For a class declaration, typedef or top level function
257 * or variable, the owner is the enclosing library.
258 * For a mixin application *S with M*, the owner is the owner
259 * of *M*.
260 * For a constructor, the owner is the immediately enclosing class.
261 * For a method, instance variable or
262 * a static variable, the owner is the immediately enclosing class,
263 * unless the class is a mixin application *S with M*, in which case
264 * the owner is *M*. Note that *M* may be an invocation of a generic.
265 * For a parameter, local variable or local function the owner is the
266 * immediately enclosing function.
267 */
268 DeclarationMirror get owner;
269
270 /**
271 * Returns [:true:] if this declaration is considered private
272 * according to the Dart language specification.
273 * Always returns [: false :] if this declaration
274 * is a library.
275 * Otherwise return [:false:].
276 *
277 */
278 bool get isPrivate;
279
280 /**
281 * Is this declaration top-level?
282 *
283 * This is defined to be equivalent to:
284 * [:mirror.owner != null && mirror.owner is LibraryMirror:]
285 */
286 bool get isTopLevel;
287
288 /**
289 * The source location of this Dart language entity.
290 *
291 * This operation is optional and may return [:null:].
292 */
293 SourceLocation get location;
294
295 /**
296 * A list of the metadata associated with this declaration.
297 *
298 * Let *D* be the declaration this mirror reflects.
299 * If *D* is decorated with annotations *A1, ..., An*
300 * where *n > 0*, then for each annotation *Ai* associated
301 * with *D, 1 <= i <= n*, let *ci* be the constant object
302 * specified by *Ai*. Then this method returns a list whose
303 * members are instance mirrors on *c1, ..., cn*.
304 * If no annotations are associated with *D*, then
305 * an empty list is returned.
306 *
307 * If evaluating any of *c1, ..., cn* would cause a
308 * compilation error
309 * the effect is the same as if a non-reflective compilation error
310 * had been encountered.
311 */
312 List<InstanceMirror> get metadata;
313 }
314
315 /**
316 * An [ObjectMirror] is a common superinterface of [InstanceMirror],
317 * [ClassMirror], and [LibraryMirror] that represents their shared
318 * functionality.
319 *
320 * For the purposes of the mirrors library, these types are all
321 * object-like, in that they support method invocation and field
322 * access. Real Dart objects are represented by the [InstanceMirror]
323 * type.
324 *
325 * See [InstanceMirror], [ClassMirror], and [LibraryMirror].
326 */
327 abstract class ObjectMirror implements Mirror {
328
329 /**
330 * Invokes the named function and returns a mirror on the result.
331 *
332 * Let *o* be the object reflected by this mirror, let
333 * *f* be the simple name of the member denoted by [memberName],
334 * let *a1, ..., an* be the elements of [positionalArguments]
335 * let *k1, ..., km* be the identifiers denoted by the elements of
336 * [namedArguments.keys]
337 * and let *v1, ..., vm* be the elements of [namedArguments.values].
338 * Then this method will perform the method invocation
339 * *o.f(a1, ..., an, k1: v1, ..., km: vm)*
340 * in a scope that has access to the private members
341 * of *o* (if *o* is a class or library) or the private members of the
342 * class of *o* (otherwise).
343 * If the invocation returns a result *r*, this method returns
344 * the result of calling [reflect](*r*).
345 * If the invocation causes a compilation error
346 * the effect is the same as if a non-reflective compilation error
347 * had been encountered.
348 * If the invocation throws an exception *e* (that it does not catch)
349 * this method throws *e*.
350 */
351 /*
352 * TODO(turnidge): Handle ambiguous names.
353 * TODO(turnidge): Handle optional & named arguments.
354 */
355 InstanceMirror invoke(Symbol memberName,
356 List positionalArguments,
357 [Map<Symbol,dynamic> namedArguments]);
358
359 /**
360 * Invokes a getter and returns a mirror on the result. The getter
361 * can be the implicit getter for a field or a user-defined getter
362 * method.
363 *
364 * Let *o* be the object reflected by this mirror, let
365 * *f* be the simple name of the getter denoted by [fieldName],
366 * Then this method will perform the getter invocation
367 * *o.f*
368 * in a scope that has access to the private members
369 * of *o* (if *o* is a class or library) or the private members of the
370 * class of *o* (otherwise).
371 *
372 * If this mirror is an [InstanceMirror], and [fieldName] denotes an instance
373 * method on its reflectee, the result of the invocation is an instance
374 * mirror on a closure corresponding to that method.
375 *
376 * If this mirror is a [LibraryMirror], and [fieldName] denotes a top-level
377 * method in the corresponding library, the result of the invocation is an
378 * instance mirror on a closure corresponding to that method.
379 *
380 * If this mirror is a [ClassMirror], and [fieldName] denotes a static method
381 * in the corresponding class, the result of the invocation is an instance
382 * mirror on a closure corresponding to that method.
383 *
384 * If the invocation returns a result *r*, this method returns
385 * the result of calling [reflect](*r*).
386 * If the invocation causes a compilation error
387 * the effect is the same as if a non-reflective compilation error
388 * had been encountered.
389 * If the invocation throws an exception *e* (that it does not catch)
390 * this method throws *e*.
391 */
392 // TODO(ahe): Remove stuff about scope and private members. [fieldName] is a
393 // capability giving access to private members.
394 InstanceMirror getField(Symbol fieldName);
395
396 /**
397 * Invokes a setter and returns a mirror on the result. The setter
398 * may be either the implicit setter for a non-final field or a
399 * user-defined setter method.
400 *
401 * Let *o* be the object reflected by this mirror, let
402 * *f* be the simple name of the getter denoted by [fieldName],
403 * and let *a* be the object bound to [value].
404 * Then this method will perform the setter invocation
405 * *o.f = a*
406 * in a scope that has access to the private members
407 * of *o* (if *o* is a class or library) or the private members of the
408 * class of *o* (otherwise).
409 * If the invocation returns a result *r*, this method returns
410 * the result of calling [reflect]([value]).
411 * If the invocation causes a compilation error
412 * the effect is the same as if a non-reflective compilation error
413 * had been encountered.
414 * If the invocation throws an exception *e* (that it does not catch)
415 * this method throws *e*.
416 */
417 /* TODO(turnidge): Handle ambiguous names.*/
418 InstanceMirror setField(Symbol fieldName, Object value);
419 }
420
421 /**
422 * An [InstanceMirror] reflects an instance of a Dart language object.
423 */
424 abstract class InstanceMirror implements ObjectMirror {
425 /**
426 * A mirror on the type of the reflectee.
427 *
428 * Returns a mirror on the actual class of the reflectee.
429 * The class of the reflectee may differ from
430 * the object returned by invoking [runtimeType] on
431 * the reflectee.
432 */
433 ClassMirror get type;
434
435 /**
436 * Does [reflectee] contain the instance reflected by this mirror?
437 * This will always be true in the local case (reflecting instances
438 * in the same isolate), but only true in the remote case if this
439 * mirror reflects a simple value.
440 *
441 * A value is simple if one of the following holds:
442 * - the value is [:null:]
443 * - the value is of type [num]
444 * - the value is of type [bool]
445 * - the value is of type [String]
446 */
447 bool get hasReflectee;
448
449 /**
450 * If the [InstanceMirror] reflects an instance it is meaningful to
451 * have a local reference to, we provide access to the actual
452 * instance here.
453 *
454 * If you access [reflectee] when [hasReflectee] is false, an
455 * exception is thrown.
456 */
457 get reflectee;
458
459 /**
460 * Returns true if this mirror is equal to [other].
461 * The equality holds if and only if
462 * (1) [other] is a mirror of the same kind
463 * and
464 * (2) either
465 * (a) [hasReflectee] is true and so is
466 * [:identical(reflectee, other.reflectee):]
467 * or
468 * (b) the remote objects reflected by this mirror and
469 * by [other] are identical.
470 */
471 bool operator == (other);
472
473 /**
474 * Perform [invocation] on [reflectee].
475 * Equivalent to
476 *
477 * this.invoke(invocation.memberName,
478 * invocation.positionalArguments,
479 * invocation.namedArguments);
480 */
481 delegate(Invocation invocation);
482 }
483
484 /**
485 * A [ClosureMirror] reflects a closure.
486 *
487 * A [ClosureMirror] provides access to its captured variables and
488 * provides the ability to execute its reflectee.
489 */
490 abstract class ClosureMirror implements InstanceMirror {
491 /**
492 * A mirror on the function associated with this closure.
493 *
494 * The function associated with an implicit closure of a function is that
495 * function.
496 *
497 * The function associated with an instance of a class that has a [:call:]
498 * method is that [:call:] method.
499 *
500 * A Dart implementation might choose to create a class for each closure
501 * expression, in which case [:function:] would be the same as
502 * [:type.declarations[#call]:]. But the Dart language model does not require
503 * this. A more typical implementation involves a single closure class for
504 * each type signature, where the call method dispatches to a function held
505 * in the closure rather the call method
506 * directly implementing the closure body. So one cannot rely on closures from
507 * distinct closure expressions having distinct classes ([:type:]), but one
508 * can rely on them having distinct functions ([:function:]).
509 */
510 MethodMirror get function;
511
512 /**
513 * Executes the closure and returns a mirror on the result.
514 * Let *f* be the closure reflected by this mirror,
515 * let *a1, ..., an* be the elements of [positionalArguments]
516 * let *k1, ..., km* be the identifiers denoted by the elements of
517 * [namedArguments.keys]
518 * and let *v1, ..., vm* be the elements of [namedArguments.values].
519 * Then this method will perform the method invocation
520 * *f(a1, ..., an, k1: v1, ..., km: vm)*
521 * If the invocation returns a result *r*, this method returns
522 * the result of calling [reflect](*r*).
523 * If the invocation causes a compilation error
524 * the effect is the same as if a non-reflective compilation error
525 * had been encountered.
526 * If the invocation throws an exception *e* (that it does not catch)
527 * this method throws *e*.
528 */
529 InstanceMirror apply(List positionalArguments,
530 [Map<Symbol, dynamic> namedArguments]);
531 }
532
533 /**
534 * A [LibraryMirror] reflects a Dart language library, providing
535 * access to the variables, functions, and classes of the
536 * library.
537 */
538 abstract class LibraryMirror implements DeclarationMirror, ObjectMirror {
539 /**
540 * The absolute uri of the library.
541 */
542 Uri get uri;
543
544 /**
545 * Returns an immutable map of the declarations actually given in the library.
546 *
547 * This map includes all regular methods, getters, setters, fields, classes
548 * and typedefs actually declared in the library. The map is keyed by the
549 * simple names of the declarations.
550 */
551 Map<Symbol, DeclarationMirror> get declarations;
552
553 /**
554 * Returns [:true:] if this mirror is equal to [other].
555 * Otherwise returns [:false:].
556 *
557 * The equality holds if and only if
558 * (1) [other] is a mirror of the same kind
559 * and
560 * (2) The library being reflected by this mirror
561 * and the library being reflected by [other]
562 * are
563 * the same library in the same isolate.
564 */
565 bool operator ==(other);
566
567 /**
568 * Returns a list of the imports and exports in this library;
569 */
570 List<LibraryDependencyMirror> get libraryDependencies;
571 }
572
573 /// A mirror on an import or export declaration.
574 abstract class LibraryDependencyMirror implements Mirror {
575 /// Is `true` if this dependency is an import.
576 bool get isImport;
577
578 /// Is `true` if this dependency is an export.
579 bool get isExport;
580
581 /// Returns the library mirror of the library that imports or exports the
582 /// [targetLibrary].
583 LibraryMirror get sourceLibrary;
584
585 /// Returns the library mirror of the library that is imported or exported.
586 LibraryMirror get targetLibrary;
587
588 /// Returns the prefix if this is a prefixed import and `null` otherwise.
589 Symbol get prefix;
590
591 /// Returns the list of show/hide combinators on the import/export
592 /// declaration.
593 List<CombinatorMirror> get combinators;
594
595 /// Returns the source location for this import/export declaration.
596 SourceLocation get location;
597
598 List<InstanceMirror> get metadata;
599 }
600
601 /// A mirror on a show/hide combinator declared on a library dependency.
602 abstract class CombinatorMirror implements Mirror {
603 /// The list of identifiers on the combinator.
604 List<Symbol> get identifiers;
605
606 /// Is `true` if this is a 'show' combinator.
607 bool get isShow;
608
609 /// Is `true` if this is a 'hide' combinator.
610 bool get isHide;
611 }
612
613 /**
614 * A [TypeMirror] reflects a Dart language class, typedef,
615 * function type or type variable.
616 */
617 abstract class TypeMirror implements DeclarationMirror {
618 /**
619 * Returns true if this mirror reflects dynamic, a non-generic class or
620 * typedef, or an instantiated generic class or typedef in the current
621 * isolate. Otherwise, returns false.
622 */
623 bool get hasReflectedType;
624
625 /**
626 * If [:hasReflectedType:] returns true, returns the corresponding [Type].
627 * Otherwise, an [UnsupportedError] is thrown.
628 */
629 Type get reflectedType;
630
631 /**
632 * An immutable list with mirrors for all type variables for this type.
633 *
634 * If this type is a generic declaration or an invocation of a generic
635 * declaration, the returned list contains mirrors on the type variables
636 * declared in the original declaration.
637 * Otherwise, the returned list is empty.
638 *
639 * This list preserves the order of declaration of the type variables.
640 */
641 List<TypeVariableMirror> get typeVariables;
642
643 /**
644 * An immutable list with mirrors for all type arguments for
645 * this type.
646 *
647 * If the reflectee is an invocation of a generic class,
648 * the type arguments are the bindings of its type parameters.
649 * If the reflectee is the original declaration of a generic,
650 * it has no type arguments and this method returns an empty list.
651 * If the reflectee is not generic, then
652 * it has no type arguments and this method returns an empty list.
653 *
654 * This list preserves the order of declaration of the type variables.
655 */
656 List<TypeMirror> get typeArguments;
657
658 /**
659 * Is this the original declaration of this type?
660 *
661 * For most classes, they are their own original declaration. For
662 * generic classes, however, there is a distinction between the
663 * original class declaration, which has unbound type variables, and
664 * the instantiations of generic classes, which have bound type
665 * variables.
666 */
667 bool get isOriginalDeclaration;
668
669 /**
670 * A mirror on the original declaration of this type.
671 *
672 * For most classes, they are their own original declaration. For
673 * generic classes, however, there is a distinction between the
674 * original class declaration, which has unbound type variables, and
675 * the instantiations of generic classes, which have bound type
676 * variables.
677 */
678 TypeMirror get originalDeclaration;
679
680
681 /**
682 * Checks the subtype relationship, denoted by [:<::] in the language
683 * specification. This is the type relationship used in [:is:] test checks.
684 */
685 bool isSubtypeOf(TypeMirror other);
686
687 /**
688 * Checks the assignability relationship, denoted by [:<=>:] in the language
689 * specification. This is the type relationship tested on assignment in
690 * checked mode.
691 */
692 bool isAssignableTo(TypeMirror other);
693 }
694
695 /**
696 * A [ClassMirror] reflects a Dart language class.
697 */
698 abstract class ClassMirror implements TypeMirror, ObjectMirror {
699 /**
700 * A mirror on the superclass on the reflectee.
701 *
702 * If this type is [:Object:], the superclass will be null.
703 */
704 ClassMirror get superclass;
705
706 /**
707 * A list of mirrors on the superinterfaces of the reflectee.
708 */
709 List<ClassMirror> get superinterfaces;
710
711 /**
712 * Is the reflectee abstract?
713 */
714 bool get isAbstract;
715
716 /**
717 * Returns an immutable map of the declarations actually given in the class
718 * declaration.
719 *
720 * This map includes all regular methods, getters, setters, fields,
721 * constructors and type variables actually declared in the class. Both
722 * static and instance members are included, but no inherited members are
723 * included. The map is keyed by the simple names of the declarations.
724 *
725 * This does not include inherited members.
726 */
727 Map<Symbol, DeclarationMirror> get declarations;
728
729 /**
730 * Returns a map of the methods, getters and setters of an instance of the
731 * class.
732 *
733 * The intent is to capture those members that constitute the API of an
734 * instance. Hence fields are not included, but the getters and setters
735 * implicitly introduced by fields are included. The map includes methods,
736 * getters and setters that are inherited as well as those introduced by the
737 * class itself.
738 *
739 * The map is keyed by the simple names of the members.
740 */
741 Map<Symbol, MethodMirror> get instanceMembers;
742
743 /**
744 * Returns a map of the static methods, getters and setters of the class.
745 *
746 * The intent is to capture those members that constitute the API of a class.
747 * Hence fields are not included, but the getters and setters implicitly
748 * introduced by fields are included.
749 *
750 * The map is keyed by the simple names of the members.
751 */
752 Map<Symbol, MethodMirror> get staticMembers;
753
754
755 /**
756 * The mixin of this class.
757 * If this class is the result of a mixin application of the
758 * form S with M, returns a class mirror on M.
759 * Otherwise returns a class mirror on [reflectee].
760 */
761 ClassMirror get mixin;
762
763 // TODO(ahe): What about:
764 // /// Finds the instance member named [name] declared or inherited in the
765 // /// reflected class.
766 // DeclarationMirror instanceLookup(Symbol name);
767
768 /**
769 * Invokes the named constructor and returns a mirror on the result.
770 *
771 * Let *c* be the class reflected by this mirror
772 * let *a1, ..., an* be the elements of [positionalArguments]
773 * let *k1, ..., km* be the identifiers denoted by the elements of
774 * [namedArguments.keys]
775 * and let *v1, ..., vm* be the elements of [namedArguments.values].
776 * If [constructorName] was created from the empty string
777 * Then this method will execute the instance creation expression
778 * *new c(a1, ..., an, k1: v1, ..., km: vm)*
779 * in a scope that has access to the private members
780 * of *c*. Otherwise, let
781 * *f* be the simple name of the constructor denoted by [constructorName]
782 * Then this method will execute the instance creation expression
783 * *new c.f(a1, ..., an, k1: v1, ..., km: vm)*
784 * in a scope that has access to the private members
785 * of *c*.
786 * In either case:
787 * If the expression evaluates to a result *r*, this method returns
788 * the result of calling [reflect](*r*).
789 * If evaluating the expression causes a compilation error
790 * the effect is the same as if a non-reflective compilation error
791 * had been encountered.
792 * If evaluating the expression throws an exception *e*
793 * (that it does not catch)
794 * this method throws *e*.
795 */
796 InstanceMirror newInstance(Symbol constructorName,
797 List positionalArguments,
798 [Map<Symbol,dynamic> namedArguments]);
799
800 /**
801 * Returns [:true:] if this mirror is equal to [other].
802 * Otherwise returns [:false:].
803 *
804 * The equality holds if and only if
805 * (1) [other] is a mirror of the same kind
806 * and
807 * (2) This mirror and [other] reflect the same class.
808 *
809 * Note that if the reflected class is an invocation of
810 * a generic class,(2) implies that the reflected class
811 * and [other] have equal type arguments.
812 */
813 bool operator == (other);
814
815 /**
816 * Returns whether the class denoted by the receiver is a subclass of the
817 * class denoted by the argument.
818 *
819 * Note that the subclass relationship is reflexive.
820 */
821 bool isSubclassOf(ClassMirror other);
822 }
823
824 /**
825 * A [FunctionTypeMirror] represents the type of a function in the
826 * Dart language.
827 */
828 abstract class FunctionTypeMirror implements ClassMirror {
829 /**
830 * Returns the return type of the reflectee.
831 */
832 TypeMirror get returnType;
833
834 /**
835 * Returns a list of the parameter types of the reflectee.
836 */
837 List<ParameterMirror> get parameters;
838
839 /**
840 * A mirror on the [:call:] method for the reflectee.
841 */
842 // This is only here because in the past the VM did not implement a call
843 // method on closures.
844 MethodMirror get callMethod;
845 }
846
847 /**
848 * A [TypeVariableMirror] represents a type parameter of a generic
849 * type.
850 */
851 abstract class TypeVariableMirror extends TypeMirror {
852 /**
853 * A mirror on the type that is the upper bound of this type variable.
854 */
855 TypeMirror get upperBound;
856
857 /**
858 * Is the reflectee static?
859 *
860 * For the purposes of the mirrors library, type variables are considered
861 * non-static.
862 */
863 bool get isStatic;
864
865 /**
866 * Returns [:true:] if this mirror is equal to [other].
867 * Otherwise returns [:false:].
868 *
869 * The equality holds if and only if
870 * (1) [other] is a mirror of the same kind
871 * and
872 * (2) [:simpleName == other.simpleName:] and
873 * [:owner == other.owner:].
874 */
875 bool operator == (other);
876 }
877
878 /**
879 * A [TypedefMirror] represents a typedef in a Dart language program.
880 */
881 abstract class TypedefMirror implements TypeMirror {
882 /**
883 * The defining type for this typedef.
884 * If the the type referred to by the reflectee is a function type
885 * *F*, the result will be [:FunctionTypeMirror:] reflecting *F*
886 * which is abstract and has an abstract method [:call:] whose
887 * signature corresponds to *F*.
888 *
889 * For instance [:void f(int):] is the referent for [:typedef void f(int):].
890 */
891 FunctionTypeMirror get referent;
892 }
893
894 /**
895 * A [MethodMirror] reflects a Dart language function, method,
896 * constructor, getter, or setter.
897 */
898 abstract class MethodMirror implements DeclarationMirror {
899 /**
900 * A mirror on the return type for the reflectee.
901 */
902 TypeMirror get returnType;
903
904 /**
905 * The source code for the reflectee, if available. Otherwise null.
906 */
907 String get source;
908
909 /**
910 * A list of mirrors on the parameters for the reflectee.
911 */
912 List<ParameterMirror> get parameters;
913
914 /**
915 * A function is considered non-static iff it is permited to refer to 'this'.
916 *
917 * Note that generative constructors are considered non-static, whereas
918 * factory constructors are considered static.
919 */
920 bool get isStatic;
921
922 /**
923 * Is the reflectee abstract?
924 */
925 bool get isAbstract;
926
927 /**
928 * Returns true if the reflectee is synthetic, and returns false otherwise.
929 *
930 * A reflectee is synthetic if it is a getter or setter implicitly introduced
931 * for a field or Type, or if it is a constructor that was implicitly
932 * introduced as a default constructor or as part of a mixin application.
933 */
934 bool get isSynthetic;
935
936 /**
937 * Is the reflectee a regular function or method?
938 *
939 * A function or method is regular if it is not a getter, setter, or
940 * constructor. Note that operators, by this definition, are
941 * regular methods.
942 */
943 bool get isRegularMethod;
944
945 /**
946 * Is the reflectee an operator?
947 */
948 bool get isOperator;
949
950 /**
951 * Is the reflectee a getter?
952 */
953 bool get isGetter;
954
955 /**
956 * Is the reflectee a setter?
957 */
958 bool get isSetter;
959
960 /**
961 * Is the reflectee a constructor?
962 */
963 bool get isConstructor;
964
965 /**
966 * The constructor name for named constructors and factory methods.
967 *
968 * For unnamed constructors, this is the empty string. For
969 * non-constructors, this is the empty string.
970 *
971 * For example, [:'bar':] is the constructor name for constructor
972 * [:Foo.bar:] of type [:Foo:].
973 */
974 Symbol get constructorName;
975
976 /**
977 * Is the reflectee a const constructor?
978 */
979 bool get isConstConstructor;
980
981 /**
982 * Is the reflectee a generative constructor?
983 */
984 bool get isGenerativeConstructor;
985
986 /**
987 * Is the reflectee a redirecting constructor?
988 */
989 bool get isRedirectingConstructor;
990
991 /**
992 * Is the reflectee a factory constructor?
993 */
994 bool get isFactoryConstructor;
995
996 /**
997 * Returns true if this mirror is equal to [other].
998 *
999 * The equality holds if and only if
1000 * (1) [other] is a mirror of the same kind
1001 * and
1002 * (2) [:simpleName == other.simpleName:] and
1003 * [:owner == other.owner:].
1004 */
1005 bool operator == (other);
1006 }
1007
1008 /**
1009 * A [VariableMirror] reflects a Dart language variable declaration.
1010 */
1011 abstract class VariableMirror implements DeclarationMirror {
1012 /**
1013 * Returns a mirror on the type of the reflectee.
1014 */
1015 TypeMirror get type;
1016
1017 /**
1018 * Returns [:true:] if the reflectee is a static variable.
1019 * Otherwise returns [:false:].
1020 *
1021 * For the purposes of the mirror library, top-level variables are
1022 * implicitly declared static.
1023 */
1024 bool get isStatic;
1025
1026 /**
1027 * Returns [:true:] if the reflectee is a final variable.
1028 * Otherwise returns [:false:].
1029 */
1030 bool get isFinal;
1031
1032 /**
1033 * Returns [:true:] if the reflectee is declared [:const:].
1034 * Otherwise returns [:false:].
1035 */
1036 bool get isConst;
1037
1038 /**
1039 * Returns true if this mirror is equal to [other].
1040 *
1041 * The equality holds if and only if
1042 * (1) [other] is a mirror of the same kind
1043 * and
1044 * (2) [:simpleName == other.simpleName:] and
1045 * [:owner == other.owner:].
1046 */
1047 bool operator == (other);
1048 }
1049
1050 /**
1051 * A [ParameterMirror] reflects a Dart formal parameter declaration.
1052 */
1053 abstract class ParameterMirror implements VariableMirror {
1054 /**
1055 * A mirror on the type of this parameter.
1056 */
1057 TypeMirror get type;
1058
1059 /**
1060 * Returns [:true:] if the reflectee is an optional parameter.
1061 * Otherwise returns [:false:].
1062 */
1063 bool get isOptional;
1064
1065 /**
1066 * Returns [:true:] if the reflectee is a named parameter.
1067 * Otherwise returns [:false:].
1068 */
1069 bool get isNamed;
1070
1071 /**
1072 * Returns [:true:] if the reflectee has explicitly declared a default value.
1073 * Otherwise returns [:false:].
1074 */
1075 bool get hasDefaultValue;
1076
1077 /**
1078 * If this is a required parameter, returns [:null:]. Otherwise returns a
1079 * mirror on the default value for this parameter. If no default is declared
1080 * for an optional parameter, the default is [:null:] and a mirror on [:null:]
1081 * is returned.
1082 */
1083 InstanceMirror get defaultValue;
1084 }
1085
1086 /**
1087 * A [SourceLocation] describes the span of an entity in Dart source code.
1088 */
1089 abstract class SourceLocation {
1090 /**
1091 * The 1-based line number for this source location.
1092 *
1093 * A value of 0 means that the line number is unknown.
1094 */
1095 int get line;
1096
1097 /**
1098 * The 1-based column number for this source location.
1099 *
1100 * A value of 0 means that the column number is unknown.
1101 */
1102 int get column;
1103
1104 /**
1105 * Returns the URI where the source originated.
1106 */
1107 Uri get sourceUri;
1108 }
1109
1110 /**
1111 * Class used for encoding comments as metadata annotations.
1112 */
1113 class Comment {
1114 /**
1115 * The comment text as written in the source text.
1116 */
1117 final String text;
1118
1119 /**
1120 * The comment text without the start, end, and padding text.
1121 *
1122 * For example, if [text] is [: /** Comment text. */ :] then the [trimmedText]
1123 * is [: Comment text. :].
1124 */
1125 final String trimmedText;
1126
1127 /**
1128 * Is [:true:] if this comment is a documentation comment.
1129 *
1130 * That is, that the comment is either enclosed in [: /** ... */ :] or starts
1131 * with [: /// :].
1132 */
1133 final bool isDocComment;
1134
1135 const Comment(this.text, this.trimmedText, this.isDocComment);
1136 }
1137
1138 /**
1139 * Annotation describing how "dart:mirrors" is used (EXPERIMENTAL).
1140 *
1141 * When used as metadata on an import of "dart:mirrors" in library *L*, this
1142 * class describes how "dart:mirrors" is used by library *L* unless overridden.
1143 * See [override].
1144 *
1145 * The following text is non-normative:
1146 *
1147 * In some scenarios, for example, when minifying Dart code, or when generating
1148 * JavaScript code from a Dart program, the size and performance of the output
1149 * can suffer from use of reflection. In those cases, telling the compiler
1150 * what is used, can have a significant impact.
1151 *
1152 * Example usage:
1153 *
1154 * @MirrorsUsed(symbols: 'foo', override: '*')
1155 * import 'dart:mirrors';
1156 *
1157 * class Foo {
1158 * noSuchMethod(Invocation invocation) {
1159 * print(MirrorSystem.getName(invocation.memberName));
1160 * }
1161 * }
1162 *
1163 * main() {
1164 * new Foo().foo(); // Prints "foo".
1165 * new Foo().bar(); // Might print an arbitrary (mangled) name, "bar".
1166 * }
1167 */
1168 // TODO(ahe): Remove ", override: '*'" when it isn't necessary anymore.
1169 class MirrorsUsed {
1170 // Note: the fields of this class are untyped. This is because the most
1171 // convenient way to specify to specify symbols today is using a single
1172 // string. In some cases, a const list of classes might be convenient. Some
1173 // might prefer to use a const list of symbols.
1174
1175 /**
1176 * The list of strings passed to new [Symbol], and symbols that might be
1177 * passed to [MirrorSystem.getName].
1178 *
1179 * Combined with the names of [targets], [metaTargets] and their members,
1180 * this forms the complete list of strings passed to new [Symbol], and
1181 * symbols that might be passed to [MirrorSystem.getName] by the library to
1182 * which this metadata applies.
1183 *
1184 * The following text is non-normative:
1185 *
1186 * Specifying this option turns off the following warnings emitted by
1187 * dart2js:
1188 *
1189 * * Using "MirrorSystem.getName" may result in larger output.
1190 * * Using "new #{name}" may result in larger output.
1191 *
1192 * Use symbols = "*" to turn off the warnings mentioned above.
1193 *
1194 * For example, if using [noSuchMethod] to interact with a database, extract
1195 * all the possible column names and include them in this list. Similarly,
1196 * if using [noSuchMethod] to interact with another language (JavaScript, for
1197 * example) extract all the identifiers from API used and include them in
1198 * this list.
1199 */
1200 final symbols;
1201
1202 /**
1203 * A list of reflective targets.
1204 *
1205 * Combined with [metaTargets], this provides the complete list of reflective
1206 * targets used by the library to which this metadata applies.
1207 *
1208 * The following text is non-normative:
1209 *
1210 * For now, there is no formal description of what a reflective target is.
1211 * Informally, it is a list of things that are expected to have fully
1212 * functional mirrors.
1213 */
1214 final targets;
1215
1216 /**
1217 * A list of classes that when used as metadata indicates a reflective
1218 * target.
1219 *
1220 * See [targets].
1221 */
1222 final metaTargets;
1223
1224 /**
1225 * A list of library names or "*".
1226 *
1227 * When used as metadata on an import of "dart:mirrors", this metadata does
1228 * not apply to the library in which the annotation is used, but instead
1229 * applies to the other libraries (all libraries if "*" is used).
1230 */
1231 final override;
1232
1233 const MirrorsUsed(
1234 {this.symbols, this.targets, this.metaTargets, this.override});
1235 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698