Index: third_party/pkg/di/lib/injector.dart |
diff --git a/third_party/pkg/di/lib/injector.dart b/third_party/pkg/di/lib/injector.dart |
deleted file mode 100644 |
index 343a66edba43dd3c5a1f51eeae8f1aaafd5750d2..0000000000000000000000000000000000000000 |
--- a/third_party/pkg/di/lib/injector.dart |
+++ /dev/null |
@@ -1,219 +0,0 @@ |
-part of di; |
- |
-class Injector { |
- |
- /** |
- * Name of the injector or null of none is given. |
- */ |
- final String name; |
- |
- static const List<Type> _PRIMITIVE_TYPES = const <Type>[ |
- num, int, double, String, bool |
- ]; |
- |
- /** |
- * Returns the parent injector or null if root. |
- */ |
- final Injector parent; |
- |
- Injector _root; |
- |
- Map<Type, _Provider> _providers = <Type, _Provider>{}; |
- |
- final Map<Type, Object> instances = <Type, Object>{}; |
- |
- final List<Type> resolving = <Type>[]; |
- |
- final bool allowImplicitInjection; |
- |
- Iterable<Type> _typesCache; |
- |
- /** |
- * List of all types which the injector can return |
- */ |
- Iterable<Type> get _types { |
- if (_typesCache == null) { |
- _typesCache = _providers.keys; |
- } |
- return _typesCache; |
- } |
- |
- Injector({List<Module> modules, String name, |
- bool allowImplicitInjection: false}) |
- : this.fromParent(modules, null, |
- name: name, allowImplicitInjection: allowImplicitInjection); |
- |
- Injector.fromParent(List<Module> modules, |
- Injector this.parent, {this.name, this.allowImplicitInjection}) { |
- _root = parent == null ? this : parent._root; |
- if (modules != null) { |
- modules.forEach((module) { |
- _providers.addAll(module._bindings); |
- }); |
- } |
- _providers[Injector] = new _ValueProvider(this); |
- } |
- |
- Injector get root => _root; |
- |
- Set<Type> get types { |
- var types = new Set.from(_types); |
- var parent = this.parent; |
- while (parent != null) { |
- types.addAll(parent._types); |
- parent = parent.parent; |
- } |
- return types; |
- } |
- |
- String _error(message, [appendDependency]) { |
- if (appendDependency != null) { |
- resolving.add(appendDependency); |
- } |
- |
- String graph = resolving.join(' -> '); |
- |
- resolving.clear(); |
- |
- return '$message (resolving $graph)'; |
- } |
- |
- dynamic _getInstanceByType(Type typeName, Injector requester) { |
- _checkTypeConditions(typeName); |
- |
- if (resolving.contains(typeName)) { |
- throw new CircularDependencyError( |
- _error('Cannot resolve a circular dependency!', typeName)); |
- } |
- |
- var providerWithInjector = _getProviderWithInjectorForType(typeName); |
- var provider = providerWithInjector.provider; |
- var injector = providerWithInjector.injector; |
- var visible = provider.visibility != null ? |
- provider.visibility(requester, injector) : |
- _defaultVisibility(requester, injector); |
- |
- if (visible && instances.containsKey(typeName)) { |
- return instances[typeName]; |
- } |
- |
- if (providerWithInjector.injector != this || !visible) { |
- if (!visible) { |
- if (injector.parent == null) { |
- throw new NoProviderError( |
- _error('No provider found for ${typeName}!', typeName)); |
- } |
- injector = |
- injector.parent._getProviderWithInjectorForType(typeName).injector; |
- } |
- return injector._getInstanceByType(typeName, requester); |
- } |
- |
- var value; |
- try { |
- var strategy = provider.creationStrategy != null ? |
- provider.creationStrategy : _defaultCreationStrategy; |
- value = strategy(requester, injector, () { |
- resolving.add(typeName); |
- var val = provider.get(this, requester, _getInstanceByType, _error); |
- resolving.removeLast(); |
- return val; |
- }); |
- } catch(e) { |
- resolving.clear(); |
- rethrow; |
- } |
- |
- // cache the value. |
- providerWithInjector.injector.instances[typeName] = value; |
- return value; |
- } |
- |
- /// Returns a pair for provider and the injector where it's defined. |
- _ProviderWithDefiningInjector _getProviderWithInjectorForType(Type typeName) { |
- if (_providers.containsKey(typeName)) { |
- return new _ProviderWithDefiningInjector(_providers[typeName], this); |
- } |
- |
- if (parent != null) { |
- return parent._getProviderWithInjectorForType(typeName); |
- } |
- |
- if (allowImplicitInjection) { |
- return new _ProviderWithDefiningInjector( |
- new _TypeProvider(typeName), this); |
- } |
- |
- throw new NoProviderError(_error('No provider found for ' |
- '${typeName}!', typeName)); |
- } |
- |
- void _checkTypeConditions(Type typeName) { |
- if (_PRIMITIVE_TYPES.contains(typeName)) { |
- throw new NoProviderError(_error('Cannot inject a primitive type ' |
- 'of $typeName!', typeName)); |
- } |
- } |
- |
- |
- // PUBLIC API |
- |
- /** |
- * Get an instance for given token ([Type]). |
- * |
- * If the injector already has an instance for this token, it returns this |
- * instance. Otherwise, injector resolves all its dependencies, instantiate |
- * new instance and returns this instance. |
- * |
- * If there is no binding for given token, injector asks parent injector. |
- * |
- * If there is no parent injector, an implicit binding is used. That is, |
- * the token ([Type]) is instantiated. |
- */ |
- dynamic get(Type type) => _getInstanceByType(type, this); |
- |
- /** |
- * Create a child injector. |
- * |
- * Child injector can override any bindings by adding additional modules. |
- * |
- * It also accepts a list of tokens that a new instance should be forced. |
- * That means, even if some parent injector already has an instance for this |
- * token, there will be a new instance created in the child injector. |
- */ |
- Injector createChild(List<Module> modules, |
- {List<Type> forceNewInstances, String name}) { |
- if (forceNewInstances != null) { |
- Module forceNew = new Module(); |
- forceNewInstances.forEach((type) { |
- var providerWithInjector = _getProviderWithInjectorForType(type); |
- var provider = providerWithInjector.provider; |
- forceNew.factory(type, |
- (Injector inj) => provider.get(this, inj, inj._getInstanceByType, |
- inj._error), |
- creation: provider.creationStrategy, |
- visibility: provider.visibility); |
- }); |
- |
- modules = modules.toList(); // clone |
- modules.add(forceNew); |
- } |
- |
- return newFromParent(modules, name); |
- } |
- |
- newFromParent(List<Module> modules, String name) { |
- throw new UnimplementedError('This method must be overriden.'); |
- } |
- |
- Object newInstanceOf(Type type, ObjectFactory factory, Injector requestor, |
- errorHandler(message, [appendDependency])) { |
- throw new UnimplementedError('This method must be overriden.'); |
- } |
-} |
- |
-class _ProviderWithDefiningInjector { |
- final _Provider provider; |
- final Injector injector; |
- _ProviderWithDefiningInjector(this.provider, this.injector); |
-} |