提交 b3721667 编写于 作者: I isidor

debug: different max value render lengths for repl / hover / viewlet

fixes #5823
上级 ef9ebb52
...@@ -27,6 +27,7 @@ const debugTreeOptions = { ...@@ -27,6 +27,7 @@ const debugTreeOptions = {
ariaLabel: nls.localize('treeAriaLabel', "Debug Hover") ariaLabel: nls.localize('treeAriaLabel', "Debug Hover")
}; };
const MAX_ELEMENTS_SHOWN = 18; const MAX_ELEMENTS_SHOWN = 18;
const MAX_VALUE_RENDER_LENGTH_IN_HOVER = 4096;
export class DebugHoverWidget implements editorbrowser.IContentWidget { export class DebugHoverWidget implements editorbrowser.IContentWidget {
...@@ -182,7 +183,7 @@ export class DebugHoverWidget implements editorbrowser.IContentWidget { ...@@ -182,7 +183,7 @@ export class DebugHoverWidget implements editorbrowser.IContentWidget {
if (expression.reference === 0 || forceValueHover) { if (expression.reference === 0 || forceValueHover) {
this.treeContainer.hidden = true; this.treeContainer.hidden = true;
this.valueContainer.hidden = false; this.valueContainer.hidden = false;
viewer.renderExpressionValue(expression, this.valueContainer, false); viewer.renderExpressionValue(expression, this.valueContainer, false, MAX_VALUE_RENDER_LENGTH_IN_HOVER);
this.valueContainer.title = ''; this.valueContainer.title = '';
this.editor.layoutContentWidget(this); this.editor.layoutContentWidget(this);
if (focus) { if (focus) {
......
...@@ -35,9 +35,9 @@ import {IKeyboardEvent} from 'vs/base/browser/keyboardEvent'; ...@@ -35,9 +35,9 @@ import {IKeyboardEvent} from 'vs/base/browser/keyboardEvent';
const $ = dom.emmet; const $ = dom.emmet;
const booleanRegex = /^true|false$/i; const booleanRegex = /^true|false$/i;
const stringRegex = /^(['"]).*\1$/; const stringRegex = /^(['"]).*\1$/;
const MAX_VALUE_RENDER_LENGTH = 5000; const MAX_VALUE_RENDER_LENGTH_IN_VIEWLET = 1024;
export function renderExpressionValue(expressionOrValue: debug.IExpression|string, container: HTMLElement, showChanged: boolean): void { export function renderExpressionValue(expressionOrValue: debug.IExpression | string, container: HTMLElement, showChanged: boolean, maxValueRenderLength?: number): void {
let value = typeof expressionOrValue === 'string' ? expressionOrValue : expressionOrValue.value; let value = typeof expressionOrValue === 'string' ? expressionOrValue : expressionOrValue.value;
// remove stale classes // remove stale classes
...@@ -61,8 +61,8 @@ export function renderExpressionValue(expressionOrValue: debug.IExpression|strin ...@@ -61,8 +61,8 @@ export function renderExpressionValue(expressionOrValue: debug.IExpression|strin
container.className = 'value changed'; container.className = 'value changed';
} }
if (value.length > MAX_VALUE_RENDER_LENGTH) { if (maxValueRenderLength && value.length > maxValueRenderLength) {
value = value.substr(0, MAX_VALUE_RENDER_LENGTH) + '...'; value = value.substr(0, maxValueRenderLength) + '...';
} }
container.textContent = value; container.textContent = value;
container.title = value; container.title = value;
...@@ -74,7 +74,7 @@ export function renderVariable(tree: tree.ITree, variable: model.Variable, data: ...@@ -74,7 +74,7 @@ export function renderVariable(tree: tree.ITree, variable: model.Variable, data:
} }
if (variable.value) { if (variable.value) {
renderExpressionValue(variable, data.value, showChanged); renderExpressionValue(variable, data.value, showChanged, MAX_VALUE_RENDER_LENGTH_IN_VIEWLET);
data.expression.title = variable.value; data.expression.title = variable.value;
} else { } else {
data.value.textContent = ''; data.value.textContent = '';
...@@ -195,7 +195,7 @@ export class BaseDebugController extends treedefaults.DefaultController { ...@@ -195,7 +195,7 @@ export class BaseDebugController extends treedefaults.DefaultController {
export class CallStackActionProvider implements renderer.IActionProvider { export class CallStackActionProvider implements renderer.IActionProvider {
constructor(@IInstantiationService private instantiationService: IInstantiationService) { constructor( @IInstantiationService private instantiationService: IInstantiationService) {
// noop // noop
} }
...@@ -233,7 +233,7 @@ export class CallStackActionProvider implements renderer.IActionProvider { ...@@ -233,7 +233,7 @@ export class CallStackActionProvider implements renderer.IActionProvider {
export class CallStackDataSource implements tree.IDataSource { export class CallStackDataSource implements tree.IDataSource {
constructor(@debug.IDebugService private debugService: debug.IDebugService) { constructor( @debug.IDebugService private debugService: debug.IDebugService) {
// noop // noop
} }
...@@ -286,10 +286,10 @@ interface ILoadMoreTemplateData { ...@@ -286,10 +286,10 @@ interface ILoadMoreTemplateData {
interface IStackFrameTemplateData { interface IStackFrameTemplateData {
stackFrame: HTMLElement; stackFrame: HTMLElement;
label : HTMLElement; label: HTMLElement;
file : HTMLElement; file: HTMLElement;
fileName : HTMLElement; fileName: HTMLElement;
lineNumber : HTMLElement; lineNumber: HTMLElement;
} }
export class CallStackRenderer implements tree.IRenderer { export class CallStackRenderer implements tree.IRenderer {
...@@ -298,11 +298,11 @@ export class CallStackRenderer implements tree.IRenderer { ...@@ -298,11 +298,11 @@ export class CallStackRenderer implements tree.IRenderer {
private static STACK_FRAME_TEMPLATE_ID = 'stackFrame'; private static STACK_FRAME_TEMPLATE_ID = 'stackFrame';
private static LOAD_MORE_TEMPLATE_ID = 'loadMore'; private static LOAD_MORE_TEMPLATE_ID = 'loadMore';
constructor(@IWorkspaceContextService private contextService: IWorkspaceContextService) { constructor( @IWorkspaceContextService private contextService: IWorkspaceContextService) {
// noop // noop
} }
public getHeight(tree:tree.ITree, element:any): number { public getHeight(tree: tree.ITree, element: any): number {
return 22; return 22;
} }
...@@ -371,7 +371,7 @@ export class CallStackRenderer implements tree.IRenderer { ...@@ -371,7 +371,7 @@ export class CallStackRenderer implements tree.IRenderer {
data.label.title = stackFrame.name; data.label.title = stackFrame.name;
data.fileName.textContent = getSourceName(stackFrame.source, this.contextService); data.fileName.textContent = getSourceName(stackFrame.source, this.contextService);
if (stackFrame.source.available && stackFrame.lineNumber !== undefined) { if (stackFrame.source.available && stackFrame.lineNumber !== undefined) {
data.lineNumber.textContent = `${ stackFrame.lineNumber }`; data.lineNumber.textContent = `${stackFrame.lineNumber}`;
dom.removeClass(data.lineNumber, 'unavailable'); dom.removeClass(data.lineNumber, 'unavailable');
} else { } else {
dom.addClass(data.lineNumber, 'unavailable'); dom.addClass(data.lineNumber, 'unavailable');
...@@ -385,7 +385,7 @@ export class CallStackRenderer implements tree.IRenderer { ...@@ -385,7 +385,7 @@ export class CallStackRenderer implements tree.IRenderer {
export class CallstackAccessibilityProvider implements tree.IAccessibilityProvider { export class CallstackAccessibilityProvider implements tree.IAccessibilityProvider {
constructor(@IWorkspaceContextService private contextService: IWorkspaceContextService) { constructor( @IWorkspaceContextService private contextService: IWorkspaceContextService) {
// noop // noop
} }
...@@ -423,7 +423,7 @@ export class VariablesActionProvider implements renderer.IActionProvider { ...@@ -423,7 +423,7 @@ export class VariablesActionProvider implements renderer.IActionProvider {
public getSecondaryActions(tree: tree.ITree, element: any): TPromise<actions.IAction[]> { public getSecondaryActions(tree: tree.ITree, element: any): TPromise<actions.IAction[]> {
let actions: actions.Action[] = []; let actions: actions.Action[] = [];
const variable = <model.Variable> element; const variable = <model.Variable>element;
actions.push(this.instantiationService.createInstance(debugactions.AddToWatchExpressionsAction, debugactions.AddToWatchExpressionsAction.ID, debugactions.AddToWatchExpressionsAction.LABEL, variable)); actions.push(this.instantiationService.createInstance(debugactions.AddToWatchExpressionsAction, debugactions.AddToWatchExpressionsAction.ID, debugactions.AddToWatchExpressionsAction.LABEL, variable));
if (variable.reference === 0) { if (variable.reference === 0) {
actions.push(this.instantiationService.createInstance(debugactions.CopyValueAction, debugactions.CopyValueAction.ID, debugactions.CopyValueAction.LABEL, variable)); actions.push(this.instantiationService.createInstance(debugactions.CopyValueAction, debugactions.CopyValueAction.ID, debugactions.CopyValueAction.LABEL, variable));
...@@ -452,17 +452,17 @@ export class VariablesDataSource implements tree.IDataSource { ...@@ -452,17 +452,17 @@ export class VariablesDataSource implements tree.IDataSource {
return true; return true;
} }
let variable = <model.Variable> element; let variable = <model.Variable>element;
return variable.reference !== 0 && !strings.equalsIgnoreCase(variable.value, 'null'); return variable.reference !== 0 && !strings.equalsIgnoreCase(variable.value, 'null');
} }
public getChildren(tree: tree.ITree, element: any): TPromise<any> { public getChildren(tree: tree.ITree, element: any): TPromise<any> {
if (element instanceof viewmodel.ViewModel) { if (element instanceof viewmodel.ViewModel) {
let focusedStackFrame = (<viewmodel.ViewModel> element).getFocusedStackFrame(); let focusedStackFrame = (<viewmodel.ViewModel>element).getFocusedStackFrame();
return focusedStackFrame ? focusedStackFrame.getScopes(this.debugService) : TPromise.as([]); return focusedStackFrame ? focusedStackFrame.getScopes(this.debugService) : TPromise.as([]);
} }
let scope = <model.Scope> element; let scope = <model.Scope>element;
return scope.getChildren(this.debugService); return scope.getChildren(this.debugService);
} }
...@@ -577,7 +577,7 @@ export class WatchExpressionsActionProvider implements renderer.IActionProvider ...@@ -577,7 +577,7 @@ export class WatchExpressionsActionProvider implements renderer.IActionProvider
public getSecondaryActions(tree: tree.ITree, element: any): TPromise<actions.IAction[]> { public getSecondaryActions(tree: tree.ITree, element: any): TPromise<actions.IAction[]> {
const actions: actions.Action[] = []; const actions: actions.Action[] = [];
if (element instanceof model.Expression) { if (element instanceof model.Expression) {
const expression = <model.Expression> element; const expression = <model.Expression>element;
actions.push(this.instantiationService.createInstance(debugactions.AddWatchExpressionAction, debugactions.AddWatchExpressionAction.ID, debugactions.AddWatchExpressionAction.LABEL)); actions.push(this.instantiationService.createInstance(debugactions.AddWatchExpressionAction, debugactions.AddWatchExpressionAction.ID, debugactions.AddWatchExpressionAction.LABEL));
actions.push(this.instantiationService.createInstance(debugactions.RenameWatchExpressionAction, debugactions.RenameWatchExpressionAction.ID, debugactions.RenameWatchExpressionAction.LABEL, expression)); actions.push(this.instantiationService.createInstance(debugactions.RenameWatchExpressionAction, debugactions.RenameWatchExpressionAction.ID, debugactions.RenameWatchExpressionAction.LABEL, expression));
if (expression.reference === 0) { if (expression.reference === 0) {
...@@ -590,7 +590,7 @@ export class WatchExpressionsActionProvider implements renderer.IActionProvider ...@@ -590,7 +590,7 @@ export class WatchExpressionsActionProvider implements renderer.IActionProvider
} else { } else {
actions.push(this.instantiationService.createInstance(debugactions.AddWatchExpressionAction, debugactions.AddWatchExpressionAction.ID, debugactions.AddWatchExpressionAction.LABEL)); actions.push(this.instantiationService.createInstance(debugactions.AddWatchExpressionAction, debugactions.AddWatchExpressionAction.ID, debugactions.AddWatchExpressionAction.LABEL));
if (element instanceof model.Variable) { if (element instanceof model.Variable) {
const variable = <model.Variable> element; const variable = <model.Variable>element;
if (variable.reference === 0) { if (variable.reference === 0) {
actions.push(this.instantiationService.createInstance(debugactions.CopyValueAction, debugactions.CopyValueAction.ID, debugactions.CopyValueAction.LABEL, variable.value)); actions.push(this.instantiationService.createInstance(debugactions.CopyValueAction, debugactions.CopyValueAction.ID, debugactions.CopyValueAction.LABEL, variable.value));
} }
...@@ -622,16 +622,16 @@ export class WatchExpressionsDataSource implements tree.IDataSource { ...@@ -622,16 +622,16 @@ export class WatchExpressionsDataSource implements tree.IDataSource {
return true; return true;
} }
const watchExpression = <model.Expression> element; const watchExpression = <model.Expression>element;
return watchExpression.reference !== 0 && !strings.equalsIgnoreCase(watchExpression.value, 'null'); return watchExpression.reference !== 0 && !strings.equalsIgnoreCase(watchExpression.value, 'null');
} }
public getChildren(tree: tree.ITree, element: any): TPromise<any> { public getChildren(tree: tree.ITree, element: any): TPromise<any> {
if (element instanceof model.Model) { if (element instanceof model.Model) {
return TPromise.as((<model.Model> element).getWatchExpressions()); return TPromise.as((<model.Model>element).getWatchExpressions());
} }
let expression = <model.Expression> element; let expression = <model.Expression>element;
return expression.getChildren(this.debugService); return expression.getChildren(this.debugService);
} }
...@@ -657,10 +657,10 @@ export class WatchExpressionsRenderer implements tree.IRenderer { ...@@ -657,10 +657,10 @@ export class WatchExpressionsRenderer implements tree.IRenderer {
@IContextViewService private contextViewService: IContextViewService @IContextViewService private contextViewService: IContextViewService
) { ) {
this.toDispose = []; this.toDispose = [];
this.actionProvider = <WatchExpressionsActionProvider> actionProvider; this.actionProvider = <WatchExpressionsActionProvider>actionProvider;
} }
public getHeight(tree:tree.ITree, element:any): number { public getHeight(tree: tree.ITree, element: any): number {
return 22; return 22;
} }
...@@ -676,7 +676,7 @@ export class WatchExpressionsRenderer implements tree.IRenderer { ...@@ -676,7 +676,7 @@ export class WatchExpressionsRenderer implements tree.IRenderer {
let data: IWatchExpressionTemplateData = Object.create(null); let data: IWatchExpressionTemplateData = Object.create(null);
if (templateId === WatchExpressionsRenderer.WATCH_EXPRESSION_TEMPLATE_ID) { if (templateId === WatchExpressionsRenderer.WATCH_EXPRESSION_TEMPLATE_ID) {
data.actionBar = new actionbar.ActionBar(container, { actionRunner: this.actionRunner }); data.actionBar = new actionbar.ActionBar(container, { actionRunner: this.actionRunner });
data.actionBar.push(this.actionProvider.getExpressionActions() , { icon: true, label: false }); data.actionBar.push(this.actionProvider.getExpressionActions(), { icon: true, label: false });
} }
data.expression = dom.append(container, $(isMacintosh ? '.expression.mac' : '.expression.win-linux')); data.expression = dom.append(container, $(isMacintosh ? '.expression.mac' : '.expression.win-linux'));
...@@ -703,7 +703,7 @@ export class WatchExpressionsRenderer implements tree.IRenderer { ...@@ -703,7 +703,7 @@ export class WatchExpressionsRenderer implements tree.IRenderer {
data.name.textContent = `${watchExpression.name}:`; data.name.textContent = `${watchExpression.name}:`;
if (watchExpression.value) { if (watchExpression.value) {
renderExpressionValue(watchExpression, data.value, true); renderExpressionValue(watchExpression, data.value, true, MAX_VALUE_RENDER_LENGTH_IN_VIEWLET);
data.expression.title = watchExpression.value; data.expression.title = watchExpression.value;
} }
} }
...@@ -748,7 +748,7 @@ export class WatchExpressionsController extends BaseDebugController { ...@@ -748,7 +748,7 @@ export class WatchExpressionsController extends BaseDebugController {
protected onLeftClick(tree: tree.ITree, element: any, event: mouse.IMouseEvent): boolean { protected onLeftClick(tree: tree.ITree, element: any, event: mouse.IMouseEvent): boolean {
// double click on primitive value: open input box to be able to select and copy value. // double click on primitive value: open input box to be able to select and copy value.
if (element instanceof model.Expression && event.detail === 2) { if (element instanceof model.Expression && event.detail === 2) {
const expression = <debug.IExpression> element; const expression = <debug.IExpression>element;
if (expression.reference === 0) { if (expression.reference === 0) {
this.debugService.getViewModel().setSelectedExpression(expression); this.debugService.getViewModel().setSelectedExpression(expression);
} }
...@@ -761,7 +761,7 @@ export class WatchExpressionsController extends BaseDebugController { ...@@ -761,7 +761,7 @@ export class WatchExpressionsController extends BaseDebugController {
protected onRename(tree: tree.ITree, event: KeyboardEvent): boolean { protected onRename(tree: tree.ITree, event: KeyboardEvent): boolean {
const element = tree.getFocus(); const element = tree.getFocus();
if (element instanceof model.Expression) { if (element instanceof model.Expression) {
const watchExpression = <model.Expression> element; const watchExpression = <model.Expression>element;
if (watchExpression.reference === 0) { if (watchExpression.reference === 0) {
this.debugService.getViewModel().setSelectedExpression(watchExpression); this.debugService.getViewModel().setSelectedExpression(watchExpression);
} }
...@@ -774,7 +774,7 @@ export class WatchExpressionsController extends BaseDebugController { ...@@ -774,7 +774,7 @@ export class WatchExpressionsController extends BaseDebugController {
protected onDelete(tree: tree.ITree, event: IKeyboardEvent): boolean { protected onDelete(tree: tree.ITree, event: IKeyboardEvent): boolean {
const element = tree.getFocus(); const element = tree.getFocus();
if (element instanceof model.Expression) { if (element instanceof model.Expression) {
const we = <model.Expression> element; const we = <model.Expression>element;
this.debugService.removeWatchExpressions(we.getId()); this.debugService.removeWatchExpressions(we.getId());
return true; return true;
...@@ -856,8 +856,8 @@ export class BreakpointsDataSource implements tree.IDataSource { ...@@ -856,8 +856,8 @@ export class BreakpointsDataSource implements tree.IDataSource {
} }
public getChildren(tree: tree.ITree, element: any): TPromise<any> { public getChildren(tree: tree.ITree, element: any): TPromise<any> {
const model = <model.Model> element; const model = <model.Model>element;
const exBreakpoints = <debug.IEnablement[]> model.getExceptionBreakpoints(); const exBreakpoints = <debug.IEnablement[]>model.getExceptionBreakpoints();
return TPromise.as(exBreakpoints.concat(model.getFunctionBreakpoints()).concat(model.getBreakpoints())); return TPromise.as(exBreakpoints.concat(model.getFunctionBreakpoints()).concat(model.getBreakpoints()));
} }
...@@ -901,7 +901,7 @@ export class BreakpointsRenderer implements tree.IRenderer { ...@@ -901,7 +901,7 @@ export class BreakpointsRenderer implements tree.IRenderer {
// noop // noop
} }
public getHeight(tree:tree.ITree, element:any): number { public getHeight(tree: tree.ITree, element: any): number {
return 22; return 22;
} }
...@@ -929,7 +929,7 @@ export class BreakpointsRenderer implements tree.IRenderer { ...@@ -929,7 +929,7 @@ export class BreakpointsRenderer implements tree.IRenderer {
data.breakpoint = dom.append(container, $('.breakpoint')); data.breakpoint = dom.append(container, $('.breakpoint'));
data.toDisposeBeforeRender = []; data.toDisposeBeforeRender = [];
data.checkbox = <HTMLInputElement> $('input'); data.checkbox = <HTMLInputElement>$('input');
data.checkbox.type = 'checkbox'; data.checkbox.type = 'checkbox';
if (!isMacintosh) { if (!isMacintosh) {
data.checkbox.className = 'checkbox-win-linux'; data.checkbox.className = 'checkbox-win-linux';
...@@ -963,7 +963,7 @@ export class BreakpointsRenderer implements tree.IRenderer { ...@@ -963,7 +963,7 @@ export class BreakpointsRenderer implements tree.IRenderer {
} }
private renderExceptionBreakpoint(exceptionBreakpoint: debug.IExceptionBreakpoint, data: IExceptionBreakpointTemplateData): void { private renderExceptionBreakpoint(exceptionBreakpoint: debug.IExceptionBreakpoint, data: IExceptionBreakpointTemplateData): void {
data.name.textContent = exceptionBreakpoint.label || `${ exceptionBreakpoint.filter } exceptions`;; data.name.textContent = exceptionBreakpoint.label || `${exceptionBreakpoint.filter} exceptions`;;
data.checkbox.checked = exceptionBreakpoint.enabled; data.checkbox.checked = exceptionBreakpoint.enabled;
} }
...@@ -1008,7 +1008,7 @@ export class BreakpointsRenderer implements tree.IRenderer { ...@@ -1008,7 +1008,7 @@ export class BreakpointsRenderer implements tree.IRenderer {
export class BreakpointsAccessibilityProvider implements tree.IAccessibilityProvider { export class BreakpointsAccessibilityProvider implements tree.IAccessibilityProvider {
constructor(@IWorkspaceContextService private contextService: IWorkspaceContextService) { constructor( @IWorkspaceContextService private contextService: IWorkspaceContextService) {
// noop // noop
} }
...@@ -1029,7 +1029,7 @@ export class BreakpointsAccessibilityProvider implements tree.IAccessibilityProv ...@@ -1029,7 +1029,7 @@ export class BreakpointsAccessibilityProvider implements tree.IAccessibilityProv
export class BreakpointsController extends BaseDebugController { export class BreakpointsController extends BaseDebugController {
protected onLeftClick(tree:tree.ITree, element: any, event: mouse.IMouseEvent): boolean { protected onLeftClick(tree: tree.ITree, element: any, event: mouse.IMouseEvent): boolean {
if (element instanceof model.FunctionBreakpoint && event.detail === 2) { if (element instanceof model.FunctionBreakpoint && event.detail === 2) {
this.debugService.getViewModel().setSelectedFunctionBreakpoint(element); this.debugService.getViewModel().setSelectedFunctionBreakpoint(element);
return true; return true;
...@@ -1050,10 +1050,10 @@ export class BreakpointsController extends BaseDebugController { ...@@ -1050,10 +1050,10 @@ export class BreakpointsController extends BaseDebugController {
protected onDelete(tree: tree.ITree, event: IKeyboardEvent): boolean { protected onDelete(tree: tree.ITree, event: IKeyboardEvent): boolean {
const element = tree.getFocus(); const element = tree.getFocus();
if (element instanceof model.Breakpoint) { if (element instanceof model.Breakpoint) {
this.debugService.removeBreakpoints((<model.Breakpoint> element).getId()).done(null, errors.onUnexpectedError); this.debugService.removeBreakpoints((<model.Breakpoint>element).getId()).done(null, errors.onUnexpectedError);
return true; return true;
} else if (element instanceof model.FunctionBreakpoint) { } else if (element instanceof model.FunctionBreakpoint) {
const fbp = <model.FunctionBreakpoint> element; const fbp = <model.FunctionBreakpoint>element;
this.debugService.removeFunctionBreakpoints(fbp.getId()).done(null, errors.onUnexpectedError); this.debugService.removeFunctionBreakpoints(fbp.getId()).done(null, errors.onUnexpectedError);
return true; return true;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册