From b4e82b8bc78ef4252c562b3ab40787264efc13a5 Mon Sep 17 00:00:00 2001 From: Victor Berchet Date: Fri, 12 Jun 2015 09:50:30 +0200 Subject: [PATCH] fix(DirectiveMetadata): add support for events, changeDetection --- modules/angular2/src/render/dom/convert.ts | 6 +++- .../common/directive_metadata_reader.dart | 29 ++++++++++++++----- .../angular2/test/render/dom/convert_spec.ts | 12 ++++++-- .../all_tests.dart | 12 ++++++++ .../changeDetection.ng_deps.dart | 29 +++++++++++++++++++ .../events.ng_deps.dart | 29 +++++++++++++++++++ .../expected/bar.ng_meta.json | 2 ++ 7 files changed, 109 insertions(+), 10 deletions(-) create mode 100644 modules/angular2/test/transform/directive_metadata_extractor/directive_metadata_files/changeDetection.ng_deps.dart create mode 100644 modules/angular2/test/transform/directive_metadata_extractor/directive_metadata_files/events.ng_deps.dart diff --git a/modules/angular2/src/render/dom/convert.ts b/modules/angular2/src/render/dom/convert.ts index 60c331fd3a..5a8fdb518b 100644 --- a/modules/angular2/src/render/dom/convert.ts +++ b/modules/angular2/src/render/dom/convert.ts @@ -24,6 +24,8 @@ export function directiveMetadataToMap(meta: DirectiveMetadata): Map): DirectiveMetada callOnCheck:MapWrapper.get(map, 'callOnCheck'), callOnChange:MapWrapper.get(map, 'callOnChange'), callOnInit:MapWrapper.get(map, 'callOnInit'), - callOnAllChangesDone:MapWrapper.get(map, 'callOnAllChangesDone') + callOnAllChangesDone:MapWrapper.get(map, 'callOnAllChangesDone'), + events:>_cloneIfPresent(MapWrapper.get(map, 'events')), + changeDetection:MapWrapper.get(map, 'changeDetection'), }); } diff --git a/modules/angular2/src/transform/common/directive_metadata_reader.dart b/modules/angular2/src/transform/common/directive_metadata_reader.dart index 877454d5d9..454f9114f7 100644 --- a/modules/angular2/src/transform/common/directive_metadata_reader.dart +++ b/modules/angular2/src/transform/common/directive_metadata_reader.dart @@ -63,8 +63,8 @@ class _DirectiveMetadataVisitor extends Object bool _callOnCheck; bool _callOnInit; bool _callOnAllChangesDone; - String changeDetection; - List events; + String _changeDetection; + List _events; final ConstantEvaluator _evaluator = new ConstantEvaluator(); @@ -83,8 +83,8 @@ class _DirectiveMetadataVisitor extends Object _callOnCheck = false; _callOnInit = false; _callOnAllChangesDone = false; - changeDetection = null; - events = []; + _changeDetection = null; + _events = []; } DirectiveMetadata get meta => DirectiveMetadata.create( @@ -100,8 +100,8 @@ class _DirectiveMetadataVisitor extends Object callOnCheck: _callOnCheck, callOnInit: _callOnInit, callOnAllChangesDone: _callOnAllChangesDone, - changeDetection: changeDetection, - events: events); + changeDetection: _changeDetection, + events: _events); @override Object visitAnnotation(Annotation node) { @@ -145,7 +145,6 @@ class _DirectiveMetadataVisitor extends Object '$node' /* source */); } var keyString = '${node.name.label}'; - // TODO(kegluneq): Populate the other values in [DirectiveMetadata] switch (keyString) { case 'selector': _populateSelector(node.expression); @@ -165,6 +164,12 @@ class _DirectiveMetadataVisitor extends Object case 'exportAs': _populateExportAs(node.expression); break; + case 'changeDetection': + _populateChangeDetection(node.expression); + break; + case 'events': + _populateEvents(node.expression); + break; } return null; } @@ -263,4 +268,14 @@ class _DirectiveMetadataVisitor extends Object _callOnInit = lifecycleEvents.contains("onInit"); _callOnAllChangesDone = lifecycleEvents.contains("onAllChangesDone"); } + + void _populateEvents(Expression eventsValue) { + _checkMeta(); + _populateList(eventsValue, _events, 'Directive#events'); + } + + void _populateChangeDetection(Expression value) { + _checkMeta(); + _changeDetection = _expressionToString(value, 'Directive#changeDetection'); + } } diff --git a/modules/angular2/test/render/dom/convert_spec.ts b/modules/angular2/test/render/dom/convert_spec.ts index 36c2c4ca68..276ff6fdce 100644 --- a/modules/angular2/test/render/dom/convert_spec.ts +++ b/modules/angular2/test/render/dom/convert_spec.ts @@ -22,7 +22,9 @@ export function main() { callOnChange: true, callOnCheck: true, callOnInit: true, - callOnAllChangesDone: true + callOnAllChangesDone: true, + events: ['onFoo', 'onBar'], + changeDetection: 'CHECK_ONCE' }); var map = directiveMetadataToMap(someComponent); expect(MapWrapper.get(map, 'compileChildren')).toEqual(false); @@ -45,6 +47,8 @@ export function main() { expect(MapWrapper.get(map, 'callOnInit')).toEqual(true); expect(MapWrapper.get(map, 'callOnAllChangesDone')).toEqual(true); expect(MapWrapper.get(map, 'exportAs')).toEqual('aaa'); + expect(MapWrapper.get(map, 'events')).toEqual(['onFoo', 'onBar']); + expect(MapWrapper.get(map, 'changeDetection')).toEqual('CHECK_ONCE'); }); it('mapToDirectiveMetadata', () => { @@ -64,7 +68,9 @@ export function main() { ['callOnCheck', true], ['callOnInit', true], ['callOnChange', true], - ['callOnAllChangesDone', true] + ['callOnAllChangesDone', true], + ['events', ['onFoo', 'onBar']], + ['changeDetection', 'CHECK_ONCE'] ]); var meta = directiveMetadataFromMap(map); expect(meta.compileChildren).toEqual(false); @@ -83,6 +89,8 @@ export function main() { expect(meta.callOnInit).toEqual(true); expect(meta.callOnChange).toEqual(true); expect(meta.callOnAllChangesDone).toEqual(true); + expect(meta.events).toEqual(['onFoo', 'onBar']); + expect(meta.changeDetection).toEqual('CHECK_ONCE'); }); }); } diff --git a/modules/angular2/test/transform/directive_metadata_extractor/all_tests.dart b/modules/angular2/test/transform/directive_metadata_extractor/all_tests.dart index d569685142..9f90a0b874 100644 --- a/modules/angular2/test/transform/directive_metadata_extractor/all_tests.dart +++ b/modules/angular2/test/transform/directive_metadata_extractor/all_tests.dart @@ -109,6 +109,18 @@ void allTests() { expect(metadata.callOnAllChangesDone).toBe(true); }); + it('should parse events.', () async { + var metadata = await readMetadata('directive_metadata_extractor/' + 'directive_metadata_files/events.ng_deps.dart'); + expect(metadata.events).toEqual(['onFoo', 'onBar']); + }); + + it('should parse changeDetection.', () async { + var metadata = await readMetadata('directive_metadata_extractor/' + 'directive_metadata_files/changeDetection.ng_deps.dart'); + expect(metadata.changeDetection).toEqual('CHECK_ONCE'); + }); + it('should fail when a class is annotated with multiple Directives.', () async { var ngDeps = await NgDeps.parse(reader, new AssetId('a', diff --git a/modules/angular2/test/transform/directive_metadata_extractor/directive_metadata_files/changeDetection.ng_deps.dart b/modules/angular2/test/transform/directive_metadata_extractor/directive_metadata_files/changeDetection.ng_deps.dart new file mode 100644 index 0000000000..f4f1df6591 --- /dev/null +++ b/modules/angular2/test/transform/directive_metadata_extractor/directive_metadata_files/changeDetection.ng_deps.dart @@ -0,0 +1,29 @@ +library examples.hello_world.index_common_dart.ng_deps.dart; + +import 'hello.dart'; +import 'package:angular2/angular2.dart' + show + bootstrap, + Component, + Directive, + View, + NgElement, + onChange, + onDestroy, + onInit, + onCheck, + onAllChangesDone; + +var _visited = false; +void initReflector(reflector) { + if (_visited) return; + _visited = true; + reflector + ..registerType(HelloCmp, { + 'factory': () => new HelloCmp(), + 'parameters': const [const []], + 'annotations': const [ + const Component(changeDetection: 'CHECK_ONCE') + ] + }); +} diff --git a/modules/angular2/test/transform/directive_metadata_extractor/directive_metadata_files/events.ng_deps.dart b/modules/angular2/test/transform/directive_metadata_extractor/directive_metadata_files/events.ng_deps.dart new file mode 100644 index 0000000000..2e6bd5995f --- /dev/null +++ b/modules/angular2/test/transform/directive_metadata_extractor/directive_metadata_files/events.ng_deps.dart @@ -0,0 +1,29 @@ +library examples.hello_world.index_common_dart.ng_deps.dart; + +import 'hello.dart'; +import 'package:angular2/angular2.dart' + show + bootstrap, + Component, + Directive, + View, + NgElement, + onChange, + onDestroy, + onInit, + onCheck, + onAllChangesDone; + +var _visited = false; +void initReflector(reflector) { + if (_visited) return; + _visited = true; + reflector + ..registerType(HelloCmp, { + 'factory': () => new HelloCmp(), + 'parameters': const [const []], + 'annotations': const [ + const Component(events: ['onFoo', 'onBar']) + ] + }); +} diff --git a/modules/angular2/test/transform/integration/simple_annotation_files/expected/bar.ng_meta.json b/modules/angular2/test/transform/integration/simple_annotation_files/expected/bar.ng_meta.json index fe247de602..775a7253b0 100644 --- a/modules/angular2/test/transform/integration/simple_annotation_files/expected/bar.ng_meta.json +++ b/modules/angular2/test/transform/integration/simple_annotation_files/expected/bar.ng_meta.json @@ -16,6 +16,8 @@ "callOnInit": false, "callOnChange": false, "callOnAllChangesDone": false, + "events": [], + "changeDetection": null, "version": 1 } } \ No newline at end of file