refactor(compiler): remove unused code
BREAKING CHANGE: - Removes `ChangeDetection`, use a binding for `ChangeDetectorGenConfig` instead to configure change detection. - `RenderElementRef.renderBoundElementIndex` was renamed to `RenderElementRef.boundElementIndex`. - Removes `ViewLoader`, use `XHRImpl` instead.
This commit is contained in:
@ -48,7 +48,6 @@ import {
|
||||
import {QueryList} from './query_list';
|
||||
import {reflector} from 'angular2/src/core/reflection/reflection';
|
||||
import {SetterFn} from 'angular2/src/core/reflection/types';
|
||||
import {RenderDirectiveMetadata} from 'angular2/src/core/render/api';
|
||||
import {EventConfig} from 'angular2/src/core/render/event_config';
|
||||
import {PipeBinding} from '../pipes/pipe_binding';
|
||||
|
||||
@ -128,17 +127,17 @@ export class DirectiveDependency extends Dependency {
|
||||
}
|
||||
|
||||
export class DirectiveBinding extends ResolvedBinding {
|
||||
constructor(key: Key, factory: Function, deps: Dependency[],
|
||||
public metadata: RenderDirectiveMetadata,
|
||||
public callOnDestroy: boolean;
|
||||
|
||||
constructor(key: Key, factory: Function, deps: Dependency[], public metadata: DirectiveMetadata,
|
||||
public bindings: Array<Type | Binding | any[]>,
|
||||
public viewBindings: Array<Type | Binding | any[]>) {
|
||||
super(key, [new ResolvedFactory(factory, deps)], false);
|
||||
this.callOnDestroy = hasLifecycleHook(LifecycleHooks.OnDestroy, key.token);
|
||||
}
|
||||
|
||||
get displayName(): string { return this.key.displayName; }
|
||||
|
||||
get callOnDestroy(): boolean { return this.metadata.callOnDestroy; }
|
||||
|
||||
get queries(): QueryMetadataWithSetter[] {
|
||||
if (isBlank(this.metadata.queries)) return [];
|
||||
|
||||
@ -163,47 +162,11 @@ export class DirectiveBinding extends ResolvedBinding {
|
||||
var rb = resolveBinding(binding);
|
||||
var rf = rb.resolvedFactories[0];
|
||||
var deps = rf.dependencies.map(DirectiveDependency.createFrom);
|
||||
var token = binding.token;
|
||||
|
||||
var metadata = RenderDirectiveMetadata.create({
|
||||
id: stringify(binding.token),
|
||||
type: meta instanceof ComponentMetadata ? RenderDirectiveMetadata.COMPONENT_TYPE :
|
||||
RenderDirectiveMetadata.DIRECTIVE_TYPE,
|
||||
selector: meta.selector,
|
||||
compileChildren: true,
|
||||
outputs: meta.outputs,
|
||||
host: isPresent(meta.host) ? MapWrapper.createFromStringMap(meta.host) : null,
|
||||
inputs: meta.inputs,
|
||||
readAttributes: DirectiveBinding._readAttributes(<any>deps),
|
||||
queries: meta.queries,
|
||||
|
||||
callOnDestroy: hasLifecycleHook(LifecycleHooks.OnDestroy, token),
|
||||
callOnChanges: hasLifecycleHook(LifecycleHooks.OnChanges, token),
|
||||
callDoCheck: hasLifecycleHook(LifecycleHooks.DoCheck, token),
|
||||
callOnInit: hasLifecycleHook(LifecycleHooks.OnInit, token),
|
||||
callAfterContentInit: hasLifecycleHook(LifecycleHooks.AfterContentInit, token),
|
||||
callAfterContentChecked: hasLifecycleHook(LifecycleHooks.AfterContentChecked, token),
|
||||
callAfterViewInit: hasLifecycleHook(LifecycleHooks.AfterViewInit, token),
|
||||
callAfterViewChecked: hasLifecycleHook(LifecycleHooks.AfterViewChecked, token),
|
||||
|
||||
changeDetection: meta instanceof ComponentMetadata ? meta.changeDetection : null,
|
||||
|
||||
exportAs: meta.exportAs
|
||||
});
|
||||
var bindings = isPresent(meta.bindings) ? meta.bindings : [];
|
||||
var viewBindigs =
|
||||
meta instanceof ComponentMetadata && isPresent(meta.viewBindings) ? meta.viewBindings : [];
|
||||
return new DirectiveBinding(rb.key, rf.factory, deps, metadata, bindings, viewBindigs);
|
||||
}
|
||||
|
||||
static _readAttributes(deps: DirectiveDependency[]): string[] {
|
||||
var readAttributes = [];
|
||||
deps.forEach(dep => {
|
||||
if (isPresent(dep.attributeName)) {
|
||||
readAttributes.push(dep.attributeName);
|
||||
}
|
||||
});
|
||||
return readAttributes;
|
||||
return new DirectiveBinding(rb.key, rf.factory, deps, meta, bindings, viewBindigs);
|
||||
}
|
||||
|
||||
static createFromType(type: Type, annotation: DirectiveMetadata): DirectiveBinding {
|
||||
@ -502,7 +465,7 @@ export class ElementInjector extends TreeNode<ElementInjector> implements Depend
|
||||
if (dirDep.key.id === StaticKeys.instance().changeDetectorRefId) {
|
||||
// We provide the component's view change detector to components and
|
||||
// the surrounding component's change detector to directives.
|
||||
if (dirBin.metadata.type === RenderDirectiveMetadata.COMPONENT_TYPE) {
|
||||
if (dirBin.metadata instanceof ComponentMetadata) {
|
||||
var componentView = this._preBuiltObjects.view.getNestedView(
|
||||
this._preBuiltObjects.elementRef.boundElementIndex);
|
||||
return componentView.changeDetector.ref;
|
||||
|
@ -29,24 +29,12 @@ export class ElementRef implements RenderElementRef {
|
||||
* This is used internally by the Angular framework to locate elements.
|
||||
*/
|
||||
boundElementIndex: number;
|
||||
|
||||
/**
|
||||
* @private
|
||||
*
|
||||
* TODO(tbosch): remove this when the new compiler lands
|
||||
* Index of the element inside the `RenderViewRef`.
|
||||
*
|
||||
* This is used internally by the Angular framework to locate elements.
|
||||
*/
|
||||
renderBoundElementIndex: number;
|
||||
|
||||
/**
|
||||
* @private
|
||||
*/
|
||||
constructor(parentView: ViewRef, boundElementIndex: number, private _renderer: Renderer) {
|
||||
this.parentView = parentView;
|
||||
this.boundElementIndex = boundElementIndex;
|
||||
this.renderBoundElementIndex = boundElementIndex;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1,28 +1,7 @@
|
||||
import {ListWrapper, MapWrapper} from 'angular2/src/core/facade/collection';
|
||||
import {ListWrapper} from 'angular2/src/core/facade/collection';
|
||||
import {isPresent, isBlank, Type, isArray, isNumber} from 'angular2/src/core/facade/lang';
|
||||
import {reflector} from 'angular2/src/core/reflection/reflection';
|
||||
|
||||
import {
|
||||
ChangeDetection,
|
||||
DirectiveIndex,
|
||||
BindingRecord,
|
||||
DirectiveRecord,
|
||||
ProtoChangeDetector,
|
||||
ChangeDetectionStrategy,
|
||||
ChangeDetectorDefinition,
|
||||
ChangeDetectorGenConfig,
|
||||
ASTWithSource
|
||||
} from 'angular2/src/core/change_detection/change_detection';
|
||||
|
||||
import {
|
||||
RenderDirectiveMetadata,
|
||||
RenderElementBinder,
|
||||
PropertyBindingType,
|
||||
DirectiveBinder,
|
||||
ProtoViewDto,
|
||||
ViewType,
|
||||
RenderProtoViewRef
|
||||
} from 'angular2/src/core/render/api';
|
||||
import {ViewType, RenderProtoViewRef} from 'angular2/src/core/render/api';
|
||||
|
||||
import {Injectable, Binding, resolveForwardRef, Inject} from 'angular2/src/core/di';
|
||||
|
||||
@ -344,272 +323,3 @@ function _flattenList(tree: any[], out: Array<Type | Binding | any[]>): void {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
export class BindingRecordsCreator {
|
||||
_directiveRecordsMap: Map<number, DirectiveRecord> = new Map<number, DirectiveRecord>();
|
||||
|
||||
getEventBindingRecords(elementBinders: RenderElementBinder[],
|
||||
allDirectiveMetadatas: RenderDirectiveMetadata[]): BindingRecord[] {
|
||||
var res = [];
|
||||
for (var boundElementIndex = 0; boundElementIndex < elementBinders.length;
|
||||
boundElementIndex++) {
|
||||
var renderElementBinder = elementBinders[boundElementIndex];
|
||||
|
||||
this._createTemplateEventRecords(res, renderElementBinder, boundElementIndex);
|
||||
this._createHostEventRecords(res, renderElementBinder, allDirectiveMetadatas,
|
||||
boundElementIndex);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
private _createTemplateEventRecords(res: BindingRecord[],
|
||||
renderElementBinder: RenderElementBinder,
|
||||
boundElementIndex: number): void {
|
||||
renderElementBinder.eventBindings.forEach(eb => {
|
||||
res.push(BindingRecord.createForEvent(eb.source, eb.fullName, boundElementIndex));
|
||||
});
|
||||
}
|
||||
|
||||
private _createHostEventRecords(res: BindingRecord[], renderElementBinder: RenderElementBinder,
|
||||
allDirectiveMetadatas: RenderDirectiveMetadata[],
|
||||
boundElementIndex: number): void {
|
||||
for (var i = 0; i < renderElementBinder.directives.length; ++i) {
|
||||
var dir = renderElementBinder.directives[i];
|
||||
var directiveMetadata = allDirectiveMetadatas[dir.directiveIndex];
|
||||
var dirRecord = this._getDirectiveRecord(boundElementIndex, i, directiveMetadata);
|
||||
dir.eventBindings.forEach(heb => {
|
||||
res.push(BindingRecord.createForHostEvent(heb.source, heb.fullName, dirRecord));
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
getPropertyBindingRecords(textBindings: ASTWithSource[], elementBinders: RenderElementBinder[],
|
||||
allDirectiveMetadatas: RenderDirectiveMetadata[]): BindingRecord[] {
|
||||
var bindings = [];
|
||||
|
||||
this._createTextNodeRecords(bindings, textBindings);
|
||||
for (var boundElementIndex = 0; boundElementIndex < elementBinders.length;
|
||||
boundElementIndex++) {
|
||||
var renderElementBinder = elementBinders[boundElementIndex];
|
||||
this._createElementPropertyRecords(bindings, boundElementIndex, renderElementBinder);
|
||||
this._createDirectiveRecords(bindings, boundElementIndex, renderElementBinder.directives,
|
||||
allDirectiveMetadatas);
|
||||
}
|
||||
|
||||
return bindings;
|
||||
}
|
||||
|
||||
getDirectiveRecords(elementBinders: RenderElementBinder[],
|
||||
allDirectiveMetadatas: RenderDirectiveMetadata[]): DirectiveRecord[] {
|
||||
var directiveRecords = [];
|
||||
|
||||
for (var elementIndex = 0; elementIndex < elementBinders.length; ++elementIndex) {
|
||||
var dirs = elementBinders[elementIndex].directives;
|
||||
for (var dirIndex = 0; dirIndex < dirs.length; ++dirIndex) {
|
||||
directiveRecords.push(this._getDirectiveRecord(
|
||||
elementIndex, dirIndex, allDirectiveMetadatas[dirs[dirIndex].directiveIndex]));
|
||||
}
|
||||
}
|
||||
|
||||
return directiveRecords;
|
||||
}
|
||||
|
||||
_createTextNodeRecords(bindings: BindingRecord[], textBindings: ASTWithSource[]) {
|
||||
for (var i = 0; i < textBindings.length; i++) {
|
||||
bindings.push(BindingRecord.createForTextNode(textBindings[i], i));
|
||||
}
|
||||
}
|
||||
|
||||
_createElementPropertyRecords(bindings: BindingRecord[], boundElementIndex: number,
|
||||
renderElementBinder: RenderElementBinder) {
|
||||
ListWrapper.forEach(renderElementBinder.propertyBindings, (binding) => {
|
||||
if (binding.type === PropertyBindingType.PROPERTY) {
|
||||
bindings.push(BindingRecord.createForElementProperty(binding.astWithSource,
|
||||
boundElementIndex, binding.property));
|
||||
} else if (binding.type === PropertyBindingType.ATTRIBUTE) {
|
||||
bindings.push(BindingRecord.createForElementAttribute(binding.astWithSource,
|
||||
boundElementIndex, binding.property));
|
||||
} else if (binding.type === PropertyBindingType.CLASS) {
|
||||
bindings.push(BindingRecord.createForElementClass(binding.astWithSource, boundElementIndex,
|
||||
binding.property));
|
||||
} else if (binding.type === PropertyBindingType.STYLE) {
|
||||
bindings.push(BindingRecord.createForElementStyle(binding.astWithSource, boundElementIndex,
|
||||
binding.property, binding.unit));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
_createDirectiveRecords(bindings: BindingRecord[], boundElementIndex: number,
|
||||
directiveBinders: DirectiveBinder[],
|
||||
allDirectiveMetadatas: RenderDirectiveMetadata[]) {
|
||||
for (var i = 0; i < directiveBinders.length; i++) {
|
||||
var directiveBinder = directiveBinders[i];
|
||||
var directiveMetadata = allDirectiveMetadatas[directiveBinder.directiveIndex];
|
||||
var directiveRecord = this._getDirectiveRecord(boundElementIndex, i, directiveMetadata);
|
||||
|
||||
// directive properties
|
||||
MapWrapper.forEach(directiveBinder.propertyBindings, (astWithSource, propertyName) => {
|
||||
// TODO: these setters should eventually be created by change detection, to make
|
||||
// it monomorphic!
|
||||
var setter = reflector.setter(propertyName);
|
||||
bindings.push(
|
||||
BindingRecord.createForDirective(astWithSource, propertyName, setter, directiveRecord));
|
||||
});
|
||||
|
||||
if (directiveRecord.callOnChanges) {
|
||||
bindings.push(BindingRecord.createDirectiveOnChanges(directiveRecord));
|
||||
}
|
||||
if (directiveRecord.callOnInit) {
|
||||
bindings.push(BindingRecord.createDirectiveOnInit(directiveRecord));
|
||||
}
|
||||
if (directiveRecord.callDoCheck) {
|
||||
bindings.push(BindingRecord.createDirectiveDoCheck(directiveRecord));
|
||||
}
|
||||
}
|
||||
|
||||
for (var i = 0; i < directiveBinders.length; i++) {
|
||||
var directiveBinder = directiveBinders[i];
|
||||
// host properties
|
||||
ListWrapper.forEach(directiveBinder.hostPropertyBindings, (binding) => {
|
||||
var dirIndex = new DirectiveIndex(boundElementIndex, i);
|
||||
if (binding.type === PropertyBindingType.PROPERTY) {
|
||||
bindings.push(BindingRecord.createForHostProperty(dirIndex, binding.astWithSource,
|
||||
binding.property));
|
||||
} else if (binding.type === PropertyBindingType.ATTRIBUTE) {
|
||||
bindings.push(BindingRecord.createForHostAttribute(dirIndex, binding.astWithSource,
|
||||
binding.property));
|
||||
} else if (binding.type === PropertyBindingType.CLASS) {
|
||||
bindings.push(
|
||||
BindingRecord.createForHostClass(dirIndex, binding.astWithSource, binding.property));
|
||||
} else if (binding.type === PropertyBindingType.STYLE) {
|
||||
bindings.push(BindingRecord.createForHostStyle(dirIndex, binding.astWithSource,
|
||||
binding.property, binding.unit));
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
_getDirectiveRecord(boundElementIndex: number, directiveIndex: number,
|
||||
directiveMetadata: RenderDirectiveMetadata): DirectiveRecord {
|
||||
var id = boundElementIndex * 100 + directiveIndex;
|
||||
|
||||
if (!this._directiveRecordsMap.has(id)) {
|
||||
this._directiveRecordsMap.set(
|
||||
id, new DirectiveRecord({
|
||||
directiveIndex: new DirectiveIndex(boundElementIndex, directiveIndex),
|
||||
callAfterContentInit: directiveMetadata.callAfterContentInit,
|
||||
callAfterContentChecked: directiveMetadata.callAfterContentChecked,
|
||||
callAfterViewInit: directiveMetadata.callAfterViewInit,
|
||||
callAfterViewChecked: directiveMetadata.callAfterViewChecked,
|
||||
callOnChanges: directiveMetadata.callOnChanges,
|
||||
callDoCheck: directiveMetadata.callDoCheck,
|
||||
callOnInit: directiveMetadata.callOnInit,
|
||||
changeDetection: directiveMetadata.changeDetection
|
||||
}));
|
||||
}
|
||||
|
||||
return this._directiveRecordsMap.get(id);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the data needed to create ChangeDetectors
|
||||
* for the given ProtoView and all nested ProtoViews.
|
||||
*/
|
||||
export function getChangeDetectorDefinitions(
|
||||
hostComponentMetadata: RenderDirectiveMetadata, rootRenderProtoView: ProtoViewDto,
|
||||
allRenderDirectiveMetadata: RenderDirectiveMetadata[], genConfig: ChangeDetectorGenConfig):
|
||||
ChangeDetectorDefinition[] {
|
||||
var nestedPvsWithIndex = _collectNestedProtoViews(rootRenderProtoView);
|
||||
var nestedPvVariableNames = _collectNestedProtoViewsVariableNames(nestedPvsWithIndex);
|
||||
return _getChangeDetectorDefinitions(hostComponentMetadata, nestedPvsWithIndex,
|
||||
nestedPvVariableNames, allRenderDirectiveMetadata,
|
||||
genConfig);
|
||||
}
|
||||
|
||||
function _collectNestedProtoViews(
|
||||
renderProtoView: ProtoViewDto, parentIndex: number = null, boundElementIndex = null,
|
||||
result: RenderProtoViewWithIndex[] = null): RenderProtoViewWithIndex[] {
|
||||
if (isBlank(result)) {
|
||||
result = [];
|
||||
}
|
||||
// reserve the place in the array
|
||||
result.push(
|
||||
new RenderProtoViewWithIndex(renderProtoView, result.length, parentIndex, boundElementIndex));
|
||||
var currentIndex = result.length - 1;
|
||||
var childBoundElementIndex = 0;
|
||||
ListWrapper.forEach(renderProtoView.elementBinders, (elementBinder) => {
|
||||
if (isPresent(elementBinder.nestedProtoView)) {
|
||||
_collectNestedProtoViews(elementBinder.nestedProtoView, currentIndex, childBoundElementIndex,
|
||||
result);
|
||||
}
|
||||
childBoundElementIndex++;
|
||||
});
|
||||
return result;
|
||||
}
|
||||
|
||||
function _getChangeDetectorDefinitions(
|
||||
hostComponentMetadata: RenderDirectiveMetadata, nestedPvsWithIndex: RenderProtoViewWithIndex[],
|
||||
nestedPvVariableNames: string[][], allRenderDirectiveMetadata: RenderDirectiveMetadata[],
|
||||
genConfig: ChangeDetectorGenConfig): ChangeDetectorDefinition[] {
|
||||
return ListWrapper.map(nestedPvsWithIndex, (pvWithIndex) => {
|
||||
var elementBinders = pvWithIndex.renderProtoView.elementBinders;
|
||||
var bindingRecordsCreator = new BindingRecordsCreator();
|
||||
var propBindingRecords = bindingRecordsCreator.getPropertyBindingRecords(
|
||||
pvWithIndex.renderProtoView.textBindings, elementBinders, allRenderDirectiveMetadata);
|
||||
var eventBindingRecords =
|
||||
bindingRecordsCreator.getEventBindingRecords(elementBinders, allRenderDirectiveMetadata);
|
||||
var directiveRecords =
|
||||
bindingRecordsCreator.getDirectiveRecords(elementBinders, allRenderDirectiveMetadata);
|
||||
var strategyName = ChangeDetectionStrategy.Default;
|
||||
if (pvWithIndex.renderProtoView.type === ViewType.COMPONENT) {
|
||||
strategyName = hostComponentMetadata.changeDetection;
|
||||
}
|
||||
var id = _protoViewId(hostComponentMetadata, pvWithIndex);
|
||||
var variableNames = nestedPvVariableNames[pvWithIndex.index];
|
||||
return new ChangeDetectorDefinition(id, strategyName, variableNames, propBindingRecords,
|
||||
eventBindingRecords, directiveRecords, genConfig);
|
||||
});
|
||||
}
|
||||
|
||||
function _protoViewId(hostComponentMetadata: RenderDirectiveMetadata,
|
||||
pvWithIndex: RenderProtoViewWithIndex): string {
|
||||
var typeString;
|
||||
if (pvWithIndex.renderProtoView.type === ViewType.COMPONENT) {
|
||||
typeString = 'comp';
|
||||
} else if (pvWithIndex.renderProtoView.type === ViewType.HOST) {
|
||||
typeString = 'host';
|
||||
} else {
|
||||
typeString = 'embedded';
|
||||
}
|
||||
return `${hostComponentMetadata.id}_${typeString}_${pvWithIndex.index}`;
|
||||
}
|
||||
|
||||
function _collectNestedProtoViewsVariableNames(nestedPvsWithIndex: RenderProtoViewWithIndex[]):
|
||||
string[][] {
|
||||
var nestedPvVariableNames = ListWrapper.createFixedSize(nestedPvsWithIndex.length);
|
||||
ListWrapper.forEach(nestedPvsWithIndex, (pvWithIndex) => {
|
||||
var parentVariableNames =
|
||||
isPresent(pvWithIndex.parentIndex) ? nestedPvVariableNames[pvWithIndex.parentIndex] : null;
|
||||
nestedPvVariableNames[pvWithIndex.index] =
|
||||
_createVariableNames(parentVariableNames, pvWithIndex.renderProtoView);
|
||||
});
|
||||
return nestedPvVariableNames;
|
||||
}
|
||||
|
||||
function _createVariableNames(parentVariableNames: string[], renderProtoView): string[] {
|
||||
var res = isBlank(parentVariableNames) ? <string[]>[] : ListWrapper.clone(parentVariableNames);
|
||||
MapWrapper.forEach(renderProtoView.variableBindings,
|
||||
(mappedName, varName) => { res.push(mappedName); });
|
||||
ListWrapper.forEach(renderProtoView.elementBinders, binder => {
|
||||
MapWrapper.forEach(binder.variableBindings,
|
||||
(mappedName: string, varName: string) => { res.push(mappedName); });
|
||||
});
|
||||
return res;
|
||||
}
|
||||
|
||||
class RenderProtoViewWithIndex {
|
||||
constructor(public renderProtoView: ProtoViewDto, public index: number,
|
||||
public parentIndex: number, public boundElementIndex: number) {}
|
||||
}
|
||||
|
Reference in New Issue
Block a user