From e1ec7b1430bb240bb5f051481f4b8df174879b13 Mon Sep 17 00:00:00 2001 From: Manuel Alabor Date: Mon, 24 May 2021 12:22:40 +0200 Subject: [PATCH] Preserve Multiple Events at End of Life Work towards a solution for #56 --- .../decoration/liveLogDecorationProvider.ts | 47 ++++++++++++++----- 1 file changed, 35 insertions(+), 12 deletions(-) diff --git a/src/ui/decoration/liveLogDecorationProvider.ts b/src/ui/decoration/liveLogDecorationProvider.ts index e7d39912..fcaa57b7 100644 --- a/src/ui/decoration/liveLogDecorationProvider.ts +++ b/src/ui/decoration/liveLogDecorationProvider.ts @@ -13,7 +13,7 @@ type Line = number; type Character = number; export default class LiveLogDecorationProvider extends DocumentDecorationProvider { - private readonly lastLogForLine: Map> = new Map(); + private readonly lastLogForLine: Map>> = new Map(); private readonly onDidChangeActiveSessionDisposable: IDisposable; private readonly onDidTerminateSessionDisposable: IDisposable; @@ -35,6 +35,8 @@ export default class LiveLogDecorationProvider extends DocumentDecorationProvide }; private onDidTerminateSession = (): void => { + this.lastLogForLine.clear(); + const hideLiveLog: boolean = workspace.getConfiguration().get(Configuration.HideLiveLogWhenStoppingDebugger, true); if (hideLiveLog) { this.setDecorations([]); @@ -48,9 +50,18 @@ export default class LiveLogDecorationProvider extends DocumentDecorationProvide const line = this.lastLogForLine.get(event.source.line); if (line) { - line.set(event.source.character, event); + if (shouldMemoizePreviousEvent(event)) { + const prevEvents = line.get(event.source.character); + if (prevEvents) { + line.set(event.source.character, [...prevEvents, event]); + } else { + line.set(event.source.character, [event]); + } + } else { + line.set(event.source.character, [event]); + } } else { - this.lastLogForLine.set(event.source.line, new Map([[event.source.character, event]])); + this.lastLogForLine.set(event.source.line, new Map([[event.source.character, [event]]])); } this.updateDecorations(); @@ -67,16 +78,20 @@ export default class LiveLogDecorationProvider extends DocumentDecorationProvide const decorationOptions = [...this.lastLogForLine.entries()].map(([line, characters]) => { const contentText = [...characters.entries()] .sort(([a], [b]) => a - b) - .map(([, event]) => - Telemetry.match({ - Completed: () => 'Completed', - Error: () => 'Error', - Next: ({ data: { value } }) => `Next: ${value}`, - Subscribe: () => 'Subscribe', - Unsubscribe: () => 'Unsubscribe', - })(event) + .map(([, events]) => + events + .map((event) => + Telemetry.match({ + Completed: () => 'Completed', + Error: () => 'Error', + Next: ({ data: { value } }) => `Next: ${value}`, + Subscribe: () => 'Subscribe', + Unsubscribe: () => 'Unsubscribe', + })(event) + ) + .join(', ') ) - .join(', '); + .join(' - '); return { renderOptions: { after: { contentText } }, @@ -104,3 +119,11 @@ const liveLogDecorationType = window.createTextEditorDecorationType({ }, rangeBehavior: DecorationRangeBehavior.ClosedClosed, }); + +const shouldMemoizePreviousEvent = Telemetry.match({ + Completed: () => true, + Error: () => true, + Next: () => false, + Subscribe: () => false, + Unsubscribe: () => true, +});