refactor(compiler): generate host listeners in DirectiveWrappers

Part of #11683
This commit is contained in:
Tobias Bosch
2016-10-26 16:58:35 -07:00
committed by vsavkin
parent a664aba2c9
commit 32feb8a532
15 changed files with 628 additions and 316 deletions

View File

@ -285,7 +285,9 @@ export abstract class AppView<T> {
}
}
eventHandler<E, R>(cb: (event?: E) => R): (event?: E) => R { return cb; }
eventHandler<E, R>(cb: (eventName: string, event?: E) => R): (eventName: string, event?: E) => R {
return cb;
}
throwDestroyedError(details: string): void { throw new ViewDestroyedError(details); }
}
@ -368,12 +370,12 @@ export class DebugAppView<T> extends AppView<T> {
}
}
eventHandler<E, R>(cb: (event?: E) => R): (event?: E) => R {
eventHandler<E, R>(cb: (eventName: string, event?: E) => R): (eventName: string, event?: E) => R {
var superHandler = super.eventHandler(cb);
return (event?: any) => {
return (eventName: string, event?: any) => {
this._resetDebug();
try {
return superHandler(event);
return superHandler(eventName, event);
} catch (e) {
this._rethrowWithContext(e);
throw e;

View File

@ -400,14 +400,59 @@ export function selectOrCreateRenderHostElement(
return hostElement;
}
export function subscribeToRenderElement(
renderer: Renderer, element: any, eventNamesAndTargets: InlineArray<string>,
listener: (eventName: string, event: any) => any) {
const disposables = createEmptyInlineArray(eventNamesAndTargets.length / 2);
for (var i = 0; i < eventNamesAndTargets.length; i += 2) {
const eventName = eventNamesAndTargets.get(i);
const eventTarget = eventNamesAndTargets.get(i + 1);
let disposable: Function;
if (eventTarget) {
disposable = renderer.listenGlobal(
eventTarget, eventName, listener.bind(null, `${eventTarget}:${eventName}`));
} else {
disposable = renderer.listen(element, eventName, listener.bind(null, eventName));
}
disposables.set(i / 2, disposable);
}
return disposeInlineArray.bind(null, disposables);
}
function disposeInlineArray(disposables: InlineArray<Function>) {
for (var i = 0; i < disposables.length; i++) {
disposables.get(i)();
}
}
export function noop() {}
export interface InlineArray<T> {
length: number;
get(index: number): T;
set(index: number, value: T): void;
}
function createEmptyInlineArray<T>(length: number): InlineArray<T> {
let ctor: any;
if (length <= 2) {
ctor = InlineArray2;
} else if (length <= 4) {
ctor = InlineArray4;
} else if (length <= 8) {
ctor = InlineArray8;
} else if (length <= 16) {
ctor = InlineArray16;
} else {
ctor = InlineArrayDynamic;
}
return new ctor(length);
}
class InlineArray0 implements InlineArray<any> {
length = 0;
get(index: number): any { return undefined; }
set(index: number, value: any): void {}
}
export class InlineArray2<T> implements InlineArray<T> {
@ -422,6 +467,16 @@ export class InlineArray2<T> implements InlineArray<T> {
return undefined;
}
}
set(index: number, value: T) {
switch (index) {
case 0:
this._v0 = value;
break;
case 1:
this._v1 = value;
break;
}
}
}
export class InlineArray4<T> implements InlineArray<T> {
@ -441,6 +496,22 @@ export class InlineArray4<T> implements InlineArray<T> {
return undefined;
}
}
set(index: number, value: T) {
switch (index) {
case 0:
this._v0 = value;
break;
case 1:
this._v1 = value;
break;
case 2:
this._v2 = value;
break;
case 3:
this._v3 = value;
break;
}
}
}
export class InlineArray8<T> implements InlineArray<T> {
@ -469,6 +540,34 @@ export class InlineArray8<T> implements InlineArray<T> {
return undefined;
}
}
set(index: number, value: T) {
switch (index) {
case 0:
this._v0 = value;
break;
case 1:
this._v1 = value;
break;
case 2:
this._v2 = value;
break;
case 3:
this._v3 = value;
break;
case 4:
this._v4 = value;
break;
case 5:
this._v5 = value;
break;
case 6:
this._v6 = value;
break;
case 7:
this._v7 = value;
break;
}
}
}
export class InlineArray16<T> implements InlineArray<T> {
@ -515,6 +614,58 @@ export class InlineArray16<T> implements InlineArray<T> {
return undefined;
}
}
set(index: number, value: T) {
switch (index) {
case 0:
this._v0 = value;
break;
case 1:
this._v1 = value;
break;
case 2:
this._v2 = value;
break;
case 3:
this._v3 = value;
break;
case 4:
this._v4 = value;
break;
case 5:
this._v5 = value;
break;
case 6:
this._v6 = value;
break;
case 7:
this._v7 = value;
break;
case 8:
this._v8 = value;
break;
case 9:
this._v9 = value;
break;
case 10:
this._v10 = value;
break;
case 11:
this._v11 = value;
break;
case 12:
this._v12 = value;
break;
case 13:
this._v13 = value;
break;
case 14:
this._v14 = value;
break;
case 15:
this._v15 = value;
break;
}
}
}
export class InlineArrayDynamic<T> implements InlineArray<T> {
@ -524,6 +675,7 @@ export class InlineArrayDynamic<T> implements InlineArray<T> {
constructor(public length: number, ...values: any[]) { this._values = values; }
get(index: number) { return this._values[index]; }
set(index: number, value: T) { this._values[index] = value; }
}
export const EMPTY_INLINE_ARRAY: InlineArray<any> = new InlineArray0();