container@1.0.3 (future support)

This commit is contained in:
Tobe O 2019-04-17 09:24:13 -04:00
parent 41df6967c4
commit d51c317892
7 changed files with 31 additions and 6 deletions

View file

@ -1,3 +1,6 @@
# 1.0.3
* Added `Future` support to `Reflector`.
# 1.0.2
* Added `makeAsync<T>`.

View file

@ -6,7 +6,7 @@ final Map<Symbol, String> _symbolNames = <Symbol, String>{};
/// 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\("([^"]+)"\)');

View file

@ -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));

View file

@ -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 {

View file

@ -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<Symbol, String> names;
final Map<Type, ReflectedType> types;
final Map<Function, ReflectedFunction> functions;

View file

@ -1,5 +1,5 @@
name: angel_container
version: 1.0.2
version: 1.0.3
author: Tobe O <thosakwe@gmail.com>
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

View file

@ -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]);