Index: tool/input_sdk/lib/mirrors/mirrors.dart |
diff --git a/tool/input_sdk/lib/mirrors/mirrors.dart b/tool/input_sdk/lib/mirrors/mirrors.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..d16e62eecb7fc4e63e4518e7ffd4398b8c562fda |
--- /dev/null |
+++ b/tool/input_sdk/lib/mirrors/mirrors.dart |
@@ -0,0 +1,1235 @@ |
+// 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. |
+ |
+// For the purposes of the mirrors library, we adopt a naming |
+// convention with respect to getters and setters. Specifically, for |
+// some variable or field... |
+// |
+// var myField; |
+// |
+// ...the getter is named 'myField' and the setter is named |
+// 'myField='. This allows us to assign unique names to getters and |
+// setters for the purposes of member lookup. |
+ |
+/** |
+ * Basic reflection in Dart, |
+ * with support for introspection and dynamic evaluation. |
+ * |
+ * *Introspection* is that subset of reflection by which a running |
+ * program can examine its own structure. For example, a function |
+ * that prints out the names of all the members of an arbitrary object. |
+ * |
+ * *Dynamic evaluation* refers the ability to evaluate code that |
+ * has not been literally specified at compile time, such as calling a method |
+ * whose name is provided as an argument (because it is looked up |
+ * in a database, or provided interactively by the user). |
+ * |
+ * ## How to interpret this library's documentation |
+ * |
+ * As a rule, the names of Dart declarations are represented using |
+ * instances of class [Symbol]. Whenever the doc speaks of an object *s* |
+ * of class [Symbol] denoting a name, it means the string that |
+ * was used to construct *s*. |
+ * |
+ * The documentation frequently abuses notation with |
+ * Dart pseudo-code such as [:o.x(a):], where |
+ * o and a are defined to be objects; what is actually meant in these |
+ * cases is [:o'.x(a'):] where *o'* and *a'* are Dart variables |
+ * bound to *o* and *a* respectively. Furthermore, *o'* and *a'* |
+ * are assumed to be fresh variables (meaning that they are |
+ * distinct from any other variables in the program). |
+ * |
+ * Sometimes the documentation refers to *serializable* objects. |
+ * An object is serializable across isolates if and only if it is an instance of |
+ * num, bool, String, a list of objects that are serializable |
+ * across isolates, or a map with keys and values that are all serializable across |
+ * isolates. |
+ * |
+ * ## Status: Unstable |
+ * |
+ * The dart:mirrors library is unstable and its API might change slightly as a |
+ * result of user feedback. This library is platform dependent and therefore it |
+ * has implementations for both dart2js and the Dart VM. Both are under |
+ * development and may not support all operations yet. |
+ */ |
+library dart.mirrors; |
+ |
+/** |
+ * A [MirrorSystem] is the main interface used to reflect on a set of |
+ * associated libraries. |
+ * |
+ * At runtime each running isolate has a distinct [MirrorSystem]. |
+ * |
+ * It is also possible to have a [MirrorSystem] which represents a set |
+ * of libraries which are not running -- perhaps at compile-time. In |
+ * this case, all available reflective functionality would be |
+ * supported, but runtime functionality (such as invoking a function |
+ * or inspecting the contents of a variable) would fail dynamically. |
+ */ |
+abstract class MirrorSystem { |
+ /** |
+ * Returns an immutable map from URIs to mirrors for all |
+ * libraries known to this mirror system. |
+ */ |
+ Map<Uri, LibraryMirror> get libraries; |
+ |
+ /** |
+ * Returns the unique library named [libraryName] if it exists. |
+ * |
+ * If no unique library exists, an error is thrown. |
+ */ |
+ LibraryMirror findLibrary(Symbol libraryName) { |
+ return libraries.values.singleWhere( |
+ (library) => library.simpleName == libraryName); |
+ } |
+ |
+ /** |
+ * A mirror on the isolate associated with this [MirrorSystem]. |
+ * This may be null if this mirror system is not running. |
+ */ |
+ IsolateMirror get isolate; |
+ |
+ /** |
+ * A mirror on the [:dynamic:] type. |
+ */ |
+ TypeMirror get dynamicType; |
+ |
+ /** |
+ * A mirror on the [:void:] type. |
+ */ |
+ TypeMirror get voidType; |
+ |
+ /** |
+ * Returns the name of [symbol]. |
+ * |
+ * The following text is non-normative: |
+ * |
+ * Using this method may result in larger output. If possible, use |
+ * [MirrorsUsed] to specify which symbols must be retained in clear text. |
+ */ |
+ external static String getName(Symbol symbol); |
+ |
+ /** |
+ * Returns a symbol for [name]. If [library] is not a [LibraryMirror] or if |
+ * [name] is a private identifier and [library] is [:null:], throws an |
+ * [ArgumentError]. If [name] is a private identifier, the symbol returned is |
+ * with respect to [library]. |
+ * |
+ * The following text is non-normative: |
+ * |
+ * Using this method may result in larger output. If possible, use |
+ * the const constructor of Symbol or symbol literals. |
+ */ |
+ external static Symbol getSymbol(String name, [LibraryMirror library]); |
+} |
+ |
+/** |
+ * Returns a [MirrorSystem] for the current isolate. |
+ */ |
+external MirrorSystem currentMirrorSystem(); |
+ |
+/** |
+ * Reflects an instance. |
+ * Returns an [InstanceMirror] reflecting [reflectee]. |
+ * If [reflectee] is a function or an instance of a class |
+ * that has a [:call:] method, the returned instance mirror |
+ * will be a [ClosureMirror]. |
+ * |
+ * Note that since one cannot obtain an object from |
+ * another isolate, this function can only be used to |
+ * obtain mirrors on objects of the current isolate. |
+ */ |
+external InstanceMirror reflect(Object reflectee); |
+ |
+/** |
+ * Reflects a class declaration. |
+ * Let *C* be the original class declaration of the class |
+ * represented by [key]. |
+ * This function returns a [ClassMirror] reflecting *C*. |
+ * |
+ * If [key] is not an instance of [Type] then this function |
+ * throws an [ArgumentError]. If [key] is the Type for dynamic |
+ * or a function typedef, throws an [ArgumentError]. |
+ * |
+ * Note that since one cannot obtain a [Type] object from |
+ * another isolate, this function can only be used to |
+ * obtain class mirrors on classes of the current isolate. |
+ */ |
+external ClassMirror reflectClass(Type key); |
+ |
+/** |
+ * This function returns a [TypeMirror] reflecting the type |
+ * represented by [key]. |
+ * |
+ * If [key] is not an instance of [Type] then this function |
+ * throws an [ArgumentError]. |
+ * |
+ * Note that since one cannot obtain a [Type] object from |
+ * another isolate, this function can only be used to |
+ * obtain type mirrors on types of the current isolate. |
+ */ |
+external TypeMirror reflectType(Type key); |
+ |
+/** |
+ * A [Mirror] reflects some Dart language entity. |
+ * |
+ * Every [Mirror] originates from some [MirrorSystem]. |
+ */ |
+abstract class Mirror {} |
+ |
+/** |
+ * An [IsolateMirror] reflects an isolate. |
+ */ |
+abstract class IsolateMirror implements Mirror { |
+ /** |
+ * Returns a unique name used to refer to an isolate |
+ * in debugging messages. |
+ */ |
+ String get debugName; |
+ |
+ /** |
+ * Returns [:true:] if and only if this mirror reflects |
+ * the currently running isolate. Otherwise returns |
+ * [:false:]. |
+ */ |
+ bool get isCurrent; |
+ |
+ /** |
+ * Returns a [LibraryMirror] on the root library for this |
+ * isolate. |
+ */ |
+ LibraryMirror get rootLibrary; |
+ |
+ /** |
+ * Returns [:true:] if this mirror is equal to [other]. |
+ * Otherwise returns [:false:]. |
+ * The equality holds if and only if |
+ * (1) [other] is a mirror of the same kind |
+ * and |
+ * (2) the isolate being reflected by this mirror is the same |
+ * isolate being reflected by [other]. |
+ */ |
+ bool operator == (other); |
+} |
+ |
+/** |
+ * A [DeclarationMirror] reflects some entity declared in a Dart program. |
+ */ |
+abstract class DeclarationMirror implements Mirror { |
+ /** |
+ * The simple name for this Dart language entity. |
+ * |
+ * The simple name is in most cases the the identifier name of the |
+ * entity, such as 'method' for a method [:void method() {...}:] or |
+ * 'mylibrary' for a [:library 'mylibrary';:] declaration. |
+ */ |
+ Symbol get simpleName; |
+ |
+ /** |
+ * The fully-qualified name for this Dart language entity. |
+ * |
+ * This name is qualified by the name of the owner. For instance, |
+ * the qualified name of a method 'method' in class 'Class' in |
+ * library 'library' is 'library.Class.method'. |
+ * |
+ * Returns a [Symbol] constructed from a string representing the |
+ * fully qualified name of the reflectee. |
+ * Let *o* be the [owner] of this mirror, let *r* be the reflectee of |
+ * this mirror, let *p* be the fully qualified |
+ * name of the reflectee of *o*, and let *s* be the simple name of *r* |
+ * computed by [simpleName]. |
+ * The fully qualified name of *r* is the |
+ * concatenation of *p*, '.', and *s*. |
+ * |
+ * Because an isolate can contain more than one library with the same name (at |
+ * different URIs), a fully-qualified name does not uniquely identify any |
+ * language entity. |
+ */ |
+ Symbol get qualifiedName; |
+ |
+ /** |
+ * A mirror on the owner of this Dart language entity. This is the declaration |
+ * immediately surrounding the reflectee. |
+ * |
+ * For a library, the owner is [:null:]. |
+ * For a class declaration, typedef or top level function |
+ * or variable, the owner is the enclosing library. |
+ * For a mixin application *S with M*, the owner is the owner |
+ * of *M*. |
+ * For a constructor, the owner is the immediately enclosing class. |
+ * For a method, instance variable or |
+ * a static variable, the owner is the immediately enclosing class, |
+ * unless the class is a mixin application *S with M*, in which case |
+ * the owner is *M*. Note that *M* may be an invocation of a generic. |
+ * For a parameter, local variable or local function the owner is the |
+ * immediately enclosing function. |
+ */ |
+ DeclarationMirror get owner; |
+ |
+ /** |
+ * Returns [:true:] if this declaration is considered private |
+ * according to the Dart language specification. |
+ * Always returns [: false :] if this declaration |
+ * is a library. |
+ * Otherwise return [:false:]. |
+ * |
+ */ |
+ bool get isPrivate; |
+ |
+ /** |
+ * Is this declaration top-level? |
+ * |
+ * This is defined to be equivalent to: |
+ * [:mirror.owner != null && mirror.owner is LibraryMirror:] |
+ */ |
+ bool get isTopLevel; |
+ |
+ /** |
+ * The source location of this Dart language entity. |
+ * |
+ * This operation is optional and may return [:null:]. |
+ */ |
+ SourceLocation get location; |
+ |
+ /** |
+ * A list of the metadata associated with this declaration. |
+ * |
+ * Let *D* be the declaration this mirror reflects. |
+ * If *D* is decorated with annotations *A1, ..., An* |
+ * where *n > 0*, then for each annotation *Ai* associated |
+ * with *D, 1 <= i <= n*, let *ci* be the constant object |
+ * specified by *Ai*. Then this method returns a list whose |
+ * members are instance mirrors on *c1, ..., cn*. |
+ * If no annotations are associated with *D*, then |
+ * an empty list is returned. |
+ * |
+ * If evaluating any of *c1, ..., cn* would cause a |
+ * compilation error |
+ * the effect is the same as if a non-reflective compilation error |
+ * had been encountered. |
+ */ |
+ List<InstanceMirror> get metadata; |
+} |
+ |
+/** |
+ * An [ObjectMirror] is a common superinterface of [InstanceMirror], |
+ * [ClassMirror], and [LibraryMirror] that represents their shared |
+ * functionality. |
+ * |
+ * For the purposes of the mirrors library, these types are all |
+ * object-like, in that they support method invocation and field |
+ * access. Real Dart objects are represented by the [InstanceMirror] |
+ * type. |
+ * |
+ * See [InstanceMirror], [ClassMirror], and [LibraryMirror]. |
+ */ |
+abstract class ObjectMirror implements Mirror { |
+ |
+ /** |
+ * Invokes the named function and returns a mirror on the result. |
+ * |
+ * Let *o* be the object reflected by this mirror, let |
+ * *f* be the simple name of the member denoted by [memberName], |
+ * let *a1, ..., an* be the elements of [positionalArguments] |
+ * let *k1, ..., km* be the identifiers denoted by the elements of |
+ * [namedArguments.keys] |
+ * and let *v1, ..., vm* be the elements of [namedArguments.values]. |
+ * Then this method will perform the method invocation |
+ * *o.f(a1, ..., an, k1: v1, ..., km: vm)* |
+ * in a scope that has access to the private members |
+ * of *o* (if *o* is a class or library) or the private members of the |
+ * class of *o* (otherwise). |
+ * If the invocation returns a result *r*, this method returns |
+ * the result of calling [reflect](*r*). |
+ * If the invocation causes a compilation error |
+ * the effect is the same as if a non-reflective compilation error |
+ * had been encountered. |
+ * If the invocation throws an exception *e* (that it does not catch) |
+ * this method throws *e*. |
+ */ |
+ /* |
+ * TODO(turnidge): Handle ambiguous names. |
+ * TODO(turnidge): Handle optional & named arguments. |
+ */ |
+ InstanceMirror invoke(Symbol memberName, |
+ List positionalArguments, |
+ [Map<Symbol,dynamic> namedArguments]); |
+ |
+ /** |
+ * Invokes a getter and returns a mirror on the result. The getter |
+ * can be the implicit getter for a field or a user-defined getter |
+ * method. |
+ * |
+ * Let *o* be the object reflected by this mirror, let |
+ * *f* be the simple name of the getter denoted by [fieldName], |
+ * Then this method will perform the getter invocation |
+ * *o.f* |
+ * in a scope that has access to the private members |
+ * of *o* (if *o* is a class or library) or the private members of the |
+ * class of *o* (otherwise). |
+ * |
+ * If this mirror is an [InstanceMirror], and [fieldName] denotes an instance |
+ * method on its reflectee, the result of the invocation is an instance |
+ * mirror on a closure corresponding to that method. |
+ * |
+ * If this mirror is a [LibraryMirror], and [fieldName] denotes a top-level |
+ * method in the corresponding library, the result of the invocation is an |
+ * instance mirror on a closure corresponding to that method. |
+ * |
+ * If this mirror is a [ClassMirror], and [fieldName] denotes a static method |
+ * in the corresponding class, the result of the invocation is an instance |
+ * mirror on a closure corresponding to that method. |
+ * |
+ * If the invocation returns a result *r*, this method returns |
+ * the result of calling [reflect](*r*). |
+ * If the invocation causes a compilation error |
+ * the effect is the same as if a non-reflective compilation error |
+ * had been encountered. |
+ * If the invocation throws an exception *e* (that it does not catch) |
+ * this method throws *e*. |
+ */ |
+ // TODO(ahe): Remove stuff about scope and private members. [fieldName] is a |
+ // capability giving access to private members. |
+ InstanceMirror getField(Symbol fieldName); |
+ |
+ /** |
+ * Invokes a setter and returns a mirror on the result. The setter |
+ * may be either the implicit setter for a non-final field or a |
+ * user-defined setter method. |
+ * |
+ * Let *o* be the object reflected by this mirror, let |
+ * *f* be the simple name of the getter denoted by [fieldName], |
+ * and let *a* be the object bound to [value]. |
+ * Then this method will perform the setter invocation |
+ * *o.f = a* |
+ * in a scope that has access to the private members |
+ * of *o* (if *o* is a class or library) or the private members of the |
+ * class of *o* (otherwise). |
+ * If the invocation returns a result *r*, this method returns |
+ * the result of calling [reflect]([value]). |
+ * If the invocation causes a compilation error |
+ * the effect is the same as if a non-reflective compilation error |
+ * had been encountered. |
+ * If the invocation throws an exception *e* (that it does not catch) |
+ * this method throws *e*. |
+ */ |
+ /* TODO(turnidge): Handle ambiguous names.*/ |
+ InstanceMirror setField(Symbol fieldName, Object value); |
+} |
+ |
+/** |
+ * An [InstanceMirror] reflects an instance of a Dart language object. |
+ */ |
+abstract class InstanceMirror implements ObjectMirror { |
+ /** |
+ * A mirror on the type of the reflectee. |
+ * |
+ * Returns a mirror on the actual class of the reflectee. |
+ * The class of the reflectee may differ from |
+ * the object returned by invoking [runtimeType] on |
+ * the reflectee. |
+ */ |
+ ClassMirror get type; |
+ |
+ /** |
+ * Does [reflectee] contain the instance reflected by this mirror? |
+ * This will always be true in the local case (reflecting instances |
+ * in the same isolate), but only true in the remote case if this |
+ * mirror reflects a simple value. |
+ * |
+ * A value is simple if one of the following holds: |
+ * - the value is [:null:] |
+ * - the value is of type [num] |
+ * - the value is of type [bool] |
+ * - the value is of type [String] |
+ */ |
+ bool get hasReflectee; |
+ |
+ /** |
+ * If the [InstanceMirror] reflects an instance it is meaningful to |
+ * have a local reference to, we provide access to the actual |
+ * instance here. |
+ * |
+ * If you access [reflectee] when [hasReflectee] is false, an |
+ * exception is thrown. |
+ */ |
+ get reflectee; |
+ |
+ /** |
+ * Returns true if this mirror is equal to [other]. |
+ * The equality holds if and only if |
+ * (1) [other] is a mirror of the same kind |
+ * and |
+ * (2) either |
+ * (a) [hasReflectee] is true and so is |
+ * [:identical(reflectee, other.reflectee):] |
+ * or |
+ * (b) the remote objects reflected by this mirror and |
+ * by [other] are identical. |
+ */ |
+ bool operator == (other); |
+ |
+ /** |
+ * Perform [invocation] on [reflectee]. |
+ * Equivalent to |
+ * |
+ * this.invoke(invocation.memberName, |
+ * invocation.positionalArguments, |
+ * invocation.namedArguments); |
+ */ |
+ delegate(Invocation invocation); |
+} |
+ |
+/** |
+ * A [ClosureMirror] reflects a closure. |
+ * |
+ * A [ClosureMirror] provides access to its captured variables and |
+ * provides the ability to execute its reflectee. |
+ */ |
+abstract class ClosureMirror implements InstanceMirror { |
+ /** |
+ * A mirror on the function associated with this closure. |
+ * |
+ * The function associated with an implicit closure of a function is that |
+ * function. |
+ * |
+ * The function associated with an instance of a class that has a [:call:] |
+ * method is that [:call:] method. |
+ * |
+ * A Dart implementation might choose to create a class for each closure |
+ * expression, in which case [:function:] would be the same as |
+ * [:type.declarations[#call]:]. But the Dart language model does not require |
+ * this. A more typical implementation involves a single closure class for |
+ * each type signature, where the call method dispatches to a function held |
+ * in the closure rather the call method |
+ * directly implementing the closure body. So one cannot rely on closures from |
+ * distinct closure expressions having distinct classes ([:type:]), but one |
+ * can rely on them having distinct functions ([:function:]). |
+ */ |
+ MethodMirror get function; |
+ |
+ /** |
+ * Executes the closure and returns a mirror on the result. |
+ * Let *f* be the closure reflected by this mirror, |
+ * let *a1, ..., an* be the elements of [positionalArguments] |
+ * let *k1, ..., km* be the identifiers denoted by the elements of |
+ * [namedArguments.keys] |
+ * and let *v1, ..., vm* be the elements of [namedArguments.values]. |
+ * Then this method will perform the method invocation |
+ * *f(a1, ..., an, k1: v1, ..., km: vm)* |
+ * If the invocation returns a result *r*, this method returns |
+ * the result of calling [reflect](*r*). |
+ * If the invocation causes a compilation error |
+ * the effect is the same as if a non-reflective compilation error |
+ * had been encountered. |
+ * If the invocation throws an exception *e* (that it does not catch) |
+ * this method throws *e*. |
+ */ |
+ InstanceMirror apply(List positionalArguments, |
+ [Map<Symbol, dynamic> namedArguments]); |
+} |
+ |
+/** |
+ * A [LibraryMirror] reflects a Dart language library, providing |
+ * access to the variables, functions, and classes of the |
+ * library. |
+ */ |
+abstract class LibraryMirror implements DeclarationMirror, ObjectMirror { |
+ /** |
+ * The absolute uri of the library. |
+ */ |
+ Uri get uri; |
+ |
+ /** |
+ * Returns an immutable map of the declarations actually given in the library. |
+ * |
+ * This map includes all regular methods, getters, setters, fields, classes |
+ * and typedefs actually declared in the library. The map is keyed by the |
+ * simple names of the declarations. |
+ */ |
+ Map<Symbol, DeclarationMirror> get declarations; |
+ |
+ /** |
+ * Returns [:true:] if this mirror is equal to [other]. |
+ * Otherwise returns [:false:]. |
+ * |
+ * The equality holds if and only if |
+ * (1) [other] is a mirror of the same kind |
+ * and |
+ * (2) The library being reflected by this mirror |
+ * and the library being reflected by [other] |
+ * are |
+ * the same library in the same isolate. |
+ */ |
+ bool operator ==(other); |
+ |
+ /** |
+ * Returns a list of the imports and exports in this library; |
+ */ |
+ List<LibraryDependencyMirror> get libraryDependencies; |
+} |
+ |
+/// A mirror on an import or export declaration. |
+abstract class LibraryDependencyMirror implements Mirror { |
+ /// Is `true` if this dependency is an import. |
+ bool get isImport; |
+ |
+ /// Is `true` if this dependency is an export. |
+ bool get isExport; |
+ |
+ /// Returns the library mirror of the library that imports or exports the |
+ /// [targetLibrary]. |
+ LibraryMirror get sourceLibrary; |
+ |
+ /// Returns the library mirror of the library that is imported or exported. |
+ LibraryMirror get targetLibrary; |
+ |
+ /// Returns the prefix if this is a prefixed import and `null` otherwise. |
+ Symbol get prefix; |
+ |
+ /// Returns the list of show/hide combinators on the import/export |
+ /// declaration. |
+ List<CombinatorMirror> get combinators; |
+ |
+ /// Returns the source location for this import/export declaration. |
+ SourceLocation get location; |
+ |
+ List<InstanceMirror> get metadata; |
+} |
+ |
+/// A mirror on a show/hide combinator declared on a library dependency. |
+abstract class CombinatorMirror implements Mirror { |
+ /// The list of identifiers on the combinator. |
+ List<Symbol> get identifiers; |
+ |
+ /// Is `true` if this is a 'show' combinator. |
+ bool get isShow; |
+ |
+ /// Is `true` if this is a 'hide' combinator. |
+ bool get isHide; |
+} |
+ |
+/** |
+ * A [TypeMirror] reflects a Dart language class, typedef, |
+ * function type or type variable. |
+ */ |
+abstract class TypeMirror implements DeclarationMirror { |
+ /** |
+ * Returns true if this mirror reflects dynamic, a non-generic class or |
+ * typedef, or an instantiated generic class or typedef in the current |
+ * isolate. Otherwise, returns false. |
+ */ |
+ bool get hasReflectedType; |
+ |
+ /** |
+ * If [:hasReflectedType:] returns true, returns the corresponding [Type]. |
+ * Otherwise, an [UnsupportedError] is thrown. |
+ */ |
+ Type get reflectedType; |
+ |
+ /** |
+ * An immutable list with mirrors for all type variables for this type. |
+ * |
+ * If this type is a generic declaration or an invocation of a generic |
+ * declaration, the returned list contains mirrors on the type variables |
+ * declared in the original declaration. |
+ * Otherwise, the returned list is empty. |
+ * |
+ * This list preserves the order of declaration of the type variables. |
+ */ |
+ List<TypeVariableMirror> get typeVariables; |
+ |
+ /** |
+ * An immutable list with mirrors for all type arguments for |
+ * this type. |
+ * |
+ * If the reflectee is an invocation of a generic class, |
+ * the type arguments are the bindings of its type parameters. |
+ * If the reflectee is the original declaration of a generic, |
+ * it has no type arguments and this method returns an empty list. |
+ * If the reflectee is not generic, then |
+ * it has no type arguments and this method returns an empty list. |
+ * |
+ * This list preserves the order of declaration of the type variables. |
+ */ |
+ List<TypeMirror> get typeArguments; |
+ |
+ /** |
+ * Is this the original declaration of this type? |
+ * |
+ * For most classes, they are their own original declaration. For |
+ * generic classes, however, there is a distinction between the |
+ * original class declaration, which has unbound type variables, and |
+ * the instantiations of generic classes, which have bound type |
+ * variables. |
+ */ |
+ bool get isOriginalDeclaration; |
+ |
+ /** |
+ * A mirror on the original declaration of this type. |
+ * |
+ * For most classes, they are their own original declaration. For |
+ * generic classes, however, there is a distinction between the |
+ * original class declaration, which has unbound type variables, and |
+ * the instantiations of generic classes, which have bound type |
+ * variables. |
+ */ |
+ TypeMirror get originalDeclaration; |
+ |
+ |
+ /** |
+ * Checks the subtype relationship, denoted by [:<::] in the language |
+ * specification. This is the type relationship used in [:is:] test checks. |
+ */ |
+ bool isSubtypeOf(TypeMirror other); |
+ |
+ /** |
+ * Checks the assignability relationship, denoted by [:<=>:] in the language |
+ * specification. This is the type relationship tested on assignment in |
+ * checked mode. |
+ */ |
+ bool isAssignableTo(TypeMirror other); |
+} |
+ |
+/** |
+ * A [ClassMirror] reflects a Dart language class. |
+ */ |
+abstract class ClassMirror implements TypeMirror, ObjectMirror { |
+ /** |
+ * A mirror on the superclass on the reflectee. |
+ * |
+ * If this type is [:Object:], the superclass will be null. |
+ */ |
+ ClassMirror get superclass; |
+ |
+ /** |
+ * A list of mirrors on the superinterfaces of the reflectee. |
+ */ |
+ List<ClassMirror> get superinterfaces; |
+ |
+ /** |
+ * Is the reflectee abstract? |
+ */ |
+ bool get isAbstract; |
+ |
+ /** |
+ * Returns an immutable map of the declarations actually given in the class |
+ * declaration. |
+ * |
+ * This map includes all regular methods, getters, setters, fields, |
+ * constructors and type variables actually declared in the class. Both |
+ * static and instance members are included, but no inherited members are |
+ * included. The map is keyed by the simple names of the declarations. |
+ * |
+ * This does not include inherited members. |
+ */ |
+ Map<Symbol, DeclarationMirror> get declarations; |
+ |
+ /** |
+ * Returns a map of the methods, getters and setters of an instance of the |
+ * class. |
+ * |
+ * The intent is to capture those members that constitute the API of an |
+ * instance. Hence fields are not included, but the getters and setters |
+ * implicitly introduced by fields are included. The map includes methods, |
+ * getters and setters that are inherited as well as those introduced by the |
+ * class itself. |
+ * |
+ * The map is keyed by the simple names of the members. |
+ */ |
+ Map<Symbol, MethodMirror> get instanceMembers; |
+ |
+ /** |
+ * Returns a map of the static methods, getters and setters of the class. |
+ * |
+ * The intent is to capture those members that constitute the API of a class. |
+ * Hence fields are not included, but the getters and setters implicitly |
+ * introduced by fields are included. |
+ * |
+ * The map is keyed by the simple names of the members. |
+ */ |
+ Map<Symbol, MethodMirror> get staticMembers; |
+ |
+ |
+ /** |
+ * The mixin of this class. |
+ * If this class is the result of a mixin application of the |
+ * form S with M, returns a class mirror on M. |
+ * Otherwise returns a class mirror on [reflectee]. |
+ */ |
+ ClassMirror get mixin; |
+ |
+ // TODO(ahe): What about: |
+ // /// Finds the instance member named [name] declared or inherited in the |
+ // /// reflected class. |
+ // DeclarationMirror instanceLookup(Symbol name); |
+ |
+ /** |
+ * Invokes the named constructor and returns a mirror on the result. |
+ * |
+ * Let *c* be the class reflected by this mirror |
+ * let *a1, ..., an* be the elements of [positionalArguments] |
+ * let *k1, ..., km* be the identifiers denoted by the elements of |
+ * [namedArguments.keys] |
+ * and let *v1, ..., vm* be the elements of [namedArguments.values]. |
+ * If [constructorName] was created from the empty string |
+ * Then this method will execute the instance creation expression |
+ * *new c(a1, ..., an, k1: v1, ..., km: vm)* |
+ * in a scope that has access to the private members |
+ * of *c*. Otherwise, let |
+ * *f* be the simple name of the constructor denoted by [constructorName] |
+ * Then this method will execute the instance creation expression |
+ * *new c.f(a1, ..., an, k1: v1, ..., km: vm)* |
+ * in a scope that has access to the private members |
+ * of *c*. |
+ * In either case: |
+ * If the expression evaluates to a result *r*, this method returns |
+ * the result of calling [reflect](*r*). |
+ * If evaluating the expression causes a compilation error |
+ * the effect is the same as if a non-reflective compilation error |
+ * had been encountered. |
+ * If evaluating the expression throws an exception *e* |
+ * (that it does not catch) |
+ * this method throws *e*. |
+ */ |
+ InstanceMirror newInstance(Symbol constructorName, |
+ List positionalArguments, |
+ [Map<Symbol,dynamic> namedArguments]); |
+ |
+ /** |
+ * Returns [:true:] if this mirror is equal to [other]. |
+ * Otherwise returns [:false:]. |
+ * |
+ * The equality holds if and only if |
+ * (1) [other] is a mirror of the same kind |
+ * and |
+ * (2) This mirror and [other] reflect the same class. |
+ * |
+ * Note that if the reflected class is an invocation of |
+ * a generic class,(2) implies that the reflected class |
+ * and [other] have equal type arguments. |
+ */ |
+ bool operator == (other); |
+ |
+ /** |
+ * Returns whether the class denoted by the receiver is a subclass of the |
+ * class denoted by the argument. |
+ * |
+ * Note that the subclass relationship is reflexive. |
+ */ |
+ bool isSubclassOf(ClassMirror other); |
+} |
+ |
+/** |
+ * A [FunctionTypeMirror] represents the type of a function in the |
+ * Dart language. |
+ */ |
+abstract class FunctionTypeMirror implements ClassMirror { |
+ /** |
+ * Returns the return type of the reflectee. |
+ */ |
+ TypeMirror get returnType; |
+ |
+ /** |
+ * Returns a list of the parameter types of the reflectee. |
+ */ |
+ List<ParameterMirror> get parameters; |
+ |
+ /** |
+ * A mirror on the [:call:] method for the reflectee. |
+ */ |
+ // This is only here because in the past the VM did not implement a call |
+ // method on closures. |
+ MethodMirror get callMethod; |
+} |
+ |
+/** |
+ * A [TypeVariableMirror] represents a type parameter of a generic |
+ * type. |
+ */ |
+abstract class TypeVariableMirror extends TypeMirror { |
+ /** |
+ * A mirror on the type that is the upper bound of this type variable. |
+ */ |
+ TypeMirror get upperBound; |
+ |
+ /** |
+ * Is the reflectee static? |
+ * |
+ * For the purposes of the mirrors library, type variables are considered |
+ * non-static. |
+ */ |
+ bool get isStatic; |
+ |
+ /** |
+ * Returns [:true:] if this mirror is equal to [other]. |
+ * Otherwise returns [:false:]. |
+ * |
+ * The equality holds if and only if |
+ * (1) [other] is a mirror of the same kind |
+ * and |
+ * (2) [:simpleName == other.simpleName:] and |
+ * [:owner == other.owner:]. |
+ */ |
+ bool operator == (other); |
+} |
+ |
+/** |
+ * A [TypedefMirror] represents a typedef in a Dart language program. |
+ */ |
+abstract class TypedefMirror implements TypeMirror { |
+ /** |
+ * The defining type for this typedef. |
+ * If the the type referred to by the reflectee is a function type |
+ * *F*, the result will be [:FunctionTypeMirror:] reflecting *F* |
+ * which is abstract and has an abstract method [:call:] whose |
+ * signature corresponds to *F*. |
+ * |
+ * For instance [:void f(int):] is the referent for [:typedef void f(int):]. |
+ */ |
+ FunctionTypeMirror get referent; |
+} |
+ |
+/** |
+ * A [MethodMirror] reflects a Dart language function, method, |
+ * constructor, getter, or setter. |
+ */ |
+abstract class MethodMirror implements DeclarationMirror { |
+ /** |
+ * A mirror on the return type for the reflectee. |
+ */ |
+ TypeMirror get returnType; |
+ |
+ /** |
+ * The source code for the reflectee, if available. Otherwise null. |
+ */ |
+ String get source; |
+ |
+ /** |
+ * A list of mirrors on the parameters for the reflectee. |
+ */ |
+ List<ParameterMirror> get parameters; |
+ |
+ /** |
+ * A function is considered non-static iff it is permited to refer to 'this'. |
+ * |
+ * Note that generative constructors are considered non-static, whereas |
+ * factory constructors are considered static. |
+ */ |
+ bool get isStatic; |
+ |
+ /** |
+ * Is the reflectee abstract? |
+ */ |
+ bool get isAbstract; |
+ |
+ /** |
+ * Returns true if the reflectee is synthetic, and returns false otherwise. |
+ * |
+ * A reflectee is synthetic if it is a getter or setter implicitly introduced |
+ * for a field or Type, or if it is a constructor that was implicitly |
+ * introduced as a default constructor or as part of a mixin application. |
+ */ |
+ bool get isSynthetic; |
+ |
+ /** |
+ * Is the reflectee a regular function or method? |
+ * |
+ * A function or method is regular if it is not a getter, setter, or |
+ * constructor. Note that operators, by this definition, are |
+ * regular methods. |
+ */ |
+ bool get isRegularMethod; |
+ |
+ /** |
+ * Is the reflectee an operator? |
+ */ |
+ bool get isOperator; |
+ |
+ /** |
+ * Is the reflectee a getter? |
+ */ |
+ bool get isGetter; |
+ |
+ /** |
+ * Is the reflectee a setter? |
+ */ |
+ bool get isSetter; |
+ |
+ /** |
+ * Is the reflectee a constructor? |
+ */ |
+ bool get isConstructor; |
+ |
+ /** |
+ * The constructor name for named constructors and factory methods. |
+ * |
+ * For unnamed constructors, this is the empty string. For |
+ * non-constructors, this is the empty string. |
+ * |
+ * For example, [:'bar':] is the constructor name for constructor |
+ * [:Foo.bar:] of type [:Foo:]. |
+ */ |
+ Symbol get constructorName; |
+ |
+ /** |
+ * Is the reflectee a const constructor? |
+ */ |
+ bool get isConstConstructor; |
+ |
+ /** |
+ * Is the reflectee a generative constructor? |
+ */ |
+ bool get isGenerativeConstructor; |
+ |
+ /** |
+ * Is the reflectee a redirecting constructor? |
+ */ |
+ bool get isRedirectingConstructor; |
+ |
+ /** |
+ * Is the reflectee a factory constructor? |
+ */ |
+ bool get isFactoryConstructor; |
+ |
+ /** |
+ * Returns true if this mirror is equal to [other]. |
+ * |
+ * The equality holds if and only if |
+ * (1) [other] is a mirror of the same kind |
+ * and |
+ * (2) [:simpleName == other.simpleName:] and |
+ * [:owner == other.owner:]. |
+ */ |
+ bool operator == (other); |
+} |
+ |
+/** |
+ * A [VariableMirror] reflects a Dart language variable declaration. |
+ */ |
+abstract class VariableMirror implements DeclarationMirror { |
+ /** |
+ * Returns a mirror on the type of the reflectee. |
+ */ |
+ TypeMirror get type; |
+ |
+ /** |
+ * Returns [:true:] if the reflectee is a static variable. |
+ * Otherwise returns [:false:]. |
+ * |
+ * For the purposes of the mirror library, top-level variables are |
+ * implicitly declared static. |
+ */ |
+ bool get isStatic; |
+ |
+ /** |
+ * Returns [:true:] if the reflectee is a final variable. |
+ * Otherwise returns [:false:]. |
+ */ |
+ bool get isFinal; |
+ |
+ /** |
+ * Returns [:true:] if the reflectee is declared [:const:]. |
+ * Otherwise returns [:false:]. |
+ */ |
+ bool get isConst; |
+ |
+ /** |
+ * Returns true if this mirror is equal to [other]. |
+ * |
+ * The equality holds if and only if |
+ * (1) [other] is a mirror of the same kind |
+ * and |
+ * (2) [:simpleName == other.simpleName:] and |
+ * [:owner == other.owner:]. |
+ */ |
+ bool operator == (other); |
+} |
+ |
+/** |
+ * A [ParameterMirror] reflects a Dart formal parameter declaration. |
+ */ |
+abstract class ParameterMirror implements VariableMirror { |
+ /** |
+ * A mirror on the type of this parameter. |
+ */ |
+ TypeMirror get type; |
+ |
+ /** |
+ * Returns [:true:] if the reflectee is an optional parameter. |
+ * Otherwise returns [:false:]. |
+ */ |
+ bool get isOptional; |
+ |
+ /** |
+ * Returns [:true:] if the reflectee is a named parameter. |
+ * Otherwise returns [:false:]. |
+ */ |
+ bool get isNamed; |
+ |
+ /** |
+ * Returns [:true:] if the reflectee has explicitly declared a default value. |
+ * Otherwise returns [:false:]. |
+ */ |
+ bool get hasDefaultValue; |
+ |
+ /** |
+ * If this is a required parameter, returns [:null:]. Otherwise returns a |
+ * mirror on the default value for this parameter. If no default is declared |
+ * for an optional parameter, the default is [:null:] and a mirror on [:null:] |
+ * is returned. |
+ */ |
+ InstanceMirror get defaultValue; |
+} |
+ |
+/** |
+ * A [SourceLocation] describes the span of an entity in Dart source code. |
+ */ |
+abstract class SourceLocation { |
+ /** |
+ * The 1-based line number for this source location. |
+ * |
+ * A value of 0 means that the line number is unknown. |
+ */ |
+ int get line; |
+ |
+ /** |
+ * The 1-based column number for this source location. |
+ * |
+ * A value of 0 means that the column number is unknown. |
+ */ |
+ int get column; |
+ |
+ /** |
+ * Returns the URI where the source originated. |
+ */ |
+ Uri get sourceUri; |
+} |
+ |
+/** |
+ * Class used for encoding comments as metadata annotations. |
+ */ |
+class Comment { |
+ /** |
+ * The comment text as written in the source text. |
+ */ |
+ final String text; |
+ |
+ /** |
+ * The comment text without the start, end, and padding text. |
+ * |
+ * For example, if [text] is [: /** Comment text. */ :] then the [trimmedText] |
+ * is [: Comment text. :]. |
+ */ |
+ final String trimmedText; |
+ |
+ /** |
+ * Is [:true:] if this comment is a documentation comment. |
+ * |
+ * That is, that the comment is either enclosed in [: /** ... */ :] or starts |
+ * with [: /// :]. |
+ */ |
+ final bool isDocComment; |
+ |
+ const Comment(this.text, this.trimmedText, this.isDocComment); |
+} |
+ |
+/** |
+ * Annotation describing how "dart:mirrors" is used (EXPERIMENTAL). |
+ * |
+ * When used as metadata on an import of "dart:mirrors" in library *L*, this |
+ * class describes how "dart:mirrors" is used by library *L* unless overridden. |
+ * See [override]. |
+ * |
+ * The following text is non-normative: |
+ * |
+ * In some scenarios, for example, when minifying Dart code, or when generating |
+ * JavaScript code from a Dart program, the size and performance of the output |
+ * can suffer from use of reflection. In those cases, telling the compiler |
+ * what is used, can have a significant impact. |
+ * |
+ * Example usage: |
+ * |
+ * @MirrorsUsed(symbols: 'foo', override: '*') |
+ * import 'dart:mirrors'; |
+ * |
+ * class Foo { |
+ * noSuchMethod(Invocation invocation) { |
+ * print(MirrorSystem.getName(invocation.memberName)); |
+ * } |
+ * } |
+ * |
+ * main() { |
+ * new Foo().foo(); // Prints "foo". |
+ * new Foo().bar(); // Might print an arbitrary (mangled) name, "bar". |
+ * } |
+ */ |
+// TODO(ahe): Remove ", override: '*'" when it isn't necessary anymore. |
+class MirrorsUsed { |
+ // Note: the fields of this class are untyped. This is because the most |
+ // convenient way to specify to specify symbols today is using a single |
+ // string. In some cases, a const list of classes might be convenient. Some |
+ // might prefer to use a const list of symbols. |
+ |
+ /** |
+ * The list of strings passed to new [Symbol], and symbols that might be |
+ * passed to [MirrorSystem.getName]. |
+ * |
+ * Combined with the names of [targets], [metaTargets] and their members, |
+ * this forms the complete list of strings passed to new [Symbol], and |
+ * symbols that might be passed to [MirrorSystem.getName] by the library to |
+ * which this metadata applies. |
+ * |
+ * The following text is non-normative: |
+ * |
+ * Specifying this option turns off the following warnings emitted by |
+ * dart2js: |
+ * |
+ * * Using "MirrorSystem.getName" may result in larger output. |
+ * * Using "new #{name}" may result in larger output. |
+ * |
+ * Use symbols = "*" to turn off the warnings mentioned above. |
+ * |
+ * For example, if using [noSuchMethod] to interact with a database, extract |
+ * all the possible column names and include them in this list. Similarly, |
+ * if using [noSuchMethod] to interact with another language (JavaScript, for |
+ * example) extract all the identifiers from API used and include them in |
+ * this list. |
+ */ |
+ final symbols; |
+ |
+ /** |
+ * A list of reflective targets. |
+ * |
+ * Combined with [metaTargets], this provides the complete list of reflective |
+ * targets used by the library to which this metadata applies. |
+ * |
+ * The following text is non-normative: |
+ * |
+ * For now, there is no formal description of what a reflective target is. |
+ * Informally, it is a list of things that are expected to have fully |
+ * functional mirrors. |
+ */ |
+ final targets; |
+ |
+ /** |
+ * A list of classes that when used as metadata indicates a reflective |
+ * target. |
+ * |
+ * See [targets]. |
+ */ |
+ final metaTargets; |
+ |
+ /** |
+ * A list of library names or "*". |
+ * |
+ * When used as metadata on an import of "dart:mirrors", this metadata does |
+ * not apply to the library in which the annotation is used, but instead |
+ * applies to the other libraries (all libraries if "*" is used). |
+ */ |
+ final override; |
+ |
+ const MirrorsUsed( |
+ {this.symbols, this.targets, this.metaTargets, this.override}); |
+} |