diff --git a/angel_container/CHANGELOG.md b/angel_container/CHANGELOG.md index df7a4070..6f70d11d 100644 --- a/angel_container/CHANGELOG.md +++ b/angel_container/CHANGELOG.md @@ -1,3 +1,6 @@ +# 1.0.3 +* Added `Future` support to `Reflector`. + # 1.0.2 * Added `makeAsync`. diff --git a/angel_container/lib/src/empty/empty.dart b/angel_container/lib/src/empty/empty.dart index 12e40d22..fd0f18e0 100644 --- a/angel_container/lib/src/empty/empty.dart +++ b/angel_container/lib/src/empty/empty.dart @@ -6,7 +6,7 @@ final Map _symbolNames = {}; /// instead returning empty objects on every invocation. /// /// Use this in contexts where you know you won't need any reflective capabilities. -class EmptyReflector implements Reflector { +class EmptyReflector extends Reflector { /// A [RegExp] that can be used to extract the name of a symbol without reflection. static final RegExp symbolRegex = new RegExp(r'Symbol\("([^"]+)"\)'); diff --git a/angel_container/lib/src/mirrors/reflector.dart b/angel_container/lib/src/mirrors/reflector.dart index 9cf07fb1..63b9889e 100644 --- a/angel_container/lib/src/mirrors/reflector.dart +++ b/angel_container/lib/src/mirrors/reflector.dart @@ -1,12 +1,12 @@ +import 'dart:async'; import 'dart:mirrors' as dart; - import 'package:angel_container/angel_container.dart'; import 'package:angel_container/src/reflector.dart'; /// A [Reflector] implementation that forwards to `dart:mirrors`. /// /// Useful on the server, where reflection is supported. -class MirrorsReflector implements Reflector { +class MirrorsReflector extends Reflector { const MirrorsReflector(); @override @@ -44,6 +44,22 @@ class MirrorsReflector implements Reflector { } } + @override + ReflectedType reflectFutureOf(Type type) { + var inner = reflectType(type); + dart.TypeMirror _mirror; + if (inner is _ReflectedClassMirror) { + _mirror = inner.mirror; + } else if (inner is _ReflectedTypeMirror) { + _mirror = inner.mirror; + } else { + throw ArgumentError('$type is not a class or type.'); + } + + var future = dart.reflectType(Future, [_mirror.reflectedType]); + return _ReflectedTypeMirror(future); + } + @override ReflectedInstance reflectInstance(Object object) { return new _ReflectedInstanceMirror(dart.reflect(object)); diff --git a/angel_container/lib/src/reflector.dart b/angel_container/lib/src/reflector.dart index 9bf7028d..b11a1569 100644 --- a/angel_container/lib/src/reflector.dart +++ b/angel_container/lib/src/reflector.dart @@ -2,6 +2,8 @@ import 'package:collection/collection.dart'; import 'package:quiver/core.dart'; abstract class Reflector { + const Reflector(); + String getName(Symbol symbol); ReflectedClass reflectClass(Type clazz); @@ -11,6 +13,10 @@ abstract class Reflector { ReflectedType reflectType(Type type); ReflectedInstance reflectInstance(Object object); + + ReflectedType reflectFutureOf(Type type) { + throw new UnsupportedError('`reflectFutureOf` requires `dart:mirrors`.'); + } } abstract class ReflectedInstance { diff --git a/angel_container/lib/src/static/static.dart b/angel_container/lib/src/static/static.dart index 0b380879..4d031515 100644 --- a/angel_container/lib/src/static/static.dart +++ b/angel_container/lib/src/static/static.dart @@ -3,7 +3,7 @@ import 'package:angel_container/angel_container.dart'; /// A [Reflector] implementation that performs simple [Map] lookups. /// /// `package:angel_container_generator` uses this to create reflectors from analysis metadata. -class StaticReflector implements Reflector { +class StaticReflector extends Reflector { final Map names; final Map types; final Map functions; diff --git a/angel_container/pubspec.yaml b/angel_container/pubspec.yaml index c08f575d..b08f6186 100644 --- a/angel_container/pubspec.yaml +++ b/angel_container/pubspec.yaml @@ -1,5 +1,5 @@ name: angel_container -version: 1.0.2 +version: 1.0.3 author: Tobe O description: "A better IoC container and dependency injector for Angel, ultimately allowing Angel to be used without dart:mirrors." homepage: https://github.com/angel-dart/container.git diff --git a/angel_container_generator/lib/angel_container_generator.dart b/angel_container_generator/lib/angel_container_generator.dart index 5be6f3c8..395e3f8d 100644 --- a/angel_container_generator/lib/angel_container_generator.dart +++ b/angel_container_generator/lib/angel_container_generator.dart @@ -20,7 +20,7 @@ class ContainedReflectable extends Reflectable { } /// A [Reflector] instance that uses a [Reflectable] to reflect upon data. -class GeneratedReflector implements Reflector { +class GeneratedReflector extends Reflector { final Reflectable reflectable; const GeneratedReflector([this.reflectable = contained]);