From 88efd3defc238d5a7f4021cd2f3b126e9549bfcf Mon Sep 17 00:00:00 2001 From: isidor Date: Tue, 15 Nov 2016 11:51:19 +0100 Subject: [PATCH] debug: do not massage values in model, each viewer decides on how to present whitespace fixes #14729 --- .../parts/debug/common/debugModel.ts | 10 ++---- .../debug/electron-browser/debugHover.ts | 6 +++- .../debug/electron-browser/debugViewer.ts | 32 +++++++++++++++---- .../debug/electron-browser/replViewer.ts | 10 ++++-- 4 files changed, 41 insertions(+), 17 deletions(-) diff --git a/src/vs/workbench/parts/debug/common/debugModel.ts b/src/vs/workbench/parts/debug/common/debugModel.ts index ef0fbe7218e..0a0275ccd4c 100644 --- a/src/vs/workbench/parts/debug/common/debugModel.ts +++ b/src/vs/workbench/parts/debug/common/debugModel.ts @@ -23,10 +23,6 @@ import { Source } from 'vs/workbench/parts/debug/common/debugSource'; const MAX_REPL_LENGTH = 10000; const UNKNOWN_SOURCE_LABEL = nls.localize('unknownSource', "Unknown Source"); -function massageValue(value: string): string { - return value ? value.replace(/\n/g, '\\n').replace(/\r/g, '\\r').replace(/\t/g, '\\t') : value; -} - export class OutputElement implements debug.ITreeElement { private static ID_COUNTER = 0; @@ -67,7 +63,7 @@ export class KeyValueOutputElement extends OutputElement { } else if (isObject(this.valueObj)) { return 'Object'; } else if (isString(this.valueObj)) { - return `"${massageValue(this.valueObj)}"`; + return this.valueObj; } return String(this.valueObj) || ''; @@ -170,7 +166,7 @@ export abstract class ExpressionContainer implements debug.IExpressionContainer } public set value(value: string) { - this._value = massageValue(value); + this._value = value; this.valueChanged = ExpressionContainer.allValues[this.getId()] && ExpressionContainer.allValues[this.getId()] !== Expression.DEFAULT_VALUE && ExpressionContainer.allValues[this.getId()] !== value; ExpressionContainer.allValues[this.getId()] = value; @@ -248,7 +244,7 @@ export class Variable extends ExpressionContainer implements debug.IExpression { startOfVariables = 0 ) { super(stackFrame, reference, `variable:${parent.getId()}:${name}:${reference}`, namedVariables, indexedVariables, startOfVariables); - this.value = massageValue(value); + this.value = value; } public get evaluateName(): string { diff --git a/src/vs/workbench/parts/debug/electron-browser/debugHover.ts b/src/vs/workbench/parts/debug/electron-browser/debugHover.ts index 97e2bd4d135..7ab16ecf3c4 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugHover.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugHover.ts @@ -224,7 +224,11 @@ export class DebugHoverWidget implements IContentWidget { if (!expression.hasChildren || forceValueHover) { this.complexValueContainer.hidden = true; this.valueContainer.hidden = false; - renderExpressionValue(expression, this.valueContainer, false, MAX_VALUE_RENDER_LENGTH_IN_HOVER); + renderExpressionValue(expression, this.valueContainer, { + showChanged: false, + maxValueLength: MAX_VALUE_RENDER_LENGTH_IN_HOVER, + preserveWhitespace: true + }); this.valueContainer.title = ''; this.editor.layoutContentWidget(this); if (focus) { diff --git a/src/vs/workbench/parts/debug/electron-browser/debugViewer.ts b/src/vs/workbench/parts/debug/electron-browser/debugViewer.ts index 6389ae0503e..704d6d45a7d 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugViewer.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugViewer.ts @@ -37,7 +37,13 @@ const booleanRegex = /^true|false$/i; const stringRegex = /^(['"]).*\1$/; const MAX_VALUE_RENDER_LENGTH_IN_VIEWLET = 1024; -export function renderExpressionValue(expressionOrValue: debug.IExpression | string, container: HTMLElement, showChanged: boolean, maxValueRenderLength?: number): void { +export interface IRenderValueOptions { + preserveWhitespace: boolean; + showChanged: boolean; + maxValueLength?: number; +} + +export function renderExpressionValue(expressionOrValue: debug.IExpression | string, container: HTMLElement, options: IRenderValueOptions): void { let value = typeof expressionOrValue === 'string' ? expressionOrValue : expressionOrValue.value; // remove stale classes @@ -56,15 +62,19 @@ export function renderExpressionValue(expressionOrValue: debug.IExpression | str dom.addClass(container, 'string'); } - if (showChanged && (expressionOrValue).valueChanged && value !== Expression.DEFAULT_VALUE) { + if (options.showChanged && (expressionOrValue).valueChanged && value !== Expression.DEFAULT_VALUE) { // value changed color has priority over other colors. container.className = 'value changed'; } - if (maxValueRenderLength && value.length > maxValueRenderLength) { - value = value.substr(0, maxValueRenderLength) + '...'; + if (options.maxValueLength && value.length > options.maxValueLength) { + value = value.substr(0, options.maxValueLength) + '...'; + } + if (value && !options.preserveWhitespace) { + container.textContent = value.replace(/\n/g, '\\n').replace(/\r/g, '\\r').replace(/\t/g, '\\t'); + } else { + container.textContent = value; } - container.textContent = value; container.title = value; } @@ -76,7 +86,11 @@ export function renderVariable(tree: ITree, variable: Variable, data: IVariableT if (variable.value) { data.name.textContent += ':'; - renderExpressionValue(variable, data.value, showChanged, MAX_VALUE_RENDER_LENGTH_IN_VIEWLET); + renderExpressionValue(variable, data.value, { + showChanged, + maxValueLength: MAX_VALUE_RENDER_LENGTH_IN_VIEWLET, + preserveWhitespace: false + }); data.value.title = variable.value; } else { data.value.textContent = ''; @@ -941,7 +955,11 @@ export class WatchExpressionsRenderer implements IRenderer { data.name.textContent = watchExpression.name; if (watchExpression.value) { data.name.textContent += ':'; - renderExpressionValue(watchExpression, data.value, true, MAX_VALUE_RENDER_LENGTH_IN_VIEWLET); + renderExpressionValue(watchExpression, data.value, { + showChanged: true, + maxValueLength: MAX_VALUE_RENDER_LENGTH_IN_VIEWLET, + preserveWhitespace: false + }); data.name.title = watchExpression.type ? watchExpression.type : watchExpression.value; } } diff --git a/src/vs/workbench/parts/debug/electron-browser/replViewer.ts b/src/vs/workbench/parts/debug/electron-browser/replViewer.ts index 579cabe77a1..04f47148c5f 100644 --- a/src/vs/workbench/parts/debug/electron-browser/replViewer.ts +++ b/src/vs/workbench/parts/debug/electron-browser/replViewer.ts @@ -218,7 +218,10 @@ export class ReplExpressionsRenderer implements IRenderer { private renderInputOutputPair(tree: ITree, expression: debug.IExpression, templateData: IInputOutputPairTemplateData): void { templateData.input.textContent = expression.name; - renderExpressionValue(expression, templateData.value, false); + renderExpressionValue(expression, templateData.value, { + showChanged: false, + preserveWhitespace: true + }); if (expression.hasChildren) { templateData.annotation.className = 'annotation octicon octicon-info'; templateData.annotation.title = nls.localize('stateCapture', "Object state is captured from first evaluation"); @@ -408,7 +411,10 @@ export class ReplExpressionsRenderer implements IRenderer { } // value - renderExpressionValue(output.value, templateData.value, false); + renderExpressionValue(output.value, templateData.value, { + showChanged: false, + preserveWhitespace: true + }); // annotation if any if (output.annotation) { -- GitLab