feat(transformers): collect information for CompileDiDependencyMetadata
This commit is contained in:
parent
f60fa14767
commit
39b6e0efba
|
@ -120,14 +120,29 @@ export class CompileDiDependencyMetadata {
|
||||||
}
|
}
|
||||||
|
|
||||||
static fromJson(data: {[key: string]: any}): CompileDiDependencyMetadata {
|
static fromJson(data: {[key: string]: any}): CompileDiDependencyMetadata {
|
||||||
return new CompileDiDependencyMetadata(
|
return new CompileDiDependencyMetadata({
|
||||||
{token: objFromJson(data['token'], CompileIdentifierMetadata.fromJson)});
|
token: objFromJson(data['token'], CompileIdentifierMetadata.fromJson),
|
||||||
|
query: objFromJson(data['query'], CompileQueryMetadata.fromJson),
|
||||||
|
viewQuery: objFromJson(data['viewQuery'], CompileQueryMetadata.fromJson),
|
||||||
|
isAttribute: data['isAttribute'],
|
||||||
|
isSelf: data['isSelf'],
|
||||||
|
isHost: data['isHost'],
|
||||||
|
isSkipSelf: data['isSkipSelf'],
|
||||||
|
isOptional: data['isOptional']
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
toJson(): {[key: string]: any} {
|
toJson(): {[key: string]: any} {
|
||||||
return {
|
return {
|
||||||
// Note: Runtime type can't be serialized...
|
// Note: Runtime type can't be serialized...
|
||||||
'token': objToJson(this.token)
|
'token': objToJson(this.token),
|
||||||
|
'query': objToJson(this.query),
|
||||||
|
'viewQuery': objToJson(this.viewQuery),
|
||||||
|
'isAttribute': this.isAttribute,
|
||||||
|
'isSelf': this.isSelf,
|
||||||
|
'isHost': this.isHost,
|
||||||
|
'isSkipSelf': this.isSkipSelf,
|
||||||
|
'isOptional': this.isOptional
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -274,9 +289,28 @@ export class CompileQueryMetadata {
|
||||||
} = {}) {
|
} = {}) {
|
||||||
this.selectors = selectors;
|
this.selectors = selectors;
|
||||||
this.descendants = descendants;
|
this.descendants = descendants;
|
||||||
this.first = first;
|
this.first = normalizeBool(first);
|
||||||
this.propertyName = propertyName;
|
this.propertyName = propertyName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static fromJson(data: {[key: string]: any}): CompileQueryMetadata {
|
||||||
|
return new CompileQueryMetadata({
|
||||||
|
selectors: arrayFromJson(data['selectors'], CompileIdentifierMetadata.fromJson),
|
||||||
|
descendants: data['descendants'],
|
||||||
|
first: data['first'],
|
||||||
|
propertyName: data['propertyName']
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
toJson(): {[key: string]: any} {
|
||||||
|
return {
|
||||||
|
// Note: Runtime type can't be serialized...
|
||||||
|
'selectors': arrayToJson(this.selectors),
|
||||||
|
'descendants': this.descendants,
|
||||||
|
'first': this.first,
|
||||||
|
'propertyName': this.propertyName
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -581,11 +615,11 @@ var _COMPILE_METADATA_FROM_JSON = {
|
||||||
};
|
};
|
||||||
|
|
||||||
function arrayFromJson(obj: any[], fn: (a: {[key: string]: any}) => any): any {
|
function arrayFromJson(obj: any[], fn: (a: {[key: string]: any}) => any): any {
|
||||||
return isBlank(obj) ? null : obj.map(fn);
|
return isBlank(obj) ? null : obj.map(o => objFromJson(o, fn));
|
||||||
}
|
}
|
||||||
|
|
||||||
function arrayToJson(obj: any[]): string | {[key: string]: any} {
|
function arrayToJson(obj: any[]): string | {[key: string]: any} {
|
||||||
return isBlank(obj) ? null : obj.map(o => o.toJson());
|
return isBlank(obj) ? null : obj.map(objToJson);
|
||||||
}
|
}
|
||||||
|
|
||||||
function objFromJson(obj: any, fn: (a: {[key: string]: any}) => any): any {
|
function objFromJson(obj: any, fn: (a: {[key: string]: any}) => any): any {
|
||||||
|
|
|
@ -16,7 +16,9 @@ import {
|
||||||
CompileDirectiveMetadata,
|
CompileDirectiveMetadata,
|
||||||
CompileTypeMetadata,
|
CompileTypeMetadata,
|
||||||
CompileTemplateMetadata,
|
CompileTemplateMetadata,
|
||||||
CompileProviderMetadata
|
CompileProviderMetadata,
|
||||||
|
CompileDiDependencyMetadata,
|
||||||
|
CompileQueryMetadata
|
||||||
} from 'angular2/src/compiler/directive_metadata';
|
} from 'angular2/src/compiler/directive_metadata';
|
||||||
import {ViewEncapsulation} from 'angular2/src/core/metadata/view';
|
import {ViewEncapsulation} from 'angular2/src/core/metadata/view';
|
||||||
import {ChangeDetectionStrategy} from 'angular2/src/core/change_detection';
|
import {ChangeDetectionStrategy} from 'angular2/src/core/change_detection';
|
||||||
|
@ -29,8 +31,25 @@ export function main() {
|
||||||
var fullDirectiveMeta: CompileDirectiveMetadata;
|
var fullDirectiveMeta: CompileDirectiveMetadata;
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
fullTypeMeta = new CompileTypeMetadata(
|
fullTypeMeta = new CompileTypeMetadata({
|
||||||
{name: 'SomeType', moduleUrl: 'someUrl', isHost: true, diDeps: []});
|
name: 'SomeType',
|
||||||
|
moduleUrl: 'someUrl',
|
||||||
|
isHost: true,
|
||||||
|
diDeps: [
|
||||||
|
new CompileDiDependencyMetadata({
|
||||||
|
isAttribute: true,
|
||||||
|
isSelf: true,
|
||||||
|
isHost: true,
|
||||||
|
isSkipSelf: true,
|
||||||
|
isOptional: true,
|
||||||
|
token: 'someToken',
|
||||||
|
query: new CompileQueryMetadata(
|
||||||
|
{selectors: ['one'], descendants: true, first: true, propertyName: 'one'}),
|
||||||
|
viewQuery: new CompileQueryMetadata(
|
||||||
|
{selectors: ['one'], descendants: true, first: true, propertyName: 'one'})
|
||||||
|
})
|
||||||
|
]
|
||||||
|
});
|
||||||
fullTemplateMeta = new CompileTemplateMetadata({
|
fullTemplateMeta = new CompileTemplateMetadata({
|
||||||
encapsulation: ViewEncapsulation.Emulated,
|
encapsulation: ViewEncapsulation.Emulated,
|
||||||
template: '<a></a>',
|
template: '<a></a>',
|
||||||
|
|
|
@ -185,9 +185,34 @@ class _CompileTypeMetadataVisitor extends Object
|
||||||
final typeToken = p is SimpleFormalParameter && p.type != null ? _readIdentifier(p.type.name) : null;
|
final typeToken = p is SimpleFormalParameter && p.type != null ? _readIdentifier(p.type.name) : null;
|
||||||
final injectTokens = p.metadata.where((m) => m.name.toString() == "Inject").map((m) => _readIdentifier(m.arguments.arguments[0]));
|
final injectTokens = p.metadata.where((m) => m.name.toString() == "Inject").map((m) => _readIdentifier(m.arguments.arguments[0]));
|
||||||
final token = injectTokens.isNotEmpty ? injectTokens.first : typeToken;
|
final token = injectTokens.isNotEmpty ? injectTokens.first : typeToken;
|
||||||
return new CompileDiDependencyMetadata(token: token);
|
final query = _hasAnnotation(p, "Query") ? _createQueryMetadata(_getAnnotation(p, "Query")) : null;
|
||||||
|
final viewQuery = _hasAnnotation(p, "ViewQuery") ? _createQueryMetadata(_getAnnotation(p, "ViewQuery")) : null;
|
||||||
|
|
||||||
|
return new CompileDiDependencyMetadata(
|
||||||
|
token: token,
|
||||||
|
isAttribute: _hasAnnotation(p, "Attribute"),
|
||||||
|
isSelf: _hasAnnotation(p, "Self"),
|
||||||
|
isHost: _hasAnnotation(p, "Host"),
|
||||||
|
isSkipSelf: _hasAnnotation(p, "SkipSelf"),
|
||||||
|
isOptional: _hasAnnotation(p, "Optional"),
|
||||||
|
query: query,
|
||||||
|
viewQuery: viewQuery);
|
||||||
}).toList();
|
}).toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_getAnnotation(p, String attrName) => p.metadata.where((m) => m.name.toString() == attrName).first;
|
||||||
|
_hasAnnotation(p, String attrName) => p.metadata.where((m) => m.name.toString() == attrName).isNotEmpty;
|
||||||
|
_createQueryMetadata(Annotation a) {
|
||||||
|
final selector = _readIdentifier(a.arguments.arguments.first);
|
||||||
|
var descendants = false;
|
||||||
|
a.arguments.arguments.skip(0).forEach((arg) {
|
||||||
|
if (arg is NamedExpression && arg.name.toString() == "descendants:")
|
||||||
|
descendants = naiveEval(arg.expression);
|
||||||
|
});
|
||||||
|
|
||||||
|
final selectors = selector is String ? selector.split(",") : [selector];
|
||||||
|
return new CompileQueryMetadata(selectors: selectors, descendants: descendants);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -174,6 +174,12 @@ class _CompileDataCreator {
|
||||||
if (deps == null) return;
|
if (deps == null) return;
|
||||||
for (var dep in deps) {
|
for (var dep in deps) {
|
||||||
dep.token = _resolveIdentifier(ngMetaMap, neededBy, dep.token);
|
dep.token = _resolveIdentifier(ngMetaMap, neededBy, dep.token);
|
||||||
|
if (dep.query != null) {
|
||||||
|
dep.query.selectors = dep.query.selectors.map((s) => _resolveIdentifier(ngMetaMap, neededBy, s)).toList();
|
||||||
|
}
|
||||||
|
if (dep.viewQuery != null) {
|
||||||
|
dep.viewQuery.selectors = dep.viewQuery.selectors.map((s) => _resolveIdentifier(ngMetaMap, neededBy, s)).toList();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -597,9 +597,17 @@ void allTests() {
|
||||||
expect(cmp).toBeNotNull();
|
expect(cmp).toBeNotNull();
|
||||||
var deps = cmp.type.diDeps;
|
var deps = cmp.type.diDeps;
|
||||||
expect(deps).toBeNotNull();
|
expect(deps).toBeNotNull();
|
||||||
expect(deps.length).toEqual(2);
|
expect(deps.length).toEqual(8);
|
||||||
expect(deps[0].token.name).toEqual("ServiceDep");
|
expect(deps[0].token.name).toEqual("ServiceDep");
|
||||||
expect(deps[1].token.name).toEqual("ServiceDep");
|
expect(deps[1].token.name).toEqual("ServiceDep");
|
||||||
|
expect(deps[2].isAttribute).toEqual(true);
|
||||||
|
expect(deps[3].isSelf).toEqual(true);
|
||||||
|
expect(deps[4].isSkipSelf).toEqual(true);
|
||||||
|
expect(deps[5].isOptional).toEqual(true);
|
||||||
|
expect(deps[6].query.selectors[0].name).toEqual("ServiceDep");
|
||||||
|
expect(deps[6].query.descendants).toEqual(true);
|
||||||
|
expect(deps[7].viewQuery.selectors[0]).toEqual("one");
|
||||||
|
expect(deps[7].viewQuery.selectors[1]).toEqual("two");
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should populate `diDependency` using a string token.',
|
it('should populate `diDependency` using a string token.',
|
||||||
|
|
|
@ -115,7 +115,16 @@ class ComponentWithProvidersUseClass {}
|
||||||
selector: 'component-with-di-deps',
|
selector: 'component-with-di-deps',
|
||||||
template: '')
|
template: '')
|
||||||
class ComponentWithDiDeps {
|
class ComponentWithDiDeps {
|
||||||
ComponentWithDiDeps(ServiceDep arg1, @Inject(ServiceDep) arg2);
|
ComponentWithDiDeps(
|
||||||
|
ServiceDep arg1,
|
||||||
|
@Inject(ServiceDep) arg2,
|
||||||
|
@Attribute('one') arg3,
|
||||||
|
@Self() ServiceDep arg4,
|
||||||
|
@SkipSelf() ServiceDep arg5,
|
||||||
|
@Optional() ServiceDep arg6,
|
||||||
|
@Query(ServiceDep, descendants:true) arg6,
|
||||||
|
@ViewQuery("one,two") arg7
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Component(
|
@Component(
|
||||||
|
|
|
@ -179,6 +179,39 @@ void allTests() {
|
||||||
expect(cmp.type.diDeps[0].token.moduleUrl).toEqual("moduleUrl");
|
expect(cmp.type.diDeps[0].token.moduleUrl).toEqual("moduleUrl");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should resolve queries and viewQueries.', () async {
|
||||||
|
barNgMeta.identifiers['Service'] = new CompileTypeMetadata(name: 'Service', moduleUrl: 'moduleUrl');
|
||||||
|
|
||||||
|
fooComponentMeta.template = new CompileTemplateMetadata(template: "import 'bar.dart';");
|
||||||
|
fooComponentMeta.type.diDeps = [
|
||||||
|
new CompileDiDependencyMetadata(
|
||||||
|
token: 'someToken',
|
||||||
|
query: new CompileQueryMetadata(selectors: [new CompileIdentifierMetadata(name: 'Service')])
|
||||||
|
),
|
||||||
|
new CompileDiDependencyMetadata(
|
||||||
|
token: 'someToken',
|
||||||
|
viewQuery: new CompileQueryMetadata(selectors: [new CompileIdentifierMetadata(name: 'Service')])
|
||||||
|
)
|
||||||
|
];
|
||||||
|
|
||||||
|
final viewAnnotation = new AnnotationModel()..name = 'View'..isView = true;
|
||||||
|
final reflectable = fooNgMeta.ngDeps.reflectables.first;
|
||||||
|
reflectable.annotations.add(viewAnnotation);
|
||||||
|
fooNgMeta.ngDeps.imports.add(new ImportModel()..uri = 'package:a/bar.dart');
|
||||||
|
|
||||||
|
updateReader();
|
||||||
|
|
||||||
|
final viewDefResults = await createCompileData(reader, fooAssetId, [], []);
|
||||||
|
final cmp = viewDefResults.viewDefinitions.values.first.component;
|
||||||
|
|
||||||
|
expect(cmp.type.diDeps.length).toEqual(2);
|
||||||
|
|
||||||
|
expect(cmp.type.diDeps[0].query.selectors[0].name).toEqual("Service");
|
||||||
|
expect(cmp.type.diDeps[0].query.selectors[0].moduleUrl).toEqual("moduleUrl");
|
||||||
|
expect(cmp.type.diDeps[1].viewQuery.selectors[0].name).toEqual("Service");
|
||||||
|
expect(cmp.type.diDeps[1].viewQuery.selectors[0].moduleUrl).toEqual("moduleUrl");
|
||||||
|
});
|
||||||
|
|
||||||
it('should generate providers from Provider objects (references).', () async {
|
it('should generate providers from Provider objects (references).', () async {
|
||||||
barNgMeta.identifiers['Service1'] = new CompileTypeMetadata(name: 'Service1', moduleUrl: 'moduleUrl');
|
barNgMeta.identifiers['Service1'] = new CompileTypeMetadata(name: 'Service1', moduleUrl: 'moduleUrl');
|
||||||
barNgMeta.identifiers['Service2'] = new CompileTypeMetadata(name: 'Service2', moduleUrl: 'moduleUrl');
|
barNgMeta.identifiers['Service2'] = new CompileTypeMetadata(name: 'Service2', moduleUrl: 'moduleUrl');
|
||||||
|
|
Loading…
Reference in New Issue