refactor(ChangeDetector): misc minor updates

This commit is contained in:
Victor Berchet 2015-10-15 16:24:42 -07:00
parent c56efc0c5f
commit b91351469f
3 changed files with 38 additions and 34 deletions

View File

@ -3,14 +3,15 @@ import {ListWrapper, Map} from 'angular2/src/core/facade/collection';
import {RecordType, ProtoRecord} from './proto_record';
/**
* Removes "duplicate" records. It assuming that record evaluation does not
* have side-effects.
* Removes "duplicate" records. It assumes that record evaluation does not have side-effects.
*
* Records that are not last in bindings are removed and all the indices
* of the records that depend on them are updated.
* Records that are not last in bindings are removed and all the indices of the records that depend
* on them are updated.
*
* Records that are last in bindings CANNOT be removed, and instead are
* replaced with very cheap SELF records.
* Records that are last in bindings CANNOT be removed, and instead are replaced with very cheap
* SELF records.
*
* @internal
*/
export function coalesce(records: ProtoRecord[]): ProtoRecord[] {
var res: ProtoRecord[] = [];

View File

@ -7,7 +7,7 @@ import {EventBinding} from './event_binding';
import {BindingRecord, BindingTarget} from './binding_record';
import {DirectiveRecord, DirectiveIndex} from './directive_record';
import {Locals} from './parser/locals';
import {ChangeDetectorGenConfig} from './interfaces';
import {ChangeDispatcher, ChangeDetectorGenConfig} from './interfaces';
import {ChangeDetectionUtil, SimpleChange} from './change_detection_util';
import {ChangeDetectionStrategy, ChangeDetectorState} from './constants';
import {ProtoRecord, RecordType} from './proto_record';
@ -19,7 +19,7 @@ export class DynamicChangeDetector extends AbstractChangeDetector<any> {
prevContexts: any[];
directives: any = null;
constructor(id: string, dispatcher: any, numberOfPropertyProtoRecords: number,
constructor(id: string, dispatcher: ChangeDispatcher, numberOfPropertyProtoRecords: number,
propertyBindingTargets: BindingTarget[], directiveIndices: DirectiveIndex[],
strategy: ChangeDetectionStrategy, private _records: ProtoRecord[],
private _eventBindings: EventBinding[], private _directiveRecords: DirectiveRecord[],
@ -195,7 +195,7 @@ export class DynamicChangeDetector extends AbstractChangeDetector<any> {
}
/** @internal */
_updateDirectiveOrElement(change, bindingRecord) {
private _updateDirectiveOrElement(change, bindingRecord) {
if (isBlank(bindingRecord.directiveRecord)) {
super.notifyDispatcher(change.currentValue);
} else {
@ -209,7 +209,7 @@ export class DynamicChangeDetector extends AbstractChangeDetector<any> {
}
/** @internal */
_addChange(bindingRecord: BindingRecord, change, changes) {
private _addChange(bindingRecord: BindingRecord, change, changes) {
if (bindingRecord.callOnChanges()) {
return super.addChange(changes, change.previousValue, change.currentValue);
} else {
@ -218,13 +218,16 @@ export class DynamicChangeDetector extends AbstractChangeDetector<any> {
}
/** @internal */
_getDirectiveFor(directiveIndex) { return this.directives.getDirectiveFor(directiveIndex); }
private _getDirectiveFor(directiveIndex) {
return this.directives.getDirectiveFor(directiveIndex);
}
/** @internal */
_getDetectorFor(directiveIndex) { return this.directives.getDetectorFor(directiveIndex); }
private _getDetectorFor(directiveIndex) { return this.directives.getDetectorFor(directiveIndex); }
/** @internal */
_check(proto: ProtoRecord, throwOnChange: boolean, values: any[], locals: Locals): SimpleChange {
private _check(proto: ProtoRecord, throwOnChange: boolean, values: any[],
locals: Locals): SimpleChange {
if (proto.isPipeRecord()) {
return this._pipeCheck(proto, throwOnChange, values);
} else {
@ -233,7 +236,8 @@ export class DynamicChangeDetector extends AbstractChangeDetector<any> {
}
/** @internal */
_referenceCheck(proto: ProtoRecord, throwOnChange: boolean, values: any[], locals: Locals) {
private _referenceCheck(proto: ProtoRecord, throwOnChange: boolean, values: any[],
locals: Locals) {
if (this._pureFuncAndArgsDidNotChange(proto)) {
this._setChanged(proto, false);
return null;
@ -272,7 +276,7 @@ export class DynamicChangeDetector extends AbstractChangeDetector<any> {
}
/** @internal */
_calculateCurrValue(proto: ProtoRecord, values: any[], locals: Locals) {
private _calculateCurrValue(proto: ProtoRecord, values: any[], locals: Locals) {
switch (proto.mode) {
case RecordType.Self:
return this._readContext(proto, values);
@ -340,7 +344,7 @@ export class DynamicChangeDetector extends AbstractChangeDetector<any> {
}
/** @internal */
_pipeCheck(proto: ProtoRecord, throwOnChange: boolean, values: any[]) {
private _pipeCheck(proto: ProtoRecord, throwOnChange: boolean, values: any[]) {
var context = this._readContext(proto, values);
var selectedPipe = this._pipeFor(proto, context);
if (!selectedPipe.pure || this._argsOrContextChanged(proto)) {
@ -379,7 +383,7 @@ export class DynamicChangeDetector extends AbstractChangeDetector<any> {
}
/** @internal */
_pipeFor(proto: ProtoRecord, context) {
private _pipeFor(proto: ProtoRecord, context) {
var storedPipe = this._readPipe(proto);
if (isPresent(storedPipe)) return storedPipe;
@ -389,7 +393,7 @@ export class DynamicChangeDetector extends AbstractChangeDetector<any> {
}
/** @internal */
_readContext(proto: ProtoRecord, values: any[]) {
private _readContext(proto: ProtoRecord, values: any[]) {
if (proto.contextIndex == -1) {
return this._getDirectiveFor(proto.directiveIndex);
}
@ -397,29 +401,29 @@ export class DynamicChangeDetector extends AbstractChangeDetector<any> {
}
/** @internal */
_readSelf(proto: ProtoRecord, values: any[]) { return values[proto.selfIndex]; }
private _readSelf(proto: ProtoRecord, values: any[]) { return values[proto.selfIndex]; }
/** @internal */
_writeSelf(proto: ProtoRecord, value, values: any[]) { values[proto.selfIndex] = value; }
private _writeSelf(proto: ProtoRecord, value, values: any[]) { values[proto.selfIndex] = value; }
/** @internal */
_readPipe(proto: ProtoRecord) { return this.localPipes[proto.selfIndex]; }
private _readPipe(proto: ProtoRecord) { return this.localPipes[proto.selfIndex]; }
/** @internal */
_writePipe(proto: ProtoRecord, value) { this.localPipes[proto.selfIndex] = value; }
private _writePipe(proto: ProtoRecord, value) { this.localPipes[proto.selfIndex] = value; }
/** @internal */
_setChanged(proto: ProtoRecord, value: boolean) {
private _setChanged(proto: ProtoRecord, value: boolean) {
if (proto.argumentToPureFunction) this.changes[proto.selfIndex] = value;
}
/** @internal */
_pureFuncAndArgsDidNotChange(proto: ProtoRecord): boolean {
private _pureFuncAndArgsDidNotChange(proto: ProtoRecord): boolean {
return proto.isPureFunction() && !this._argsChanged(proto);
}
/** @internal */
_argsChanged(proto: ProtoRecord): boolean {
private _argsChanged(proto: ProtoRecord): boolean {
var args = proto.args;
for (var i = 0; i < args.length; ++i) {
if (this.changes[args[i]]) {
@ -430,12 +434,12 @@ export class DynamicChangeDetector extends AbstractChangeDetector<any> {
}
/** @internal */
_argsOrContextChanged(proto: ProtoRecord): boolean {
private _argsOrContextChanged(proto: ProtoRecord): boolean {
return this._argsChanged(proto) || this.changes[proto.contextIndex];
}
/** @internal */
_readArgs(proto: ProtoRecord, values: any[]) {
private _readArgs(proto: ProtoRecord, values: any[]) {
var res = ListWrapper.createFixedSize(proto.args.length);
var args = proto.args;
for (var i = 0; i < args.length; ++i) {

View File

@ -80,9 +80,7 @@ export function createEventRecords(definition: ChangeDetectorDefinition): EventB
}
export class ProtoRecordBuilder {
records: ProtoRecord[];
constructor() { this.records = []; }
records: ProtoRecord[] = [];
add(b: BindingRecord, variableNames: string[], bindingIndex: number) {
var oldLast = ListWrapper.last(this.records);
@ -265,8 +263,7 @@ class _ConvertAstIntoProtoRecords implements AstVisitor {
return this._addRecord(RecordType.Chain, "chain", null, args, null, 0);
}
/** @internal */
_visitAll(asts: any[]) {
private _visitAll(asts: any[]) {
var res = ListWrapper.createFixedSize(asts.length);
for (var i = 0; i < asts.length; ++i) {
res[i] = asts[i].visit(this);
@ -274,8 +271,10 @@ class _ConvertAstIntoProtoRecords implements AstVisitor {
return res;
}
/** @internal */
_addRecord(type, name, funcOrValue, args, fixedArgs, context) {
/**
* Adds a `ProtoRecord` and returns its selfIndex.
*/
private _addRecord(type, name, funcOrValue, args, fixedArgs, context): number {
var selfIndex = this._records.length + 1;
if (context instanceof DirectiveIndex) {
this._records.push(new ProtoRecord(type, name, funcOrValue, args, fixedArgs, -1, context,