| Index: reflectable/lib/src/reflectable_transformer_based.dart
|
| diff --git a/reflectable/lib/src/reflectable_transformer_based.dart b/reflectable/lib/src/reflectable_transformer_based.dart
|
| index 55f5b8a068588e18dae5849f2d18e26b6ca53255..fadb7c72e2483e18425f0ade7061c884692abbe3 100644
|
| --- a/reflectable/lib/src/reflectable_transformer_based.dart
|
| +++ b/reflectable/lib/src/reflectable_transformer_based.dart
|
| @@ -15,6 +15,9 @@ import 'reflectable_base.dart';
|
|
|
| bool get isTransformed => true;
|
|
|
| +/// Returns the set of reflectors in the current program.
|
| +Set<Reflectable> get reflectors => data.keys.toSet();
|
| +
|
| // Mirror classes with default implementations of all methods, to be used as
|
| // superclasses of transformer generated static mirror classes. They serve to
|
| // ensure that the static mirror classes always implement all methods, such that
|
| @@ -208,6 +211,9 @@ class ClassMirrorImpl extends _DataCaching implements ClassMirror {
|
| /// mirror belongs to.
|
| final ReflectableImpl _reflector;
|
|
|
| + /// An encoding of the attributes and kind of this class mirror.
|
| + final int _descriptor;
|
| +
|
| /// The index of this mirror in the [ReflectorData.classMirrors] table.
|
| /// Also this is the index of the Type of the reflected class in
|
| /// [ReflectorData.types].
|
| @@ -281,6 +287,7 @@ class ClassMirrorImpl extends _DataCaching implements ClassMirror {
|
| ClassMirrorImpl(
|
| this.simpleName,
|
| this.qualifiedName,
|
| + this._descriptor,
|
| this._classIndex,
|
| this._reflector,
|
| this._declarationIndices,
|
| @@ -297,7 +304,7 @@ class ClassMirrorImpl extends _DataCaching implements ClassMirror {
|
| : _metadata =
|
| (metadata == null) ? null : new UnmodifiableListView(metadata);
|
|
|
| - bool get isAbstract => _unsupported();
|
| + bool get isAbstract => (_descriptor & constants.abstractAttribute != 0);
|
|
|
| Map<String, DeclarationMirror> _declarations;
|
|
|
| @@ -493,16 +500,32 @@ class ClassMirrorImpl extends _DataCaching implements ClassMirror {
|
| // operations.
|
| }
|
|
|
| -class LibraryMirrorImpl implements LibraryMirror {
|
| - LibraryMirrorImpl(this.simpleName, this.uri, this.getters, this.setters,
|
| +class LibraryMirrorImpl extends _DataCaching implements LibraryMirror {
|
| + LibraryMirrorImpl(
|
| + this.simpleName,
|
| + this.uri,
|
| + this._reflector,
|
| + this._declarationIndices,
|
| + this.getters,
|
| + this.setters,
|
| List<Object> metadata)
|
| : _metadata =
|
| metadata == null ? null : new UnmodifiableListView(metadata);
|
|
|
| - final Uri uri;
|
| + final ReflectableImpl _reflector;
|
|
|
| - // TODO(eernst) clarify: `_unsupported()` means not yet implemented here?
|
| - Map<String, DeclarationMirror> get declarations => _unsupported();
|
| + /// A list of the indices in [ReflectorData.memberMirrors] of the
|
| + /// declarations of the reflected class. This includes method mirrors for
|
| + /// top level functions of this library and it directly corresponds to
|
| + /// `declarations`. Exception: When the given `_reflector.capabilities` do
|
| + /// not support the operation `declarations`, this will be
|
| + /// `<int>[NO_CAPABILITY_INDEX]`. It is enough to check that the list is
|
| + /// non-empty and first element is NO_CAPABILITY_INDEX to detect this
|
| + /// situation, because NO_CAPABILITY_INDEX` will otherwise never occur.
|
| + final List<int> _declarationIndices;
|
| +
|
| + @override
|
| + final Uri uri;
|
|
|
| @override
|
| final String simpleName;
|
| @@ -510,6 +533,34 @@ class LibraryMirrorImpl implements LibraryMirror {
|
| final Map<String, _StaticGetter> getters;
|
| final Map<String, _StaticSetter> setters;
|
|
|
| + Map<String, DeclarationMirror> _declarations;
|
| +
|
| + @override
|
| + Map<String, DeclarationMirror> get declarations {
|
| + if (_declarations == null) {
|
| + Map<String, DeclarationMirror> result =
|
| + new Map<String, DeclarationMirror>();
|
| + for (int declarationIndex in _declarationIndices) {
|
| + // We encode a missing `declarations` capability as an index with
|
| + // the value NO_CAPABILITY_INDEX. Note that `_declarations` will not be
|
| + // initialized and hence we will come here repeatedly if that is the
|
| + // case; however, performing operations for which there is no capability
|
| + // need not have stellar performance, it is almost always a bug to do
|
| + // that.
|
| + if (declarationIndex == NO_CAPABILITY_INDEX) {
|
| + throw new NoSuchCapabilityError(
|
| + "Requesting declarations of '$qualifiedName' without capability");
|
| + }
|
| + DeclarationMirror declarationMirror =
|
| + _data.memberMirrors[declarationIndex];
|
| + result[declarationMirror.simpleName] = declarationMirror;
|
| + }
|
| + _declarations =
|
| + new UnmodifiableMapView<String, DeclarationMirror>(result);
|
| + }
|
| + return _declarations;
|
| + }
|
| +
|
| @override
|
| Object invoke(String memberName, List positionalArguments,
|
| [Map<Symbol, dynamic> namedArguments]) {
|
| @@ -519,7 +570,7 @@ class LibraryMirrorImpl implements LibraryMirror {
|
| null, memberName, positionalArguments, namedArguments);
|
| }
|
| return Function.apply(
|
| - getters[memberName](), positionalArguments, namedArguments);
|
| + getter(), positionalArguments, namedArguments);
|
| }
|
|
|
| @override
|
| @@ -1199,7 +1250,13 @@ abstract class ReflectableImpl extends ReflectableBase
|
| }
|
|
|
| @override
|
| - Map<Uri, LibraryMirror> get libraries => _unsupported();
|
| + Map<Uri, LibraryMirror> get libraries {
|
| + Map<Uri, LibraryMirror> result = <Uri, LibraryMirror>{};
|
| + for (LibraryMirror library in data[this].libraryMirrors) {
|
| + result[library.uri] = library;
|
| + }
|
| + return new UnmodifiableMapView(result);
|
| + }
|
|
|
| @override
|
| Iterable<ClassMirror> get annotatedClasses {
|
|
|