| 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}); | 
| +} | 
|  |