提交 88efd3de 编写于 作者: I isidor

debug: do not massage values in model, each viewer decides on how to present whitespace

fixes #14729
上级 29f1beec
......@@ -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 {
......
......@@ -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) {
......
......@@ -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 && (<any>expressionOrValue).valueChanged && value !== Expression.DEFAULT_VALUE) {
if (options.showChanged && (<any>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;
}
}
......
......@@ -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) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册