提交 0e3e5bd8 编写于 作者: I isidor

debug: add hit condition to breakpoint model

上级 512ce315
...@@ -200,11 +200,12 @@ export class DebugEditorModelManager implements IWorkbenchContribution { ...@@ -200,11 +200,12 @@ export class DebugEditorModelManager implements IWorkbenchContribution {
const data: IRawBreakpoint[] = []; const data: IRawBreakpoint[] = [];
const enabledAndConditions: { [key: number]: { enabled: boolean, condition: string } } = {}; const lineToBreakpointDataMap: { [key: number]: { enabled: boolean, condition: string, hitCondition: string } } = {};
this.debugService.getModel().getBreakpoints().filter(bp => bp.source.uri.toString() === modelUrlStr).forEach(bp => { this.debugService.getModel().getBreakpoints().filter(bp => bp.source.uri.toString() === modelUrlStr).forEach(bp => {
enabledAndConditions[bp.lineNumber] = { lineToBreakpointDataMap[bp.lineNumber] = {
enabled: bp.enabled, enabled: bp.enabled,
condition: bp.condition condition: bp.condition,
hitCondition: bp.hitCondition
}; };
}); });
...@@ -217,8 +218,9 @@ export class DebugEditorModelManager implements IWorkbenchContribution { ...@@ -217,8 +218,9 @@ export class DebugEditorModelManager implements IWorkbenchContribution {
data.push({ data.push({
uri: modelUrl, uri: modelUrl,
lineNumber: decorationRange.startLineNumber, lineNumber: decorationRange.startLineNumber,
enabled: enabledAndConditions[modelData.breakpointLines[i]].enabled, enabled: lineToBreakpointDataMap[modelData.breakpointLines[i]].enabled,
condition: enabledAndConditions[modelData.breakpointLines[i]].condition condition: lineToBreakpointDataMap[modelData.breakpointLines[i]].condition,
hitCondition: lineToBreakpointDataMap[modelData.breakpointLines[i]].hitCondition
}); });
} }
} }
...@@ -280,7 +282,7 @@ export class DebugEditorModelManager implements IWorkbenchContribution { ...@@ -280,7 +282,7 @@ export class DebugEditorModelManager implements IWorkbenchContribution {
let result = (!breakpoint.enabled || !activated) ? DebugEditorModelManager.BREAKPOINT_DISABLED_DECORATION : let result = (!breakpoint.enabled || !activated) ? DebugEditorModelManager.BREAKPOINT_DISABLED_DECORATION :
debugActive && modelData && modelData.dirty && !breakpoint.verified ? DebugEditorModelManager.BREAKPOINT_DIRTY_DECORATION : debugActive && modelData && modelData.dirty && !breakpoint.verified ? DebugEditorModelManager.BREAKPOINT_DIRTY_DECORATION :
debugActive && !breakpoint.verified ? DebugEditorModelManager.BREAKPOINT_UNVERIFIED_DECORATION : debugActive && !breakpoint.verified ? DebugEditorModelManager.BREAKPOINT_UNVERIFIED_DECORATION :
!breakpoint.condition ? DebugEditorModelManager.BREAKPOINT_DECORATION : null; !breakpoint.condition && !breakpoint.hitCondition ? DebugEditorModelManager.BREAKPOINT_DECORATION : null;
if (result && breakpoint.message) { if (result && breakpoint.message) {
result = objects.clone(result); result = objects.clone(result);
...@@ -291,19 +293,20 @@ export class DebugEditorModelManager implements IWorkbenchContribution { ...@@ -291,19 +293,20 @@ export class DebugEditorModelManager implements IWorkbenchContribution {
return result; return result;
} }
if (!session || session.configuration.capabilities.supportsConditionalBreakpoints) { if (session && !session.configuration.capabilities.supportsConditionalBreakpoints) {
const mode = modelData ? modelData.model.getMode() : null; return DebugEditorModelManager.BREAKPOINT_UNSUPPORTED_DECORATION;
const modeId = mode ? mode.getId() : '';
const glyphMarginHoverMessage = `\`\`\`${modeId}\n${ breakpoint.condition }\`\`\``;
return {
glyphMarginClassName: 'debug-breakpoint-conditional-glyph',
glyphMarginHoverMessage,
stickiness: editorcommon.TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges
};
} }
return DebugEditorModelManager.BREAKPOINT_UNSUPPORTED_DECORATION; const mode = modelData ? modelData.model.getMode() : null;
const modeId = mode ? mode.getId() : '';
const condition = breakpoint.condition ? breakpoint.condition : breakpoint.hitCondition;
const glyphMarginHoverMessage = `\`\`\`${modeId}\n${ condition }\`\`\``;
return {
glyphMarginClassName: 'debug-breakpoint-conditional-glyph',
glyphMarginHoverMessage,
stickiness: editorcommon.TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges
};
} }
// editor decorations // editor decorations
......
...@@ -130,6 +130,7 @@ export interface IRawBreakpoint { ...@@ -130,6 +130,7 @@ export interface IRawBreakpoint {
lineNumber: number; lineNumber: number;
enabled?: boolean; enabled?: boolean;
condition?: string; condition?: string;
hitCondition?: string;
} }
export interface IBreakpoint extends IEnablement { export interface IBreakpoint extends IEnablement {
...@@ -137,6 +138,7 @@ export interface IBreakpoint extends IEnablement { ...@@ -137,6 +138,7 @@ export interface IBreakpoint extends IEnablement {
lineNumber: number; lineNumber: number;
desiredLineNumber: number; desiredLineNumber: number;
condition: string; condition: string;
hitCondition: string;
verified: boolean; verified: boolean;
idFromAdapter: number; idFromAdapter: number;
message: string; message: string;
...@@ -146,6 +148,7 @@ export interface IFunctionBreakpoint extends IEnablement { ...@@ -146,6 +148,7 @@ export interface IFunctionBreakpoint extends IEnablement {
name: string; name: string;
verified: boolean; verified: boolean;
idFromAdapter: number; idFromAdapter: number;
hitCondition: string;
} }
export interface IExceptionBreakpoint extends IEnablement { export interface IExceptionBreakpoint extends IEnablement {
......
...@@ -410,7 +410,8 @@ export class Breakpoint implements debug.IBreakpoint { ...@@ -410,7 +410,8 @@ export class Breakpoint implements debug.IBreakpoint {
public source: Source, public source: Source,
public desiredLineNumber: number, public desiredLineNumber: number,
public enabled: boolean, public enabled: boolean,
public condition: string public condition: string,
public hitCondition: string
) { ) {
if (enabled === undefined) { if (enabled === undefined) {
this.enabled = true; this.enabled = true;
...@@ -431,7 +432,7 @@ export class FunctionBreakpoint implements debug.IFunctionBreakpoint { ...@@ -431,7 +432,7 @@ export class FunctionBreakpoint implements debug.IFunctionBreakpoint {
public verified: boolean; public verified: boolean;
public idFromAdapter: number; public idFromAdapter: number;
constructor(public name: string, public enabled: boolean) { constructor(public name: string, public enabled: boolean, public hitCondition: string) {
this.verified = false; this.verified = false;
this.id = uuid.generateUuid(); this.id = uuid.generateUuid();
} }
...@@ -563,7 +564,7 @@ export class Model implements debug.IModel { ...@@ -563,7 +564,7 @@ export class Model implements debug.IModel {
public addBreakpoints(rawData: debug.IRawBreakpoint[]): void { public addBreakpoints(rawData: debug.IRawBreakpoint[]): void {
this.breakpoints = this.breakpoints.concat(rawData.map(rawBp => this.breakpoints = this.breakpoints.concat(rawData.map(rawBp =>
new Breakpoint(new Source(Source.toRawSource(rawBp.uri, this)), rawBp.lineNumber, rawBp.enabled, rawBp.condition))); new Breakpoint(new Source(Source.toRawSource(rawBp.uri, this)), rawBp.lineNumber, rawBp.enabled, rawBp.condition, rawBp.hitCondition)));
this.breakpointsActivated = true; this.breakpointsActivated = true;
this._onDidChangeBreakpoints.fire(); this._onDidChangeBreakpoints.fire();
} }
...@@ -612,17 +613,18 @@ export class Model implements debug.IModel { ...@@ -612,17 +613,18 @@ export class Model implements debug.IModel {
} }
public addFunctionBreakpoint(functionName: string): void { public addFunctionBreakpoint(functionName: string): void {
this.functionBreakpoints.push(new FunctionBreakpoint(functionName, true)); this.functionBreakpoints.push(new FunctionBreakpoint(functionName, true, null));
this._onDidChangeBreakpoints.fire(); this._onDidChangeBreakpoints.fire();
} }
public updateFunctionBreakpoints(data: { [id: string]: { name?: string, verified?: boolean; id?: number } }): void { public updateFunctionBreakpoints(data: { [id: string]: { name?: string, verified?: boolean; id?: number; hitCondition?: string } }): void {
this.functionBreakpoints.forEach(fbp => { this.functionBreakpoints.forEach(fbp => {
const fbpData = data[fbp.getId()]; const fbpData = data[fbp.getId()];
if (fbpData) { if (fbpData) {
fbp.name = fbpData.name || fbp.name; fbp.name = fbpData.name || fbp.name;
fbp.verified = fbpData.verified; fbp.verified = fbpData.verified;
fbp.idFromAdapter = fbpData.id; fbp.idFromAdapter = fbpData.id;
fbp.hitCondition = fbpData.hitCondition;
} }
}); });
......
...@@ -359,7 +359,7 @@ export class DebugService implements debug.IDebugService { ...@@ -359,7 +359,7 @@ export class DebugService implements debug.IDebugService {
try { try {
result = JSON.parse(this.storageService.get(DEBUG_BREAKPOINTS_KEY, StorageScope.WORKSPACE, '[]')).map((breakpoint: any) => { result = JSON.parse(this.storageService.get(DEBUG_BREAKPOINTS_KEY, StorageScope.WORKSPACE, '[]')).map((breakpoint: any) => {
return new model.Breakpoint(new Source(breakpoint.source.raw ? breakpoint.source.raw : { path: uri.parse(breakpoint.source.uri).fsPath, name: breakpoint.source.name }), return new model.Breakpoint(new Source(breakpoint.source.raw ? breakpoint.source.raw : { path: uri.parse(breakpoint.source.uri).fsPath, name: breakpoint.source.name }),
breakpoint.desiredLineNumber || breakpoint.lineNumber, breakpoint.enabled, breakpoint.condition); breakpoint.desiredLineNumber || breakpoint.lineNumber, breakpoint.enabled, breakpoint.condition, breakpoint.hitCondition);
}); });
} catch (e) { } } catch (e) { }
...@@ -370,7 +370,7 @@ export class DebugService implements debug.IDebugService { ...@@ -370,7 +370,7 @@ export class DebugService implements debug.IDebugService {
let result: debug.IFunctionBreakpoint[]; let result: debug.IFunctionBreakpoint[];
try { try {
result = JSON.parse(this.storageService.get(DEBUG_FUNCTION_BREAKPOINTS_KEY, StorageScope.WORKSPACE, '[]')).map((fb: any) => { result = JSON.parse(this.storageService.get(DEBUG_FUNCTION_BREAKPOINTS_KEY, StorageScope.WORKSPACE, '[]')).map((fb: any) => {
return new model.FunctionBreakpoint(fb.name, fb.enabled); return new model.FunctionBreakpoint(fb.name, fb.enabled, fb.hitCondition);
}); });
} catch (e) { } } catch (e) { }
...@@ -1045,7 +1045,7 @@ export class DebugService implements debug.IDebugService { ...@@ -1045,7 +1045,7 @@ export class DebugService implements debug.IDebugService {
return this.session.setBreakpoints({ return this.session.setBreakpoints({
source: rawSource, source: rawSource,
lines: breakpointsToSend.map(bp => bp.desiredLineNumber), lines: breakpointsToSend.map(bp => bp.desiredLineNumber),
breakpoints: breakpointsToSend.map(bp => ({ line: bp.desiredLineNumber, condition: bp.condition })), breakpoints: breakpointsToSend.map(bp => ({ line: bp.desiredLineNumber, condition: bp.condition, hitCondition: bp.hitCondition })),
sourceModified sourceModified
}).then(response => { }).then(response => {
if (!response || !response.body) { if (!response || !response.body) {
......
...@@ -1190,8 +1190,8 @@ export class BreakpointsRenderer implements tree.IRenderer { ...@@ -1190,8 +1190,8 @@ export class BreakpointsRenderer implements tree.IRenderer {
if (breakpoint.message) { if (breakpoint.message) {
data.breakpoint.title = breakpoint.message; data.breakpoint.title = breakpoint.message;
} }
} else if (breakpoint.condition) { } else if (breakpoint.condition || breakpoint.hitCondition) {
data.breakpoint.title = breakpoint.condition; data.breakpoint.title = breakpoint.condition ? breakpoint.condition : breakpoint.hitCondition;
} }
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册