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

Unified Diff: tool/input_sdk/lib/mirrors/mirrors.dart

Issue 1955293003: Update mirrors.dart (Closed) Base URL: https://github.com/dart-lang/dev_compiler@master
Patch Set: Created 4 years, 7 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
index d16e62eecb7fc4e63e4518e7ffd4398b8c562fda..f5c8370febce0eb0c8f25ecfe3aa199da3f92ad4 100644
--- a/tool/input_sdk/lib/mirrors/mirrors.dart
+++ b/tool/input_sdk/lib/mirrors/mirrors.dart
@@ -14,13 +14,13 @@
/**
* Basic reflection in Dart,
- * with support for introspection and dynamic evaluation.
+ * with support for introspection and dynamic invocation.
*
* *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
+ * *Dynamic invocation* 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).
@@ -69,8 +69,14 @@ library dart.mirrors;
*/
abstract class MirrorSystem {
/**
- * Returns an immutable map from URIs to mirrors for all
- * libraries known to this mirror system.
+ * All libraries known to the mirror system, indexed by their URI.
+ *
+ * Returns an unmodifiable map of the libraries with [LibraryMirror.uri] as
+ * keys.
+ *
+ * For a runtime mirror system, only libraries which are currently loaded
+ * are included, and repeated calls of this method may return different maps
+ * as libraries are loaded.
*/
Map<Uri, LibraryMirror> get libraries;
@@ -86,6 +92,7 @@ abstract class MirrorSystem {
/**
* A mirror on the isolate associated with this [MirrorSystem].
+ *
* This may be null if this mirror system is not running.
*/
IsolateMirror get isolate;
@@ -111,15 +118,16 @@ abstract class MirrorSystem {
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].
+ * 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.
+ * the const constructor of [Symbol] or symbol literals.
*/
external static Symbol getSymbol(String name, [LibraryMirror library]);
}
@@ -131,43 +139,42 @@ 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.
+ * 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].
+ *
+ * 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].
+ * 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.
+ * 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].
+ * Reflects the type represented by [key].
*
- * If [key] is not an instance of [Type] then this function
- * throws an [ArgumentError].
+ * 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.
+ * 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);
@@ -183,32 +190,28 @@ abstract class Mirror {}
*/
abstract class IsolateMirror implements Mirror {
/**
- * Returns a unique name used to refer to an isolate
- * in debugging messages.
+ * A unique name used to refer to the isolate in debugging messages.
*/
String get debugName;
/**
- * Returns [:true:] if and only if this mirror reflects
- * the currently running isolate. Otherwise returns
- * [:false:].
+ * Whether this mirror reflects the currently running isolate.
*/
bool get isCurrent;
/**
- * Returns a [LibraryMirror] on the root library for this
- * isolate.
+ * The root library for the reflected isolate.
*/
LibraryMirror get rootLibrary;
/**
- * Returns [:true:] if this mirror is equal to [other].
- * Otherwise returns [:false:].
+ * Whether [other] is an [IsolateMirror] on the same isolate as this mirror.
+ *
* 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].
+ *
+ * 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);
}
@@ -220,9 +223,9 @@ 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.
+ * The simple name is in most cases the the identifier name of the entity,
+ * such as 'myMethod' for a method, [:void myMethod() {...}:] or 'mylibrary'
+ * for a [:library 'mylibrary';:] declaration.
*/
Symbol get simpleName;
@@ -249,46 +252,73 @@ abstract class DeclarationMirror implements Mirror {
Symbol get qualifiedName;
/**
- * A mirror on the owner of this Dart language entity. This is the declaration
- * immediately surrounding the reflectee.
+ * A mirror on the owner of this Dart language entity.
+ *
+ * The owner 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.
+ * * 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:].
+ * Whether this declaration is library private.
*
+ * Always returns `false` for a library declaration,
+ * otherwise returns `true` if the declaration's name starts with an
+ * underscore character (`_`), and `false` if it doesn't.
*/
bool get isPrivate;
/**
- * Is this declaration top-level?
+ * Whether this declaration is top-level.
*
- * This is defined to be equivalent to:
- * [:mirror.owner != null && mirror.owner is LibraryMirror:]
+ * A declaration is considered top-level if its [owner] is a [LibraryMirror].
*/
bool get isTopLevel;
/**
- * The source location of this Dart language entity.
+ * The source location of this Dart language entity, or [:null:] if the
+ * entity is synthetic.
+ *
+ * If the reflectee is a variable, the returned location gives the position
+ * of the variable name at its point of declaration.
+ *
+ * If the reflectee is a library, class, typedef, function or type variable
+ * with associated metadata, the returned location gives the position of the
+ * first metadata declaration associated with the reflectee.
+ *
+ * Otherwise:
*
- * This operation is optional and may return [:null:].
+ * If the reflectee is a library, the returned location gives the position of
+ * the keyword 'library' at the reflectee's point of declaration, if the
+ * reflectee is a named library, or the first character of the first line in
+ * the compilation unit defining the reflectee if the reflectee is anonymous.
+ *
+ * If the reflectee is an abstract class, the returned location gives the
+ * position of the keyword 'abstract' at the reflectee's point of declaration.
+ * Otherwise, if the reflectee is a class, the returned location gives the
+ * position of the keyword 'class' at the reflectee's point of declaration.
+ *
+ * If the reflectee is a typedef the returned location gives the position of
+ * the of the keyword 'typedef' at the reflectee's point of declaration.
+ *
+ * If the reflectee is a function with a declared return type, the returned
+ * location gives the position of the function's return type at the
+ * reflectee's point of declaration. Otherwise. the returned location gives
+ * the position of the function's name at the reflectee's point of
+ * declaration.
+ *
+ * This operation is optional and may throw an [UnsupportedError].
*/
SourceLocation get location;
@@ -329,24 +359,23 @@ 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*.
+ * 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.
@@ -357,17 +386,17 @@ abstract class ObjectMirror implements Mirror {
[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
+ * 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).
+ * 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
@@ -381,38 +410,41 @@ abstract class ObjectMirror implements Mirror {
* 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*.
+ * 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
+ * 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],
+ * 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*.
+ *
+ * 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);
@@ -433,16 +465,18 @@ abstract class InstanceMirror implements ObjectMirror {
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.
+ * Whether [reflectee] will return 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]
+ *
+ * * 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;
@@ -457,16 +491,18 @@ abstract class InstanceMirror implements ObjectMirror {
get reflectee;
/**
- * Returns true if this mirror is equal to [other].
+ * Whether 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.
+ *
+ * 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);
@@ -484,8 +520,8 @@ abstract class InstanceMirror implements ObjectMirror {
/**
* A [ClosureMirror] reflects a closure.
*
- * A [ClosureMirror] provides access to its captured variables and
- * provides the ability to execute its reflectee.
+ * A [ClosureMirror] provides the ability to execute its reflectee and
+ * introspect its function.
*/
abstract class ClosureMirror implements InstanceMirror {
/**
@@ -511,20 +547,24 @@ abstract class ClosureMirror implements InstanceMirror {
/**
* 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 *a1, ..., an* be the elements of [positionalArguments],
* let *k1, ..., km* be the identifiers denoted by the elements of
- * [namedArguments.keys]
+ * [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*.
+ * *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]);
@@ -551,18 +591,15 @@ abstract class LibraryMirror implements DeclarationMirror, ObjectMirror {
Map<Symbol, DeclarationMirror> get declarations;
/**
- * Returns [:true:] if this mirror is equal to [other].
- * Otherwise returns [:false:].
+ * Whether this mirror is equal to [other].
*
* 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.
+ *
+ * 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);
+ bool operator ==(other);
/**
* Returns a list of the imports and exports in this library;
@@ -582,7 +619,8 @@ abstract class LibraryDependencyMirror implements Mirror {
/// [targetLibrary].
LibraryMirror get sourceLibrary;
- /// Returns the library mirror of the library that is imported or exported.
+ /// Returns the library mirror of the library that is imported or exported,
+ /// or null if the library is not loaded.
LibraryMirror get targetLibrary;
/// Returns the prefix if this is a prefixed import and `null` otherwise.
@@ -679,15 +717,18 @@ abstract class TypeMirror implements DeclarationMirror {
/**
- * Checks the subtype relationship, denoted by [:<::] in the language
- * specification. This is the type relationship used in [:is:] test checks.
+ * 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.
+ * 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);
}
@@ -754,9 +795,10 @@ abstract class ClassMirror implements TypeMirror, ObjectMirror {
/**
* 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].
+ *
+ * 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;
@@ -765,52 +807,50 @@ abstract class ClassMirror implements TypeMirror, ObjectMirror {
// /// 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 *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]
+ * [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*.
+ *
+ * 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*.
+ *
+ * * 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:].
+ * Whether this mirror is equal to [other].
*
* 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.
+ * 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);
+ bool operator == (other);
/**
* Returns whether the class denoted by the receiver is a subclass of the
@@ -845,8 +885,7 @@ abstract class FunctionTypeMirror implements ClassMirror {
}
/**
- * A [TypeVariableMirror] represents a type parameter of a generic
- * type.
+ * A [TypeVariableMirror] represents a type parameter of a generic type.
*/
abstract class TypeVariableMirror extends TypeMirror {
/**
@@ -863,16 +902,15 @@ abstract class TypeVariableMirror extends TypeMirror {
bool get isStatic;
/**
- * Returns [:true:] if this mirror is equal to [other].
- * Otherwise returns [:false:].
+ * Whether [other] is a [TypeVariableMirror] on the same type variable as this
+ * mirror.
*
* 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:].
+ *
+ * 1. [other] is a mirror of the same kind, and
+ * 2. [:simpleName == other.simpleName:] and [:owner == other.owner:].
*/
- bool operator == (other);
+ bool operator == (other);
}
/**
@@ -881,11 +919,10 @@ abstract class TypeVariableMirror extends TypeMirror {
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*.
*
+ * 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;
@@ -994,15 +1031,14 @@ abstract class MethodMirror implements DeclarationMirror {
bool get isFactoryConstructor;
/**
- * Returns true if this mirror is equal to [other].
+ * Whether 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:].
+ *
+ * 1. [other] is a mirror of the same kind, and
+ * 2. [:simpleName == other.simpleName:] and [:owner == other.owner:].
*/
- bool operator == (other);
+ bool operator == (other);
}
/**
@@ -1036,15 +1072,14 @@ abstract class VariableMirror implements DeclarationMirror {
bool get isConst;
/**
- * Returns true if this mirror is equal to [other].
+ * Whether 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:].
+ *
+ * 1. [other] is a mirror of the same kind, and
+ * 2. [:simpleName == other.simpleName:] and [:owner == other.owner:].
*/
- bool operator == (other);
+ bool operator == (other);
}
/**
@@ -1075,10 +1110,14 @@ abstract class ParameterMirror implements VariableMirror {
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.
+ * Returns the default value of an optional parameter.
+ *
+ * Returns an [InstanceMirror] on the (compile-time constant)
+ * default value for an optional parameter.
+ * If no default value is declared, it defaults to `null`
+ * and a mirror of `null` is returned.
+ *
+ * Returns `null` for a required parameter.
*/
InstanceMirror get defaultValue;
}
@@ -1151,7 +1190,7 @@ class Comment {
*
* Example usage:
*
- * @MirrorsUsed(symbols: 'foo', override: '*')
+ * @MirrorsUsed(symbols: 'foo')
* import 'dart:mirrors';
*
* class Foo {
@@ -1164,12 +1203,25 @@ class Comment {
* new Foo().foo(); // Prints "foo".
* new Foo().bar(); // Might print an arbitrary (mangled) name, "bar".
* }
+ *
+ * For a detailed description of the parameters to the [MirrorsUsed] constructor
+ * see the comments for [symbols], [targets], [metaTargets] and [override].
+ *
+ * An import of `dart:mirrors` may have multiple [MirrorsUsed] annotations. This
+ * is particularly helpful to specify overrides for specific libraries. For
+ * example:
+ *
+ * @MirrorsUsed(targets: 'foo.Bar', override: 'foo')
+ * @MirrorsUsed(targets: 'Bar')
+ * import 'dart:mirrors';
+ *
+ * will ensure that the target `Bar` from the current library and from library
+ * `foo` is available for reflection. See also [override].
*/
-// 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
+ // convenient way 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.
/**
@@ -1183,19 +1235,29 @@ class MirrorsUsed {
*
* The following text is non-normative:
*
- * Specifying this option turns off the following warnings emitted by
+ * Dart2js currently supports the following formats to specify symbols:
+ *
+ * * A constant [List] of [String] constants representing symbol names,
+ * e.g., `const ['foo', 'bar']`.
+ * * A single [String] constant whose value is a comma-separated list of
+ * symbol names, e.g., `"foo, bar"`.
+ *
+ * Specifying the `symbols` field turns off the following warnings emitted by
* dart2js:
*
* * Using "MirrorSystem.getName" may result in larger output.
- * * Using "new #{name}" may result in larger output.
+ * * Using "new Symbol" may result in larger output.
*
- * Use symbols = "*" to turn off the warnings mentioned above.
+ * For example, if you're using [noSuchMethod] to interact with a database,
+ * extract all the possible column names and include them in this list.
+ * Similarly, if you're using [noSuchMethod] to interact with another
+ * language (JavaScript, for example) extract all the identifiers from the
+ * API you use and include them in this list.
*
- * 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.
+ * Note that specifying a symbol only ensures that the symbol will be
+ * available under that name at runtime. It does not mark targets with
+ * that name as available for reflection. See [targets] and [metaTargets]
+ * for that purpose.
*/
final symbols;
@@ -1208,16 +1270,97 @@ class MirrorsUsed {
* 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.
+ * Informally, a target is a library, a class, a method or a field.
+ *
+ * Dart2js currently supports the following formats to specify targets:
+ *
+ * * A constant [List] containing [String] constants representing (qualified)
+ * names of targets and Dart types.
+ * * A single [String] constant whose value is a comma-separated list of
+ * (qualified) names.
+ * * A single Dart type.
+ *
+ * A (qualified) name is resolved to a target as follows:
+ *
+ * 1. If the qualified name matches a library name, the matching library is
+ * the target.
+ * 2. Else, find the longest prefix of the name such that the prefix ends
+ * just before a `.` and is a library name.
+ * 3. Use that library as current scope. If no matching prefix was found, use
+ * the current library, i.e., the library where the [MirrorsUsed]
+ * annotation was placed.
+ * 4. Split the remaining suffix (the entire name if no library name was
+ * found in step 3) into a list of [String] using `.` as a
+ * separator.
+ * 5. Select all targets in the current scope whose name matches a [String]
+ * from the list.
+ *
+ * For example:
+ *
+ * library my.library.one;
+ *
+ * class A {
+ * var aField;
+ * }
+ *
+ * library main;
+ *
+ * @MirrorsUsed(targets: "my.library.one.A.aField")
+ * import "dart:mirrors";
+ *
+ * The [MirrorsUsed] annotation specifies `A` and `aField` from library
+ * `my.library.one` as targets. This will mark the class `A` as a reflective
+ * target. The target specification for `aField` has no effect, as there is
+ * no target in `my.library.one` with that name.
+ *
+ * Note that everything within a target also is available for reflection.
+ * So, if a library is specified as target, all classes in that library
+ * become targets for reflection. Likewise, if a class is a target, all
+ * its methods and fields become targets for reflection. As a consequence,
+ * `aField` in the above example is also a reflective target.
+ *
*/
final targets;
/**
* A list of classes that when used as metadata indicates a reflective
- * target.
+ * target. See also [targets].
+ *
+ * The following text is non-normative:
*
- * See [targets].
+ * The format for specifying the list of classes is the same as used for
+ * specifying [targets]. However, as a library cannot be used as a metadata
+ * annotation in Dart, adding a library to the list of [metaTargets] has no
+ * effect. In particular, adding a library to [metaTargets] does not make
+ * the library's classes valid metadata annotations to enable reflection.
+ *
+ * If an instance of a class specified in [metaTargets] is used as
+ * metadata annotation on a library, class, field or method, that library,
+ * class, field or method is added to the set of targets for reflection.
+ *
+ * Example usage:
+ *
+ * library example;
+ * @MirrorsUsed(metaTargets: "example.Reflectable")
+ * import "dart:mirrors";
+ *
+ * class Reflectable {
+ * const Reflectable();
+ * }
+ *
+ * class Foo {
+ * @Reflectable()
+ * reflectableMethod() { ... }
+ *
+ * nonReflectableMethod() { ... }
+ * }
+ *
+ * In the above example. `reflectableMethod` is marked as reflectable by
+ * using the `Reflectable` class, which in turn is specified in the
+ * [metaTargets] annotation.
+ *
+ * The method `nonReflectableMethod` lacks a metadata annotation and thus
+ * will not be reflectable at runtime.
*/
final metaTargets;
@@ -1226,10 +1369,58 @@ class MirrorsUsed {
*
* 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).
+ * applies to the other libraries (all libraries if "*" is used).
+ *
+ * The following text is non-normative:
+ *
+ * Dart2js currently supports the following formats to specify libraries:
+ *
+ * * A constant [List] containing [String] constants representing names of
+ * libraries.
+ * * A single [String] constant whose value is a comma-separated list of
+ * library names.
+ *
+ * Conceptually, a [MirrorsUsed] annotation with [override] has the same
+ * effect as placing the annotation directly on the import of `dart:mirrors`
+ * in each of the referenced libraries. Thus, if the library had no
+ * [MirrorsUsed] annotation before, its unconditional import of
+ * `dart:mirrors` is overridden by an annotated import.
+ *
+ * Note that, like multiple explicit [MirrorsUsed] annotations, using
+ * override on a library with an existing [MirrorsUsed] annotation is
+ * additive. That is, the overall set of reflective targets is the union
+ * of the reflective targets that arise from the original and the
+ * overriding [MirrorsUsed] annotations.
+ *
+ * The use of [override] is only meaningful for libraries that have an
+ * import of `dart:mirrors` without annotation because otherwise it would
+ * work exactly the same way without the [override] parameter.
+ *
+ * While the annotation will apply to the given target libraries, the
+ * [symbols], [targets] and [metaTargets] are still evaluated in the
+ * scope of the annotation. Thus, to select a target from library `foo`,
+ * a qualified name has to be used or, if the target is visible in the
+ * current scope, its type may be referenced.
+ *
+ * For example, the following code marks all targets in the library `foo`
+ * as reflectable that have a metadata annotation using the `Reflectable`
+ * class from the same library.
+ *
+ * @MirrorsUsed(metaTargets: "foo.Reflectable", override: "foo")
+ *
+ * However, the following code would require the use of the `Reflectable`
+ * class from the current library, instead.
+ *
+ * @MirrorsUsed(metaTargets: "Reflectable", override: "foo")
+ *
*/
final override;
+ /**
+ * See the documentation for [MirrorsUsed.symbols], [MirrorsUsed.targets],
+ * [MirrorsUsed.metaTargets] and [MirrorsUsed.override] for documentation
+ * of the parameters.
+ */
const MirrorsUsed(
{this.symbols, this.targets, this.metaTargets, this.override});
}
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698