提交 291ac30e 编写于 作者: I isidor

debug: show changed expressions also in the watch pane

fixes #2308
上级 79a5014d
......@@ -150,7 +150,7 @@ export class DebugHoverWidget implements editorbrowser.IContentWidget {
} else {
this.treeContainer.hidden = true;
this.valueContainer.hidden = false;
viewer.renderExpressionValue(expression, false, this.valueContainer);
viewer.renderExpressionValue(expression, false, this.valueContainer, false);
}
this.showAtPosition = position;
......
......@@ -35,13 +35,13 @@ const $ = dom.emmet;
const booleanRegex = /^true|false$/i;
const stringRegex = /^(['"]).*\1$/;
export function renderExpressionValue(arg2: debug.IExpression|string, debugInactive: boolean, container: HTMLElement): void {
let value = typeof arg2 === 'string' ? arg2 : arg2.value;
export function renderExpressionValue(expressionOrValue: debug.IExpression|string, debugInactive: boolean, container: HTMLElement, showChanged: boolean): void {
let value = typeof expressionOrValue === 'string' ? expressionOrValue : expressionOrValue.value;
// remove stale classes
container.className = 'value';
// when resolving expressions we represent errors from the server as a variable with name === null.
if (value === null || ((arg2 instanceof model.Expression || arg2 instanceof model.Variable) && !arg2.available)) {
if (value === null || ((expressionOrValue instanceof model.Expression || expressionOrValue instanceof model.Variable) && !expressionOrValue.available)) {
dom.addClass(container, 'unavailable');
debugInactive ? dom.removeClass(container, 'error') : dom.addClass(container, 'error');
} else if (!isNaN(+value)) {
......@@ -52,6 +52,10 @@ export function renderExpressionValue(arg2: debug.IExpression|string, debugInact
dom.addClass(container, 'string');
}
if (showChanged && (<any>expressionOrValue).valueChanged) {
// value changed color has priority over other colors.
container.className = 'value changed';
}
container.textContent = value;
container.title = value;
}
......@@ -62,11 +66,7 @@ export function renderVariable(tree: tree.ITree, variable: model.Variable, data:
}
if (variable.value) {
renderExpressionValue(variable, debugInactive, data.value);
if (variable.valueChanged && showChanged) {
// value changed color has priority over other colors.
data.value.className = 'value changed';
}
renderExpressionValue(variable, debugInactive, data.value, showChanged);
} else {
data.value.textContent = '';
data.value.title = '';
......@@ -570,7 +570,7 @@ export class WatchExpressionsRenderer implements tree.IRenderer {
if (templateId === WatchExpressionsRenderer.WATCH_EXPRESSION_TEMPLATE_ID) {
this.renderWatchExpression(tree, element, templateData);
} else {
this.renderExpression(tree, element, templateData);
renderVariable(tree, element, templateData, this.debugService.getState() === debug.State.Inactive, true);
}
}
......@@ -581,13 +581,9 @@ export class WatchExpressionsRenderer implements tree.IRenderer {
}
data.actionBar.context = watchExpression;
this.renderExpression(tree, watchExpression, data);
}
private renderExpression(tree: tree.ITree, expression: debug.IExpression, data: IVariableTemplateData): void {
data.name.textContent = `${expression.name}:`;
if (expression.value) {
renderExpressionValue(expression, this.debugService.getState() === debug.State.Inactive, data.value);
data.name.textContent = `${watchExpression.name}:`;
if (watchExpression.value) {
renderExpressionValue(watchExpression, this.debugService.getState() === debug.State.Inactive, data.value, true);
}
}
......
......@@ -213,7 +213,7 @@ export class ReplExpressionsRenderer implements tree.IRenderer {
private renderInputOutputPair(tree: tree.ITree, expression: debug.IExpression, templateData: IInputOutputPairTemplateData): void {
templateData.input.textContent = expression.name;
debugviewer.renderExpressionValue(expression, this.debugService.getState() === debug.State.Inactive, templateData.value);
debugviewer.renderExpressionValue(expression, this.debugService.getState() === debug.State.Inactive, templateData.value, false);
if (expression.reference > 0) {
templateData.annotation.className = 'annotation octicon octicon-info';
templateData.annotation.title = nls.localize('stateCapture', "Object state is captured from first evaluation");
......@@ -406,7 +406,7 @@ export class ReplExpressionsRenderer implements tree.IRenderer {
}
// value
debugviewer.renderExpressionValue(output.value, false, templateData.value);
debugviewer.renderExpressionValue(output.value, false, templateData.value, false);
// annotation if any
if (output.annotation) {
......
......@@ -40,6 +40,7 @@ export interface IExpressionContainer extends ITreeElement {
export interface IExpression extends ITreeElement, IExpressionContainer {
name: string;
value: string;
valueChanged: boolean;
}
export interface IThread extends ITreeElement {
......
......@@ -145,11 +145,14 @@ export class KeyValueOutputElement extends OutputElement {
}
}
// TODO@Isidor move common code for expression and variable into a super class
export class Expression implements debug.IExpression {
static DEFAULT_VALUE = 'not available';
public static allValues: { [id: string]: string } = {};
public reference: number;
public available: boolean;
public valueChanged: boolean;
private _value: string;
private children: TPromise<debug.IExpression[]>;
......@@ -166,6 +169,8 @@ export class Expression implements debug.IExpression {
public set value(value: string) {
this._value = massageValue(value);
this.valueChanged = Expression.allValues[this.getId()] && Expression.allValues[this.getId()] !== value;
Expression.allValues[this.getId()] = value;
}
public getId(): string {
......@@ -341,6 +346,7 @@ export class Model extends ee.EventEmitter implements debug.IModel {
if (removeThreads) {
this.threads = {};
Variable.allValues = {};
Expression.allValues = {};
} else {
for (let ref in this.threads) {
if (this.threads.hasOwnProperty(ref)) {
......@@ -612,7 +618,7 @@ export class Model extends ee.EventEmitter implements debug.IModel {
if (!rsf) {
return new StackFrame(data.threadId, 0, new Source({ name: 'unknown' }), nls.localize('unknownStack', "Unknown stack location"), undefined, undefined);
}
return new StackFrame(data.threadId, rsf.id, rsf.source ? new Source(rsf.source) : new Source({ name: 'unknown' }), rsf.name, rsf.line, rsf.column);
});
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册