Skip to content

Commit 37aed2e

Browse files
authored
eng: replace Event.chain with Event.chain2 (#192202)
Followup from #192026 Removes the original leak-prone implementation of Event.chain and replaces it with `chain2` which only requires disposable of the resulting listener.
1 parent 28b5195 commit 37aed2e

File tree

15 files changed

+96
-175
lines changed

15 files changed

+96
-175
lines changed

src/vs/base/browser/ui/list/listWidget.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -297,7 +297,7 @@ class KeyboardController<T> implements IDisposable {
297297

298298
@memoize
299299
private get onKeyDown(): Event<StandardKeyboardEvent> {
300-
return Event.chain2(
300+
return Event.chain(
301301
this.disposables.add(new DomEmitter(this.view.domNode, 'keydown')).event, $ =>
302302
$.filter(e => !isInputElement(e.target as HTMLElement))
303303
.map(e => new StandardKeyboardEvent(e))
@@ -474,7 +474,7 @@ class TypeNavigationController<T> implements IDisposable {
474474

475475
let typing = false;
476476

477-
const onChar = Event.chain2(this.enabledDisposables.add(new DomEmitter(this.view.domNode, 'keydown')).event, $ =>
477+
const onChar = Event.chain(this.enabledDisposables.add(new DomEmitter(this.view.domNode, 'keydown')).event, $ =>
478478
$.filter(e => !isInputElement(e.target as HTMLElement))
479479
.filter(() => this.mode === TypeNavigationMode.Automatic || this.triggered)
480480
.map(event => new StandardKeyboardEvent(event))
@@ -580,12 +580,12 @@ class DOMFocusController<T> implements IDisposable {
580580
private list: List<T>,
581581
private view: IListView<T>
582582
) {
583-
const onKeyDown = Event.chain2(this.disposables.add(new DomEmitter(view.domNode, 'keydown')).event, $ => $
583+
const onKeyDown = Event.chain(this.disposables.add(new DomEmitter(view.domNode, 'keydown')).event, $ => $
584584
.filter(e => !isInputElement(e.target as HTMLElement))
585585
.map(e => new StandardKeyboardEvent(e))
586586
);
587587

588-
const onTab = Event.chain2(onKeyDown, $ => $.filter(e => e.keyCode === KeyCode.Tab && !e.ctrlKey && !e.metaKey && !e.shiftKey && !e.altKey));
588+
const onTab = Event.chain(onKeyDown, $ => $.filter(e => e.keyCode === KeyCode.Tab && !e.ctrlKey && !e.metaKey && !e.shiftKey && !e.altKey));
589589

590590
onTab(this.onTab, this, this.disposables);
591591
}
@@ -1360,13 +1360,13 @@ export class List<T> implements ISpliceable<T>, IDisposable {
13601360
@memoize get onContextMenu(): Event<IListContextMenuEvent<T>> {
13611361
let didJustPressContextMenuKey = false;
13621362

1363-
const fromKeyDown: Event<any> = Event.chain2(this.disposables.add(new DomEmitter(this.view.domNode, 'keydown')).event, $ =>
1363+
const fromKeyDown: Event<any> = Event.chain(this.disposables.add(new DomEmitter(this.view.domNode, 'keydown')).event, $ =>
13641364
$.map(e => new StandardKeyboardEvent(e))
13651365
.filter(e => didJustPressContextMenuKey = e.keyCode === KeyCode.ContextMenu || (e.shiftKey && e.keyCode === KeyCode.F10))
13661366
.map(e => EventHelper.stop(e, true))
13671367
.filter(() => false));
13681368

1369-
const fromKeyUp = Event.chain2(this.disposables.add(new DomEmitter(this.view.domNode, 'keyup')).event, $ =>
1369+
const fromKeyUp = Event.chain(this.disposables.add(new DomEmitter(this.view.domNode, 'keyup')).event, $ =>
13701370
$.forEach(() => didJustPressContextMenuKey = false)
13711371
.map(e => new StandardKeyboardEvent(e))
13721372
.filter(e => e.keyCode === KeyCode.ContextMenu || (e.shiftKey && e.keyCode === KeyCode.F10))
@@ -1379,7 +1379,7 @@ export class List<T> implements ISpliceable<T>, IDisposable {
13791379
return { index, element, anchor, browserEvent };
13801380
}));
13811381

1382-
const fromMouse = Event.chain2(this.view.onContextMenu, $ =>
1382+
const fromMouse = Event.chain(this.view.onContextMenu, $ =>
13831383
$.filter(_ => !didJustPressContextMenuKey)
13841384
.map(({ element, index, browserEvent }) => ({ element, index, anchor: new StandardMouseEvent(browserEvent), browserEvent }))
13851385
);

src/vs/base/browser/ui/selectBox/selectBoxCustom.ts

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -752,20 +752,21 @@ export class SelectBoxList extends Disposable implements ISelectBoxDelegate, ILi
752752

753753
// SetUp list keyboard controller - control navigation, disabled items, focus
754754
const onKeyDown = this._register(new DomEmitter(this.selectDropDownListContainer, 'keydown'));
755-
const onSelectDropDownKeyDown = Event.chain(onKeyDown.event)
756-
.filter(() => this.selectList.length > 0)
757-
.map(e => new StandardKeyboardEvent(e));
758-
759-
this._register(onSelectDropDownKeyDown.filter(e => e.keyCode === KeyCode.Enter).on(e => this.onEnter(e), this));
760-
this._register(onSelectDropDownKeyDown.filter(e => e.keyCode === KeyCode.Tab).on(e => this.onEnter(e), this)); // Tab should behave the same as enter, #79339
761-
this._register(onSelectDropDownKeyDown.filter(e => e.keyCode === KeyCode.Escape).on(e => this.onEscape(e), this));
762-
this._register(onSelectDropDownKeyDown.filter(e => e.keyCode === KeyCode.UpArrow).on(e => this.onUpArrow(e), this));
763-
this._register(onSelectDropDownKeyDown.filter(e => e.keyCode === KeyCode.DownArrow).on(e => this.onDownArrow(e), this));
764-
this._register(onSelectDropDownKeyDown.filter(e => e.keyCode === KeyCode.PageDown).on(this.onPageDown, this));
765-
this._register(onSelectDropDownKeyDown.filter(e => e.keyCode === KeyCode.PageUp).on(this.onPageUp, this));
766-
this._register(onSelectDropDownKeyDown.filter(e => e.keyCode === KeyCode.Home).on(this.onHome, this));
767-
this._register(onSelectDropDownKeyDown.filter(e => e.keyCode === KeyCode.End).on(this.onEnd, this));
768-
this._register(onSelectDropDownKeyDown.filter(e => (e.keyCode >= KeyCode.Digit0 && e.keyCode <= KeyCode.KeyZ) || (e.keyCode >= KeyCode.Semicolon && e.keyCode <= KeyCode.NumpadDivide)).on(this.onCharacter, this));
755+
const onSelectDropDownKeyDown = Event.chain(onKeyDown.event, $ =>
756+
$.filter(() => this.selectList.length > 0)
757+
.map(e => new StandardKeyboardEvent(e))
758+
);
759+
760+
this._register(Event.chain(onSelectDropDownKeyDown, $ => $.filter(e => e.keyCode === KeyCode.Enter))(this.onEnter, this));
761+
this._register(Event.chain(onSelectDropDownKeyDown, $ => $.filter(e => e.keyCode === KeyCode.Tab))(this.onEnter, this)); // Tab should behave the same as enter, #79339
762+
this._register(Event.chain(onSelectDropDownKeyDown, $ => $.filter(e => e.keyCode === KeyCode.Escape))(this.onEscape, this));
763+
this._register(Event.chain(onSelectDropDownKeyDown, $ => $.filter(e => e.keyCode === KeyCode.UpArrow))(this.onUpArrow, this));
764+
this._register(Event.chain(onSelectDropDownKeyDown, $ => $.filter(e => e.keyCode === KeyCode.DownArrow))(this.onDownArrow, this));
765+
this._register(Event.chain(onSelectDropDownKeyDown, $ => $.filter(e => e.keyCode === KeyCode.PageDown))(this.onPageDown, this));
766+
this._register(Event.chain(onSelectDropDownKeyDown, $ => $.filter(e => e.keyCode === KeyCode.PageUp))(this.onPageUp, this));
767+
this._register(Event.chain(onSelectDropDownKeyDown, $ => $.filter(e => e.keyCode === KeyCode.Home))(this.onHome, this));
768+
this._register(Event.chain(onSelectDropDownKeyDown, $ => $.filter(e => e.keyCode === KeyCode.End))(this.onEnd, this));
769+
this._register(Event.chain(onSelectDropDownKeyDown, $ => $.filter(e => (e.keyCode >= KeyCode.Digit0 && e.keyCode <= KeyCode.KeyZ) || (e.keyCode >= KeyCode.Semicolon && e.keyCode <= KeyCode.NumpadDivide)))(this.onCharacter, this));
769770

770771
// SetUp list mouse controller - control navigation, disabled items, focus
771772
this._register(dom.addDisposableListener(this.selectList.getHTMLElement(), dom.EventType.POINTER_UP, e => this.onPointerUp(e)));

src/vs/base/browser/ui/tree/abstractTree.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -814,7 +814,7 @@ class FindWidget<T, TFilterData> extends Disposable {
814814
this.mode = mode;
815815

816816
const emitter = this._register(new DomEmitter(this.findInput.inputBox.inputElement, 'keydown'));
817-
const onKeyDown = Event.chain2(emitter.event, $ => $.map(e => new StandardKeyboardEvent(e)));
817+
const onKeyDown = Event.chain(emitter.event, $ => $.map(e => new StandardKeyboardEvent(e)));
818818

819819
this._register(onKeyDown((e): any => {
820820
// Using equals() so we reserve modified keys for future use
@@ -884,7 +884,7 @@ class FindWidget<T, TFilterData> extends Disposable {
884884
}));
885885
}));
886886

887-
const onGrabKeyDown = Event.chain2(this._register(new DomEmitter(this.elements.grab, 'keydown')).event, $ => $.map(e => new StandardKeyboardEvent(e)));
887+
const onGrabKeyDown = Event.chain(this._register(new DomEmitter(this.elements.grab, 'keydown')).event, $ => $.map(e => new StandardKeyboardEvent(e)));
888888

889889
this._register(onGrabKeyDown((e): any => {
890890
let right: number | undefined;
@@ -1640,14 +1640,14 @@ export abstract class AbstractTree<T, TFilterData, TRef> implements IDisposable
16401640
onDidChangeActiveNodes.input = activeNodesEmitter.event;
16411641

16421642
if (_options.keyboardSupport !== false) {
1643-
const onKeyDown = Event.chain2(this.view.onKeyDown, $ =>
1643+
const onKeyDown = Event.chain(this.view.onKeyDown, $ =>
16441644
$.filter(e => !isInputElement(e.target as HTMLElement))
16451645
.map(e => new StandardKeyboardEvent(e))
16461646
);
16471647

1648-
Event.chain2(onKeyDown, $ => $.filter(e => e.keyCode === KeyCode.LeftArrow))(this.onLeftArrow, this, this.disposables);
1649-
Event.chain2(onKeyDown, $ => $.filter(e => e.keyCode === KeyCode.RightArrow))(this.onRightArrow, this, this.disposables);
1650-
Event.chain2(onKeyDown, $ => $.filter(e => e.keyCode === KeyCode.Space))(this.onSpace, this, this.disposables);
1648+
Event.chain(onKeyDown, $ => $.filter(e => e.keyCode === KeyCode.LeftArrow))(this.onLeftArrow, this, this.disposables);
1649+
Event.chain(onKeyDown, $ => $.filter(e => e.keyCode === KeyCode.RightArrow))(this.onRightArrow, this, this.disposables);
1650+
Event.chain(onKeyDown, $ => $.filter(e => e.keyCode === KeyCode.Space))(this.onSpace, this, this.disposables);
16511651
}
16521652

16531653
if ((_options.findWidgetEnabled ?? true) && _options.keyboardNavigationLabelProvider && _options.contextViewProvider) {

src/vs/base/common/event.ts

Lines changed: 21 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -437,21 +437,33 @@ export namespace Event {
437437

438438
return emitter.event;
439439
}
440-
441440
/**
442-
* Implements event chaining, in a way that avoids having disposable
443-
* intermediates at each step like {@link chain} does.
441+
* Wraps the event in an {@link IChainableEvent}, allowing a more functional programming style.
442+
*
443+
* @example
444+
* ```
445+
* // Normal
446+
* const onEnterPressNormal = Event.filter(
447+
* Event.map(onKeyPress.event, e => new StandardKeyboardEvent(e)),
448+
* e.keyCode === KeyCode.Enter
449+
* ).event;
450+
*
451+
* // Using chain
452+
* const onEnterPressChain = Event.chain(onKeyPress.event, $ => $
453+
* .map(e => new StandardKeyboardEvent(e))
454+
* .filter(e => e.keyCode === KeyCode.Enter)
455+
* );
456+
* ```
444457
*/
445-
export function chain2<T, R>(event: Event<T>, sythensize: ($: IChainableSythensis<T>) => IChainableSythensis<R>): Event<R> {
458+
export function chain<T, R>(event: Event<T>, sythensize: ($: IChainableSythensis<T>) => IChainableSythensis<R>): Event<R> {
446459
const fn: Event<R> = (listener, thisArgs, disposables) => {
447-
const cs = new ChainableSynthesis();
448-
sythensize(cs);
449-
return event(value => {
460+
const cs = sythensize(new ChainableSynthesis()) as ChainableSynthesis;
461+
return event(function (value) {
450462
const result = cs.evaluate(value);
451463
if (result !== HaltChainable) {
452-
listener(result);
464+
listener.call(thisArgs, result);
453465
}
454-
}, thisArgs, disposables);
466+
}, undefined, disposables);
455467
};
456468

457469
return fn;
@@ -524,100 +536,6 @@ export namespace Event {
524536
latch(equals?: (a: T, b: T) => boolean): IChainableSythensis<T>;
525537
}
526538

527-
export interface IChainableEvent<T> extends IDisposable {
528-
529-
event: Event<T>;
530-
map<O>(fn: (i: T) => O): IChainableEvent<O>;
531-
forEach(fn: (i: T) => void): IChainableEvent<T>;
532-
filter(fn: (e: T) => boolean): IChainableEvent<T>;
533-
filter<R>(fn: (e: T | R) => e is R): IChainableEvent<R>;
534-
reduce<R>(merge: (last: R | undefined, event: T) => R, initial?: R): IChainableEvent<R>;
535-
latch(): IChainableEvent<T>;
536-
debounce(merge: (last: T | undefined, event: T) => T, delay?: number, leading?: boolean, flushOnListenerRemove?: boolean, leakWarningThreshold?: number): IChainableEvent<T>;
537-
debounce<R>(merge: (last: R | undefined, event: T) => R, delay?: number, leading?: boolean, flushOnListenerRemove?: boolean, leakWarningThreshold?: number): IChainableEvent<R>;
538-
on(listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore): IDisposable;
539-
once(listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[]): IDisposable;
540-
}
541-
542-
class ChainableEvent<T> implements IChainableEvent<T> {
543-
544-
private readonly disposables = new DisposableStore();
545-
546-
constructor(readonly event: Event<T>) { }
547-
548-
/** @see {@link Event.map} */
549-
map<O>(fn: (i: T) => O): IChainableEvent<O> {
550-
return new ChainableEvent(map(this.event, fn, this.disposables));
551-
}
552-
553-
/** @see {@link Event.forEach} */
554-
forEach(fn: (i: T) => void): IChainableEvent<T> {
555-
return new ChainableEvent(forEach(this.event, fn, this.disposables));
556-
}
557-
558-
/** @see {@link Event.filter} */
559-
filter(fn: (e: T) => boolean): IChainableEvent<T>;
560-
filter<R>(fn: (e: T | R) => e is R): IChainableEvent<R>;
561-
filter(fn: (e: T) => boolean): IChainableEvent<T> {
562-
return new ChainableEvent(filter(this.event, fn, this.disposables));
563-
}
564-
565-
/** @see {@link Event.reduce} */
566-
reduce<R>(merge: (last: R | undefined, event: T) => R, initial?: R): IChainableEvent<R> {
567-
return new ChainableEvent(reduce(this.event, merge, initial, this.disposables));
568-
}
569-
570-
/** @see {@link Event.reduce} */
571-
latch(): IChainableEvent<T> {
572-
return new ChainableEvent(latch(this.event, undefined, this.disposables));
573-
}
574-
575-
/** @see {@link Event.debounce} */
576-
debounce(merge: (last: T | undefined, event: T) => T, delay?: number, leading?: boolean, flushOnListenerRemove?: boolean, leakWarningThreshold?: number): IChainableEvent<T>;
577-
debounce<R>(merge: (last: R | undefined, event: T) => R, delay?: number, leading?: boolean, flushOnListenerRemove?: boolean, leakWarningThreshold?: number): IChainableEvent<R>;
578-
debounce<R>(merge: (last: R | undefined, event: T) => R, delay: number = 100, leading = false, flushOnListenerRemove = false, leakWarningThreshold?: number): IChainableEvent<R> {
579-
return new ChainableEvent(debounce(this.event, merge, delay, leading, flushOnListenerRemove, leakWarningThreshold, this.disposables));
580-
}
581-
582-
/**
583-
* Attach a listener to the event.
584-
*/
585-
on(listener: (e: T) => any, thisArgs: any, disposables: IDisposable[] | DisposableStore) {
586-
return this.event(listener, thisArgs, disposables);
587-
}
588-
589-
/** @see {@link Event.once} */
590-
once(listener: (e: T) => any, thisArgs: any, disposables: IDisposable[]) {
591-
return once(this.event)(listener, thisArgs, disposables);
592-
}
593-
594-
dispose() {
595-
this.disposables.dispose();
596-
}
597-
}
598-
599-
/**
600-
* Wraps the event in an {@link IChainableEvent}, allowing a more functional programming style.
601-
*
602-
* @example
603-
* ```
604-
* // Normal
605-
* const onEnterPressNormal = Event.filter(
606-
* Event.map(onKeyPress.event, e => new StandardKeyboardEvent(e)),
607-
* e.keyCode === KeyCode.Enter
608-
* ).event;
609-
*
610-
* // Using chain
611-
* const onEnterPressChain = Event.chain(onKeyPress.event)
612-
* .map(e => new StandardKeyboardEvent(e))
613-
* .filter(e => e.keyCode === KeyCode.Enter)
614-
* .event;
615-
* ```
616-
*/
617-
export function chain<T>(event: Event<T>): IChainableEvent<T> {
618-
return new ChainableEvent(event);
619-
}
620-
621539
export interface NodeEventEmitter {
622540
on(event: string | symbol, listener: Function): unknown;
623541
removeListener(event: string | symbol, listener: Function): unknown;

src/vs/base/test/common/event.test.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1527,7 +1527,7 @@ suite('Event utils', () => {
15271527
});
15281528

15291529
test('maps', () => {
1530-
const ev = Event.chain2(em.event, $ => $.map(v => v * 2));
1530+
const ev = Event.chain(em.event, $ => $.map(v => v * 2));
15311531
store.add(ev(v => calls.push(v)));
15321532
em.fire(1);
15331533
em.fire(2);
@@ -1536,7 +1536,7 @@ suite('Event utils', () => {
15361536
});
15371537

15381538
test('filters', () => {
1539-
const ev = Event.chain2(em.event, $ => $.filter(v => v % 2 === 0));
1539+
const ev = Event.chain(em.event, $ => $.filter(v => v % 2 === 0));
15401540
store.add(ev(v => calls.push(v)));
15411541
em.fire(1);
15421542
em.fire(2);
@@ -1546,7 +1546,7 @@ suite('Event utils', () => {
15461546
});
15471547

15481548
test('reduces', () => {
1549-
const ev = Event.chain2(em.event, $ => $.reduce((acc, v) => acc + v, 0));
1549+
const ev = Event.chain(em.event, $ => $.reduce((acc, v) => acc + v, 0));
15501550
store.add(ev(v => calls.push(v)));
15511551
em.fire(1);
15521552
em.fire(2);
@@ -1556,7 +1556,7 @@ suite('Event utils', () => {
15561556
});
15571557

15581558
test('latches', () => {
1559-
const ev = Event.chain2(em.event, $ => $.latch());
1559+
const ev = Event.chain(em.event, $ => $.latch());
15601560
store.add(ev(v => calls.push(v)));
15611561
em.fire(1);
15621562
em.fire(1);
@@ -1569,7 +1569,7 @@ suite('Event utils', () => {
15691569
});
15701570

15711571
test('does everything', () => {
1572-
const ev = Event.chain2(em.event, $ => $
1572+
const ev = Event.chain(em.event, $ => $
15731573
.filter(v => v % 2 === 0)
15741574
.map(v => v * 2)
15751575
.reduce((acc, v) => acc + v, 0)

src/vs/editor/contrib/parameterHints/browser/parameterHintsWidget.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import { escapeRegExpCharacters } from 'vs/base/common/strings';
1414
import { assertIsDefined } from 'vs/base/common/types';
1515
import 'vs/css!./parameterHints';
1616
import { ContentWidgetPositionPreference, ICodeEditor, IContentWidget, IContentWidgetPosition } from 'vs/editor/browser/editorBrowser';
17-
import { ConfigurationChangedEvent, EditorOption } from 'vs/editor/common/config/editorOptions';
17+
import { EditorOption } from 'vs/editor/common/config/editorOptions';
1818
import * as languages from 'vs/editor/common/languages';
1919
import { ILanguageService } from 'vs/editor/common/languages/language';
2020
import { IMarkdownRenderResult, MarkdownRenderer } from 'vs/editor/contrib/markdownRenderer/browser/markdownRenderer';
@@ -130,9 +130,10 @@ export class ParameterHintsWidget extends Disposable implements IContentWidget {
130130

131131
updateFont();
132132

133-
this._register(Event.chain<ConfigurationChangedEvent>(this.editor.onDidChangeConfiguration.bind(this.editor))
134-
.filter(e => e.hasChanged(EditorOption.fontInfo))
135-
.on(updateFont, null));
133+
this._register(Event.chain(
134+
this.editor.onDidChangeConfiguration.bind(this.editor),
135+
$ => $.filter(e => e.hasChanged(EditorOption.fontInfo))
136+
)(updateFont));
136137

137138
this._register(this.editor.onDidLayoutChange(e => this.updateMaxHeight()));
138139
this.updateMaxHeight();

src/vs/platform/opener/browser/link.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -93,10 +93,10 @@ export class Link extends Disposable {
9393

9494
const onClickEmitter = this._register(new DomEmitter(this.el, 'click'));
9595
const onKeyPress = this._register(new DomEmitter(this.el, 'keypress'));
96-
const onEnterPress = Event.chain(onKeyPress.event)
97-
.map(e => new StandardKeyboardEvent(e))
98-
.filter(e => e.keyCode === KeyCode.Enter)
99-
.event;
96+
const onEnterPress = Event.chain(onKeyPress.event, $ =>
97+
$.map(e => new StandardKeyboardEvent(e))
98+
.filter(e => e.keyCode === KeyCode.Enter)
99+
);
100100
const onTap = this._register(new DomEmitter(this.el, TouchEventType.Tap)).event;
101101
this._register(Gesture.addTarget(this.el));
102102
const onOpen = Event.any<EventLike>(onClickEmitter.event, onEnterPress, onTap);

src/vs/platform/quickinput/browser/quickInputUtils.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,11 +67,11 @@ export function renderQuickInputDescription(description: string, container: HTML
6767

6868
const onClick = actionHandler.disposables.add(new DomEmitter(anchor, dom.EventType.CLICK)).event;
6969
const onKeydown = actionHandler.disposables.add(new DomEmitter(anchor, dom.EventType.KEY_DOWN)).event;
70-
const onSpaceOrEnter = actionHandler.disposables.add(Event.chain(onKeydown)).filter(e => {
70+
const onSpaceOrEnter = Event.chain(onKeydown, $ => $.filter(e => {
7171
const event = new StandardKeyboardEvent(e);
7272

7373
return event.equals(KeyCode.Space) || event.equals(KeyCode.Enter);
74-
}).event;
74+
}));
7575

7676
actionHandler.disposables.add(Gesture.addTarget(anchor));
7777
const onTap = actionHandler.disposables.add(new DomEmitter(anchor, GestureEventType.Tap)).event;

src/vs/workbench/browser/parts/notifications/notificationsViewer.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -171,11 +171,11 @@ class NotificationMessageRenderer {
171171
const onClick = actionHandler.toDispose.add(new DomEmitter(anchor, EventType.CLICK)).event;
172172

173173
const onKeydown = actionHandler.toDispose.add(new DomEmitter(anchor, EventType.KEY_DOWN)).event;
174-
const onSpaceOrEnter = actionHandler.toDispose.add(Event.chain(onKeydown)).filter(e => {
174+
const onSpaceOrEnter = Event.chain(onKeydown, $ => $.filter(e => {
175175
const event = new StandardKeyboardEvent(e);
176176

177177
return event.equals(KeyCode.Space) || event.equals(KeyCode.Enter);
178-
}).event;
178+
}));
179179

180180
actionHandler.toDispose.add(Gesture.addTarget(anchor));
181181
const onTap = actionHandler.toDispose.add(new DomEmitter(anchor, GestureEventType.Tap)).event;

0 commit comments

Comments
 (0)