@@ -9,22 +9,32 @@ import 'package:barback/barback.dart';
99
1010import 'visitor.dart' ;
1111
12- Future <String > createNgSetters (AssetReader reader, AssetId entryPoint) async {
12+ Future <String > createNgSettersAndGetters (
13+ AssetReader reader, AssetId entryPoint) async {
1314 NgDeps ngDeps = await NgDeps .parse (reader, entryPoint);
1415
1516 String code = ngDeps.code;
16- var setters = _generateSetters (_createBindMap (ngDeps));
17+ var setters = _generateSetters (_createPropertiesMap (ngDeps));
18+ var getters = _generateGetters (_createEventsMap (ngDeps));
1719
18- if (setters.length == 0 ) return code;
20+ if (setters.isEmpty && getters.isEmpty) return code;
21+ var out = new StringBuffer ();
1922 var codeInjectIdx = ngDeps.registeredTypes.last.registerMethod.end;
20- return '${code .substring (0 , codeInjectIdx )}'
21- '..registerSetters({${setters .join (', ' )}})'
22- '${code .substring (codeInjectIdx )}' ;
23+ out.write (code.substring (0 , codeInjectIdx));
24+ if (setters.isNotEmpty) {
25+ out.write ('..registerSetters({${setters .join (', ' )}})' );
26+ }
27+ if (getters.isNotEmpty) {
28+ out.write ('..registerGetters({${getters .join (', ' )}})' );
29+ }
30+ out.write (code.substring (codeInjectIdx));
31+ return '$out ' ;
2332}
2433
2534// TODO(kegluneq): De-dupe from template_compiler/generator.dart.
2635
27- /// Consumes the map generated by {@link _createBindMap} to codegen setters.
36+ /// Consumes the map generated by {@link _createPropertiesMap} to codegen
37+ /// setters.
2838List <String > _generateSetters (Map <String , String > bindMap) {
2939 var setters = [];
3040 // TODO(kegluneq): Include types for receivers. See #886.
@@ -43,8 +53,8 @@ List<String> _generateSetters(Map<String, String> bindMap) {
4353/// Collapses all `properties` in {@link ngDeps} into a map where the keys are
4454/// the bind properties and the values are either the one and only type
4555/// binding to that property or the empty string.
46- Map <String , String > _createBindMap (NgDeps ngDeps) {
47- var visitor = new ExtractSettersVisitor ( );
56+ Map <String , String > _createPropertiesMap (NgDeps ngDeps) {
57+ var visitor = new ExtractNamedExpressionVisitor ( 'properties' );
4858 var bindMap = {};
4959 ngDeps.registeredTypes.forEach ((RegisteredType t) {
5060 visitor.bindConfig.clear ();
@@ -68,3 +78,37 @@ Map<String, String> _createBindMap(NgDeps ngDeps) {
6878 });
6979 return bindMap;
7080}
81+
82+ /// Consumes the map generated by {@link _createEventsMap} to codegen getters.
83+ List <String > _generateGetters (Map <String , String > bindMap) {
84+ var getters = [];
85+ // TODO(kegluneq): Include types for receivers. See #886.
86+ bindMap.forEach ((getterName, eventName) {
87+ if (! prop.isValid (eventName)) {
88+ // TODO(kegluenq): Eagerly throw here once #1295 is addressed.
89+ getters.add (prop.lazyInvalidGetter (eventName));
90+ } else {
91+ getters.add (''' '${prop .sanitize (eventName )}': (o) => o.$getterName ''' );
92+ }
93+ });
94+ return getters;
95+ }
96+
97+ /// Collapses all `events` in {@link ngDeps} into a map where the keys are
98+ /// the property names for the event emitters and the values are the event name.
99+ Map <String , String > _createEventsMap (NgDeps ngDeps) {
100+ var visitor = new ExtractNamedExpressionVisitor ('events' );
101+ var bindMap = {};
102+ ngDeps.registeredTypes.forEach ((RegisteredType t) {
103+ visitor.bindConfig.clear ();
104+ t.annotations.accept (visitor);
105+ visitor.bindConfig.forEach ((String config) {
106+ // See comments for `Directive` in annotations_impl/annotations.ts for
107+ // details on how `events` is specified.
108+ var parts = config.split (':' ).map ((p) => p.trim ()).toList ();
109+ bindMap[parts[0 ]] = parts.length > 1 ? parts[1 ] : parts[0 ];
110+ });
111+ });
112+ return bindMap;
113+ }
114+
0 commit comments