fix(transformer): Event getters now use property name not event name

This commit is contained in:
Jacob MacDonald 2015-07-13 08:36:44 -07:00
parent a9a552c112
commit cf103de4a7
4 changed files with 23 additions and 20 deletions

View File

@ -15,7 +15,7 @@ Future<String> createNgSettersAndGetters(
String code = ngDeps.code; String code = ngDeps.code;
var setters = _generateSetters(_createPropertiesMap(ngDeps)); var setters = _generateSetters(_createPropertiesMap(ngDeps));
var getters = _generateGetters(_createEventsMap(ngDeps)); var getters = _generateGetters( _createEventPropertiesList(ngDeps));
if (setters.isEmpty && getters.isEmpty) return code; if (setters.isEmpty && getters.isEmpty) return code;
var out = new StringBuffer(); var out = new StringBuffer();
@ -79,35 +79,36 @@ Map<String, String> _createPropertiesMap(NgDeps ngDeps) {
return bindMap; return bindMap;
} }
/// Consumes the map generated by {@link _createEventsMap} to codegen getters. /// Consumes the list generated by {@link _createEventPropertiesList} to codegen
List<String> _generateGetters(Map<String, String> bindMap) { /// getters.
List<String> _generateGetters(List<String> eventProperties) {
var getters = []; var getters = [];
// TODO(kegluneq): Include types for receivers. See #886. // TODO(kegluneq): Include types for receivers. See #886.
bindMap.forEach((getterName, eventName) { for (var property in eventProperties) {
if (!prop.isValid(eventName)) { if (!prop.isValid(property)) {
// TODO(kegluenq): Eagerly throw here once #1295 is addressed. // TODO(kegluenq): Eagerly throw here once #1295 is addressed.
getters.add(prop.lazyInvalidGetter(eventName)); getters.add(prop.lazyInvalidGetter(property));
} else { } else {
getters.add(''' '${prop.sanitize(eventName)}': (o) => o.$getterName'''); getters.add(''' '${prop.sanitize(property)}': (o) => o.$property''');
}
} }
});
return getters; return getters;
} }
/// Collapses all `events` in {@link ngDeps} into a map where the keys are /// Collapses all `events` in {@link ngDeps} into a list of corresponding
/// the property names for the event emitters and the values are the event name. /// property names.
Map<String, String> _createEventsMap(NgDeps ngDeps) { List<String> _createEventPropertiesList(NgDeps ngDeps) {
var visitor = new ExtractNamedExpressionVisitor('events'); var visitor = new ExtractNamedExpressionVisitor('events');
var bindMap = {}; var propertyNames = [];
ngDeps.registeredTypes.forEach((RegisteredType t) { ngDeps.registeredTypes.forEach((RegisteredType t) {
visitor.bindConfig.clear(); visitor.bindConfig.clear();
t.annotations.accept(visitor); t.annotations.accept(visitor);
visitor.bindConfig.forEach((String config) { visitor.bindConfig.forEach((String config) {
// See comments for `Directive` in annotations_impl/annotations.ts for // See comments for `Directive` in annotations_impl/annotations.ts for
// details on how `events` is specified. // details on how `events` is specified. We are pulling out the property
var parts = config.split(':').map((p) => p.trim()).toList(); // name only (everything before the first `:`).
bindMap[parts[0]] = parts.length > 1 ? parts[1] : parts[0]; propertyNames.add(config.split(':').first.trim());
}); });
}); });
return bindMap; return propertyNames;
} }

View File

@ -10,7 +10,9 @@ class NullReflectionCapabilities implements ReflectionCapabilities {
_notImplemented(String name) => throw 'Not implemented: $name'; _notImplemented(String name) => throw 'Not implemented: $name';
bool isReflectionEnabled() { return false; } bool isReflectionEnabled() {
return false;
}
Function factory(Type type) => _notImplemented('factory'); Function factory(Type type) => _notImplemented('factory');

View File

@ -13,7 +13,7 @@ void initReflector(reflector) {
'parameters': const [], 'parameters': const [],
'annotations': const [ 'annotations': const [
const Directive( const Directive(
selector: '[tool-tip]', events: ['onOpen', 'close: onClose']) selector: '[tool-tip]', events: const ['onOpen', 'close: onClose'])
] ]
}); });
} }

View File

@ -13,8 +13,8 @@ void initReflector(reflector) {
'parameters': const [], 'parameters': const [],
'annotations': const [ 'annotations': const [
const Directive( const Directive(
selector: '[tool-tip]', events: ['onOpen', 'close: onClose']) selector: '[tool-tip]', events: const ['onOpen', 'close: onClose'])
] ]
}) })
..registerGetters({'onOpen': (o) => o.onOpen, 'onClose': (o) => o.close}); ..registerGetters({'onOpen': (o) => o.onOpen, 'close': (o) => o.close});
} }