Skip to content

Commit 6fb9269

Browse files
committed
9d5918e refactor(core): add MapInjector.createFactory and add factories to MapInjector.
1 parent a33397e commit 6fb9269

21 files changed

Lines changed: 633 additions & 471 deletions

BUILD_INFO

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
Fri Jun 17 15:02:43 UTC 2016
2-
43133b5d55524d91cd2fe0c6757b3c4e35427cd8
1+
Mon Jun 20 19:51:20 UTC 2016
2+
9d5918ee35212b43f0b9d8107d36d5d825962620

_analyzer.dart

Lines changed: 385 additions & 383 deletions
Large diffs are not rendered by default.

lib/src/compiler/compile_metadata.dart

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -798,6 +798,7 @@ class CompileInjectorModuleMetadata
798798
var isHost = false;
799799
dynamic value;
800800
List<CompileDiDependencyMetadata> diDeps;
801+
bool injectable;
801802
List<dynamic /* CompileProviderMetadata | CompileTypeMetadata | CompileIdentifierMetadata | List < dynamic > */ >
802803
providers;
803804
CompileInjectorModuleMetadata(
@@ -808,14 +809,16 @@ class CompileInjectorModuleMetadata
808809
dynamic value,
809810
List<CompileDiDependencyMetadata> diDeps,
810811
List<
811-
dynamic /* CompileProviderMetadata | CompileTypeMetadata | CompileIdentifierMetadata | List < dynamic > */ > providers}) {
812+
dynamic /* CompileProviderMetadata | CompileTypeMetadata | CompileIdentifierMetadata | List < dynamic > */ > providers,
813+
bool injectable}) {
812814
this.runtime = runtime;
813815
this.name = name;
814816
this.moduleUrl = moduleUrl;
815817
this.prefix = prefix;
816818
this.value = value;
817819
this.diDeps = _normalizeArray(diDeps);
818820
this.providers = _normalizeArray(providers);
821+
this.injectable = normalizeBool(injectable);
819822
}
820823
static CompileInjectorModuleMetadata fromJson(Map<String, dynamic> data) {
821824
return new CompileInjectorModuleMetadata(
@@ -825,7 +828,8 @@ class CompileInjectorModuleMetadata
825828
value: data["value"],
826829
diDeps: _arrayFromJson(
827830
data["diDeps"], CompileDiDependencyMetadata.fromJson),
828-
providers: _arrayFromJson(data["providers"], metadataFromJson));
831+
providers: _arrayFromJson(data["providers"], metadataFromJson),
832+
injectable: data["injectable"]);
829833
}
830834

831835
CompileIdentifierMetadata get identifier {
@@ -846,7 +850,8 @@ class CompileInjectorModuleMetadata
846850
"isHost": this.isHost,
847851
"value": this.value,
848852
"diDeps": _arrayToJson(this.diDeps),
849-
"providers": _arrayToJson(this.providers)
853+
"providers": _arrayToJson(this.providers),
854+
"injectable": this.injectable
850855
};
851856
}
852857
}

lib/src/compiler/identifiers.dart

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ import "package:angular2/src/core/linker/template_ref.dart"
3030
show TemplateRef, TemplateRef_;
3131
import "util.dart" show MODULE_SUFFIX;
3232
import "package:angular2/src/core/linker/injector_factory.dart"
33-
show CodegenInjector, InjectorFactory;
33+
show CodegenInjector, CodegenInjectorFactory;
3434

