feat(change_detection): do not reparse AST when using generated detectors

This commit is contained in:
vsavkin
2015-08-19 11:26:45 -07:00
parent b986c54079
commit d2d0715568
31 changed files with 423 additions and 279 deletions

View File

@ -9,6 +9,7 @@ import 'package:angular2/src/change_detection/interfaces.dart';
import 'package:angular2/src/change_detection/proto_change_detector.dart';
import 'package:angular2/src/change_detection/proto_record.dart';
import 'package:angular2/src/change_detection/event_binding.dart';
import 'package:angular2/src/change_detection/binding_record.dart';
import 'package:angular2/src/facade/lang.dart' show BaseException;
/// Responsible for generating change detector classes for Angular 2.
@ -79,7 +80,8 @@ class _CodegenState {
final List<EventBinding> _eventBindings;
final CodegenLogicUtil _logic;
final CodegenNameUtil _names;
final bool _generateCheckNoChanges;
final bool _devMode;
final List<BindingTarget> _propertyBindingTargets;
_CodegenState._(
this._changeDetectorDefId,
@ -87,11 +89,12 @@ class _CodegenState {
this._changeDetectorTypeName,
String changeDetectionStrategy,
this._records,
this._propertyBindingTargets,
this._eventBindings,
this._directiveRecords,
this._logic,
this._names,
this._generateCheckNoChanges)
this._devMode)
: _changeDetectionMode =
ChangeDetectionUtil.changeDetectionMode(changeDetectionStrategy);
@ -99,6 +102,8 @@ class _CodegenState {
ChangeDetectorDefinition def) {
var protoRecords = createPropertyRecords(def);
var eventBindings = createEventRecords(def);
var propertyBindingTargets = def.bindingRecords.map((b) => b.target).toList();
var names = new CodegenNameUtil(protoRecords, eventBindings, def.directiveRecords, _UTIL);
var logic = new CodegenLogicUtil(names, _UTIL, def.strategy);
return new _CodegenState._(
@ -107,11 +112,12 @@ class _CodegenState {
changeDetectorTypeName,
def.strategy,
protoRecords,
propertyBindingTargets,
eventBindings,
def.directiveRecords,
logic,
names,
def.generateCheckNoChanges);
def.devMode);
}
void _writeToBuf(StringBuffer buf) {
@ -119,9 +125,12 @@ class _CodegenState {
class $_changeDetectorTypeName extends $_BASE_CLASS<$_contextTypeName> {
${_genDeclareFields()}
$_changeDetectorTypeName(dispatcher, protos, directiveRecords)
$_changeDetectorTypeName(dispatcher)
: super(${codify(_changeDetectorDefId)},
dispatcher, protos, directiveRecords, '$_changeDetectionMode') {
dispatcher, ${_records.length},
${_changeDetectorTypeName}.gen_propertyBindingTargets,
${_changeDetectorTypeName}.gen_directiveIndices,
'$_changeDetectionMode') {
dehydrateDirectives(false);
}
@ -145,17 +154,31 @@ class _CodegenState {
${_maybeGenDehydrateDirectives()}
${_genPropertyBindingTargets()};
${_genDirectiveIndices()};
static $_GEN_PREFIX.ProtoChangeDetector
$PROTO_CHANGE_DETECTOR_FACTORY_METHOD(
$_GEN_PREFIX.ChangeDetectorDefinition def) {
return new $_GEN_PREFIX.PregenProtoChangeDetector(
(a, b, c) => new $_changeDetectorTypeName(a, b, c),
(a) => new $_changeDetectorTypeName(a),
def);
}
}
''');
}
String _genPropertyBindingTargets() {
var targets = _logic.genPropertyBindingTargets(_propertyBindingTargets, this._devMode);
return "static var gen_propertyBindingTargets = ${targets}";
}
String _genDirectiveIndices() {
var indices = _logic.genDirectiveIndices(_directiveRecords);
return "static var gen_directiveIndices = ${indices}";
}
String _maybeGenHandleEventInternal() {
if (_eventBindings.length > 0) {
var handlers = _eventBindings.map((eb) => _genEventBinding(eb)).join("\n");
@ -239,7 +262,7 @@ class _CodegenState {
var directiveFieldNames = _names.getAllDirectiveNames();
for (var i = 0; i < directiveFieldNames.length; ++i) {
buf.writeln('${directiveFieldNames[i]} = directives.getDirectiveFor('
'${_names.getDirectivesAccessorName()}[$i].directiveIndex);');
'${_names.getDirectivesAccessorName()}[$i]);');
}
return '$buf';
}
@ -378,9 +401,9 @@ class _CodegenState {
var oldValue = _names.getFieldName(r.selfIndex);
var br = r.bindingRecord;
if (br.isDirective()) {
if (br.target.isDirective()) {
var directiveProperty =
'${_names.getDirectiveName(br.directiveRecord.directiveIndex)}.${br.propertyName}';
'${_names.getDirectiveName(br.directiveRecord.directiveIndex)}.${br.target.name}';
return '''
${_genThrowOnChangeCheck(oldValue, newValue)}
$directiveProperty = $newValue;
@ -395,7 +418,7 @@ class _CodegenState {
}
String _genThrowOnChangeCheck(String oldValue, String newValue) {
if (this._generateCheckNoChanges) {
if (this._devMode) {
return '''
if(throwOnChange) {
this.throwOnChangeError(${oldValue}, ${newValue});
@ -407,7 +430,7 @@ class _CodegenState {
}
String _genCheckNoChanges() {
if (this._generateCheckNoChanges) {
if (this._devMode) {
return 'void checkNoChanges() { runDetectChanges(true); }';
} else {
return '';
@ -417,8 +440,8 @@ class _CodegenState {
String _maybeFirstInBinding(ProtoRecord r) {
var prev = ChangeDetectionUtil.protoByIndex(_records, r.selfIndex - 1);
var firstInBindng = prev == null || prev.bindingRecord != r.bindingRecord;
return firstInBindng
? "${_names.getFirstProtoInCurrentBinding()} = ${r.selfIndex};"
return firstInBindng && !r.bindingRecord.isDirectiveLifecycle()
? "${_names.getPropertyBindingIndex()} = ${r.propertyBindingIndex};"
: '';
}

View File

@ -14,7 +14,7 @@ class NullReflectionCapabilities implements ReflectionCapabilities {
return false;
}
Function factory(Type type) => _notImplemented('factory');
Function factory(Type type) => _notImplemented("factory");
List<List> parameters(typeOrFunc) => _notImplemented('parameters');