| Index: third_party/pkg/di/lib/dynamic_injector.dart
|
| diff --git a/third_party/pkg/di/lib/dynamic_injector.dart b/third_party/pkg/di/lib/dynamic_injector.dart
|
| index 46c782e8e2acfde6fc9d964c9145fd0b6de24088..deef7811742dab373c6f67bd63eb5cb4a32eedb0 100644
|
| --- a/third_party/pkg/di/lib/dynamic_injector.dart
|
| +++ b/third_party/pkg/di/lib/dynamic_injector.dart
|
| @@ -1,12 +1,17 @@
|
| library di.dynamic_injector;
|
|
|
| import 'di.dart';
|
| -import 'mirrors.dart';
|
| +import 'src/mirrors.dart';
|
| +import 'src/base_injector.dart';
|
| +import 'src/error_helper.dart';
|
| +import 'src/provider.dart';
|
| +
|
| +export 'di.dart';
|
|
|
| /**
|
| * Dynamic implementation of [Injector] that uses mirrors.
|
| */
|
| -class DynamicInjector extends Injector {
|
| +class DynamicInjector extends BaseInjector {
|
|
|
| DynamicInjector({List<Module> modules, String name,
|
| bool allowImplicitInjection: false})
|
| @@ -16,15 +21,14 @@ class DynamicInjector extends Injector {
|
| DynamicInjector._fromParent(List<Module> modules, Injector parent, {name})
|
| : super.fromParent(modules, parent, name: name);
|
|
|
| - newFromParent(List<Module> modules, String name) {
|
| - return new DynamicInjector._fromParent(modules, this, name: name);
|
| - }
|
| + newFromParent(List<Module> modules, String name) =>
|
| + new DynamicInjector._fromParent(modules, this, name: name);
|
|
|
| - Object newInstanceOf(Type type, ObjectFactory getInstanceByType,
|
| - Injector requestor, error) {
|
| + Object newInstanceOf(Type type, ObjectFactory objFactory, Injector requestor,
|
| + resolving) {
|
| var classMirror = reflectType(type);
|
| if (classMirror is TypedefMirror) {
|
| - throw new NoProviderError(error('No implementation provided '
|
| + throw new NoProviderError(error(resolving, 'No implementation provided '
|
| 'for ${getSymbolName(classMirror.qualifiedName)} typedef!'));
|
| }
|
|
|
| @@ -32,22 +36,33 @@ class DynamicInjector extends Injector {
|
|
|
| if (ctor == null) {
|
| throw new NoProviderError('Unable to find default constructor for $type. '
|
| - 'Make sure class has a default constructor.' +
|
| - (1.0 is int ?
|
| - ' Make sure you have correctly configured @MirrorsUsed.' : ''));
|
| + 'Make sure class has a default constructor.' + (1.0 is int ?
|
| + 'Make sure you have correctly configured @MirrorsUsed.' : ''));
|
| }
|
|
|
| resolveArgument(int pos) {
|
| ParameterMirror p = ctor.parameters[pos];
|
| - if (MirrorSystem.getName(p.type.qualifiedName) == 'dynamic') {
|
| + if (p.type.qualifiedName == #dynamic) {
|
| var name = MirrorSystem.getName(p.simpleName);
|
| - throw new NoProviderError(error("The '$name' parameter must be typed"));
|
| + throw new NoProviderError(
|
| + error(resolving, "The '$name' parameter must be typed"));
|
| }
|
| if (p.type is TypedefMirror) {
|
| throw new NoProviderError(
|
| - error('Cannot create new instance of a typedef ${p.type}'));
|
| + error(resolving,
|
| + 'Cannot create new instance of a typedef ${p.type}'));
|
| + }
|
| + if (p.metadata.isNotEmpty) {
|
| + assert(p.metadata.length == 1);
|
| + var type = p.metadata.first.type.reflectedType;
|
| + return objFactory.getInstanceByKey(
|
| + new Key((p.type as ClassMirror).reflectedType, type),
|
| + requestor, resolving);
|
| + } else {
|
| + return objFactory.getInstanceByKey(
|
| + new Key((p.type as ClassMirror).reflectedType),
|
| + requestor, resolving);
|
| }
|
| - return getInstanceByType(getReflectedTypeWorkaround(p.type), requestor);
|
| }
|
|
|
| var args = new List.generate(ctor.parameters.length, resolveArgument,
|
| @@ -66,7 +81,12 @@ class DynamicInjector extends Injector {
|
| int position = 0;
|
| List args = mm.parameters.map((ParameterMirror parameter) {
|
| try {
|
| - return get(getReflectedTypeWorkaround(parameter.type));
|
| + if (parameter.metadata.isNotEmpty) {
|
| + var annotation = parameter.metadata[0].type.reflectedType;
|
| + return get((parameter.type as ClassMirror).reflectedType, annotation);
|
| + } else {
|
| + return get((parameter.type as ClassMirror).reflectedType);
|
| + }
|
| } on NoProviderError catch (e) {
|
| throw new NoProviderError(e.message);
|
| } finally {
|
|
|