3535
var APP_VIEW_MODULE_URL =
3636
"asset:angular2/lib/src/core/linker/view" + MODULE_SUFFIX;
@@ -59,7 +59,7 @@ var impTemplateRef_ = TemplateRef_;
5959
var impValueUnwrapper = ValueUnwrapper;
6060
var impInjector = Injector;
6161
var impCodegenInjector = CodegenInjector;
62-
var impInjectorFactory = InjectorFactory;
62+
var impCodegenInjectorFactory = CodegenInjectorFactory;
6363
var impViewEncapsulation = ViewEncapsulation;
6464
var impViewType = ViewType;
6565
var impChangeDetectionStrategy = ChangeDetectionStrategy;
@@ -133,10 +133,10 @@ class Identifiers {
133133
moduleUrl: '''asset:angular2/lib/src/core/di/injector${ MODULE_SUFFIX}''',
134134
runtime: impInjector);
135135
static var InjectorFactory = new CompileIdentifierMetadata(
136-
name: "InjectorFactory",
136+
name: "CodegenInjectorFactory",
137137
moduleUrl:
138138
'''asset:angular2/lib/src/core/linker/injector_factory${ MODULE_SUFFIX}''',
139-
runtime: impInjectorFactory);
139+
runtime: impCodegenInjectorFactory);
140140
static var CodegenInjector = new CompileIdentifierMetadata(
141141
name: "CodegenInjector",
142142
moduleUrl:

lib/src/compiler/runtime_compiler.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ import "runtime_metadata.dart" show RuntimeMetadataResolver;
5252
import "package:angular2/src/core/linker/component_factory.dart"
5353
show ComponentFactory;
5454
import "package:angular2/src/core/linker/injector_factory.dart"
55-
show InjectorFactory;
55+
show CodegenInjectorFactory;
5656
import "package:angular2/src/core/linker/component_resolver.dart"
5757
show ComponentResolver, ReflectorComponentResolver;
5858
import "config.dart" show CompilerConfig;
@@ -92,7 +92,7 @@ class RuntimeCompiler implements ComponentResolver {
9292
this._xhr,
9393
this._injectorCompiler,
9494
this._genConfig) {}
95-
InjectorFactory<dynamic> createInjectorFactory(Type moduleClass,
95+
CodegenInjectorFactory<dynamic> createInjectorFactory(Type moduleClass,
9696
[List<dynamic> extraProviders = const []]) {
9797
var injectorModuleMeta = this
9898
._runtimeMetadataResolver

lib/src/core/di.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ export "di/metadata.dart"
1717
// we have to reexport * because Dart and TS export two different sets of types
1818
export "di/decorators.dart";
1919
export "di/forward_ref.dart" show forwardRef, resolveForwardRef, ForwardRefFn;
20-
export "di/injector.dart" show Injector, MapInjector;
20+
export "di/injector.dart" show Injector, InjectorFactory;
2121
export "di/reflective_injector.dart" show ReflectiveInjector;
2222
export "di/provider.dart"
2323
show Binding, ProviderBuilder, bind, Provider, provide;
@@ -38,3 +38,4 @@ export "di/reflective_exceptions.dart"
3838
NoAnnotationError,
3939
OutOfBoundsError;
4040
export "di/opaque_token.dart" show OpaqueToken;
41+
export "di/map_injector.dart" show MapInjector, MapInjectorFactory;

lib/src/core/di/injector.dart

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -52,23 +52,17 @@ abstract class Injector {
5252
}
5353
}
5454

55+
class _EmptyInjectorFactory implements InjectorFactory<dynamic> {
56+
Injector create([Injector parent = null, dynamic context = null]) {
57+
return isBlank(parent) ? Injector.NULL : parent;
58+
}
59+
}
60+
5561
/**
56-
* An simple injector based on a Map of values.
62+
* A factory for an injector.
5763
*/
58-
class MapInjector implements Injector {
59-
Injector _parent;
60-
Map<dynamic, dynamic> _values;
61-
MapInjector(this._parent, this._values) {
62-
if (isBlank(this._parent)) {
63-
this._parent = Injector.NULL;
64-
}
65-
}
66-
dynamic get(dynamic token, [dynamic notFoundValue = _THROW_IF_NOT_FOUND]) {
67-
if (identical(token, Injector)) {
68-
return this;
69-
}
70-
return this._values.containsKey(token)
71-
? this._values[token]
72-
: this._parent.get(token, notFoundValue);
73-
}
64+
abstract class InjectorFactory<CONTEXT> {
65+
// An InjectorFactory that will always delegate to the parent.
66+
static InjectorFactory<dynamic> EMPTY = new _EmptyInjectorFactory();
67+
Injector create([Injector parent, CONTEXT context]);
7468
}

lib/src/core/di/map_injector.dart

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
library angular2.src.core.di.map_injector;
2+
3+
import "package:angular2/src/facade/lang.dart" show isBlank;
4+
import "injector.dart" show Injector, InjectorFactory, THROW_IF_NOT_FOUND;
5+
6+
/**
7+
* An simple injector based on a Map of values.
8+
*/
9+
class MapInjector implements Injector {
10+
Injector _parent;
11+
static InjectorFactory<dynamic> createFactory(
12+
[Map<dynamic, dynamic> values,
13+
Map<dynamic, dynamic /* (injector: Injector) => any */ > factories]) {
14+
return new MapInjectorFactory(values, factories);
15+
}
16+
17+
Map<dynamic, dynamic> _instances = new Map<dynamic, dynamic>();
18+
Map<dynamic, dynamic /* (injector: Injector) => any */ > _factories;
19+
Map<dynamic, dynamic> _values;
20+
MapInjector(
21+
[this._parent = null,
22+
Map<dynamic, dynamic> values = null,
23+
Map<dynamic, dynamic /* (injector: Injector) => any */ > factories =
24+
null]) {
25+
if (isBlank(values)) {
26+
values = new Map<dynamic, dynamic>();
27+
}
28+
this._values = values;
29+
if (isBlank(factories)) {
30+
factories = new Map<dynamic, dynamic>();
31+
}
32+
this._factories = factories;
33+
if (isBlank(this._parent)) {
34+
this._parent = Injector.NULL;
35+
}
36+
}
37+
dynamic get(dynamic token, [dynamic notFoundValue = THROW_IF_NOT_FOUND]) {
38+
if (identical(token, Injector)) {
39+
return this;
40+
}
41+
if (this._values.containsKey(token)) {
42+
return this._values[token];
43+
}
44+
if (this._instances.containsKey(token)) {
45+
return this._instances[token];
46+
}
47+
if (this._factories.containsKey(token)) {
48+
var instance = this._factories[token](this);
49+
this._instances[token] = instance;
50+
return instance;
51+
}
52+
return this._parent.get(token, notFoundValue);
53+
}
54+
}
55+
56+
/**
57+
* InjectorFactory for MapInjector.
58+
*/
59+
class MapInjectorFactory implements InjectorFactory<dynamic> {
60+
Map<dynamic, dynamic> _values;
61+
Map<dynamic, dynamic /* (injector: Injector) => any */ > _factories;
62+
MapInjectorFactory([this._values = null, this._factories = null]) {}
63+
Injector create([Injector parent = null, dynamic context = null]) {
64+
return new MapInjector(parent, this._values, this._factories);
65+
}
66+
}

lib/src/core/linker.dart

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,3 @@ export "linker/view_container_ref.dart" show ViewContainerRef;
1111
export "linker/component_factory.dart" show ComponentRef, ComponentFactory;
1212
export "linker/exceptions.dart"
1313
show ExpressionChangedAfterItHasBeenCheckedException;
14-
export "linker/injector_factory.dart" show InjectorFactory;

lib/src/core/linker/component_resolver.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,15 @@ import "package:angular2/src/facade/exceptions.dart"
99
import "package:angular2/src/facade/async.dart" show PromiseWrapper;
1010
import "package:angular2/src/core/reflection/reflection.dart" show reflector;
1111
import "component_factory.dart" show ComponentFactory;
12-
import "injector_factory.dart" show InjectorFactory;
12+
import "injector_factory.dart" show CodegenInjectorFactory;
1313

1414
/**
1515
* Low-level service for loading [ComponentFactory]s, which
1616
* can later be used to create and render a Component instance.
1717
*/
1818
abstract class ComponentResolver {
1919
Future<ComponentFactory> resolveComponent(Type componentType);
20-
InjectorFactory<dynamic> createInjectorFactory(Type injectorModule,
20+
CodegenInjectorFactory<dynamic> createInjectorFactory(Type injectorModule,
2121
[List<dynamic> extraProviders]);
2222
clearCache();
2323
}
@@ -39,7 +39,7 @@ class ReflectorComponentResolver extends ComponentResolver {
3939
return PromiseWrapper.resolve(componentFactory);
4040
}
4141

42-
InjectorFactory<dynamic> createInjectorFactory(Type injectorModule,
42+
CodegenInjectorFactory<dynamic> createInjectorFactory(Type injectorModule,
4343
[List<dynamic> extraProviders]) {
4444
return unimplemented();
4545
}

0 commit comments

Comments
 (0)