diff --git a/src/vs/workbench/parts/debug/browser/debugEditorActions.ts b/src/vs/workbench/parts/debug/browser/debugEditorActions.ts index 4196b78b1703d0debd658e760d5cc24f2e9c73e4..9df1f8a0becdf3457a7cf0e7f07a86105d3f8ee3 100644 --- a/src/vs/workbench/parts/debug/browser/debugEditorActions.ts +++ b/src/vs/workbench/parts/debug/browser/debugEditorActions.ts @@ -101,7 +101,7 @@ class RunToCursorAction extends EditorAction { const oneTimeListener = debugService.getViewModel().focusedProcess.session.onDidEvent(event => { if (event.event === 'stopped' || event.event === 'exit') { const toRemove = debugService.getModel().getBreakpoints() - .filter(bp => bp.desiredLineNumber === lineNumber && bp.uri.toString() === uri.toString()).pop(); + .filter(bp => bp.lineNumber === lineNumber && bp.uri.toString() === uri.toString()).pop(); if (toRemove) { debugService.removeBreakpoints(toRemove.getId()); } diff --git a/src/vs/workbench/parts/debug/common/debug.ts b/src/vs/workbench/parts/debug/common/debug.ts index b829070e8d714138e35949d75eced951e08d8c9f..72a2bb0fd4f4d29209bf002e0454f31c6b9c31a9 100644 --- a/src/vs/workbench/parts/debug/common/debug.ts +++ b/src/vs/workbench/parts/debug/common/debug.ts @@ -186,7 +186,6 @@ export interface IRawBreakpoint { export interface IBreakpoint extends IEnablement { uri: uri; lineNumber: number; - desiredLineNumber: number; condition: string; hitCondition: string; verified: boolean; diff --git a/src/vs/workbench/parts/debug/common/debugModel.ts b/src/vs/workbench/parts/debug/common/debugModel.ts index 0d01631bac8320a9a1d3314745f16b70e30bb80f..ef0fbe7218e40b8503d9f41a6e5c92278efc014b 100644 --- a/src/vs/workbench/parts/debug/common/debugModel.ts +++ b/src/vs/workbench/parts/debug/common/debugModel.ts @@ -570,7 +570,6 @@ export class Process implements debug.IProcess { export class Breakpoint implements debug.IBreakpoint { - public lineNumber: number; public verified: boolean; public idFromAdapter: number; public message: string; @@ -578,7 +577,7 @@ export class Breakpoint implements debug.IBreakpoint { constructor( public uri: uri, - public desiredLineNumber: number, + public lineNumber: number, public enabled: boolean, public condition: string, public hitCondition: string @@ -586,7 +585,6 @@ export class Breakpoint implements debug.IBreakpoint { if (enabled === undefined) { this.enabled = true; } - this.lineNumber = this.desiredLineNumber; this.verified = false; this.id = generateUuid(); } @@ -755,6 +753,9 @@ export class Model implements debug.IModel { bp.message = bpData.message; } }); + + // Remove duplicate breakpoints. This can happen when an adapter updates a line number of a breakpoint + this.breakpoints = distinct(this.breakpoints, bp => bp.uri.toString() + bp.lineNumber); this._onDidChangeBreakpoints.fire(); } @@ -762,7 +763,6 @@ export class Model implements debug.IModel { element.enabled = enable; if (element instanceof Breakpoint && !element.enabled) { var breakpoint = element; - breakpoint.lineNumber = breakpoint.desiredLineNumber; breakpoint.verified = false; } @@ -773,7 +773,6 @@ export class Model implements debug.IModel { this.breakpoints.forEach(bp => { bp.enabled = enable; if (!enable) { - bp.lineNumber = bp.desiredLineNumber; bp.verified = false; } }); diff --git a/src/vs/workbench/parts/debug/electron-browser/debugService.ts b/src/vs/workbench/parts/debug/electron-browser/debugService.ts index 1659718dc1ca357bd17395019f60246da7f2ae39..10ed31d30d63cfc2ed59b38fb29ae08847a426c9 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugService.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugService.ts @@ -375,7 +375,7 @@ export class DebugService implements debug.IDebugService { let result: Breakpoint[]; try { result = JSON.parse(this.storageService.get(DEBUG_BREAKPOINTS_KEY, StorageScope.WORKSPACE, '[]')).map((breakpoint: any) => { - return new Breakpoint(uri.parse(breakpoint.uri.external || breakpoint.source.uri.external), breakpoint.desiredLineNumber || breakpoint.lineNumber, breakpoint.enabled, breakpoint.condition, breakpoint.hitCondition); + return new Breakpoint(uri.parse(breakpoint.uri.external || breakpoint.source.uri.external), breakpoint.lineNumber, breakpoint.enabled, breakpoint.condition, breakpoint.hitCondition); }); } catch (e) { } @@ -943,10 +943,8 @@ export class DebugService implements debug.IDebugService { return TPromise.as(null); } - const breakpointsToSend = distinct( - this.model.getBreakpoints().filter(bp => this.model.areBreakpointsActivated() && bp.enabled && bp.uri.toString() === modelUri.toString()), - bp => `${bp.desiredLineNumber}` - ); + const breakpointsToSend = distinct(this.model.getBreakpoints().filter(bp => this.model.areBreakpointsActivated() && bp.enabled && bp.uri.toString() === modelUri.toString()), + bp => bp.lineNumber.toString()); let rawSource: DebugProtocol.Source; for (let t of process.getAllThreads()) { @@ -964,8 +962,8 @@ export class DebugService implements debug.IDebugService { return session.setBreakpoints({ source: rawSource, - lines: breakpointsToSend.map(bp => bp.desiredLineNumber), - breakpoints: breakpointsToSend.map(bp => ({ line: bp.desiredLineNumber, condition: bp.condition, hitCondition: bp.hitCondition })), + lines: breakpointsToSend.map(bp => bp.lineNumber), + breakpoints: breakpointsToSend.map(bp => ({ line: bp.lineNumber, condition: bp.condition, hitCondition: bp.hitCondition })), sourceModified }).then(response => { if (!response || !response.body) { diff --git a/src/vs/workbench/parts/debug/electron-browser/debugViewer.ts b/src/vs/workbench/parts/debug/electron-browser/debugViewer.ts index 580cb6f4e7dd5df1f50eb03ac4373f029da23177..c459417e3f0d675160ee8897260149676a668ba4 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugViewer.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugViewer.ts @@ -1257,7 +1257,7 @@ export class BreakpointsRenderer implements IRenderer { this.debugService.getModel().areBreakpointsActivated() ? tree.removeTraits('disabled', [breakpoint]) : tree.addTraits('disabled', [breakpoint]); data.name.textContent = getPathLabel(paths.basename(breakpoint.uri.fsPath), this.contextService); - data.lineNumber.textContent = breakpoint.desiredLineNumber !== breakpoint.lineNumber ? breakpoint.desiredLineNumber + ' \u2192 ' + breakpoint.lineNumber : '' + breakpoint.lineNumber; + data.lineNumber.textContent = breakpoint.lineNumber.toString(); data.filePath.textContent = getPathLabel(paths.dirname(breakpoint.uri.fsPath), this.contextService); data.checkbox.checked = breakpoint.enabled; data.actionBar.context = breakpoint; diff --git a/src/vs/workbench/parts/debug/electron-browser/debugViews.ts b/src/vs/workbench/parts/debug/electron-browser/debugViews.ts index 4c978c7dcb59f724f31fb69fa8348969ab35ba98..20fa93a163a5693aa0cd3d437fee5e9d90974448 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugViews.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugViews.ts @@ -382,7 +382,7 @@ export class BreakpointsView extends AdaptiveCollapsibleViewletView { return paths.basename(first.uri.fsPath).localeCompare(paths.basename(second.uri.fsPath)); } - return first.desiredLineNumber - second.desiredLineNumber; + return first.lineNumber - second.lineNumber; } } }, debugTreeOptions(nls.localize({ comment: ['Debug is a noun in this context, not a verb.'], key: 'breakpointsAriaTreeLabel' }, "Debug Breakpoints"))); diff --git a/src/vs/workbench/parts/debug/test/node/debugModel.test.ts b/src/vs/workbench/parts/debug/test/node/debugModel.test.ts index e014d245e8976cd39c25dfbd7d32f2a213ea8d1f..0259b19346a112bfd14afacb081a22500c85651e 100644 --- a/src/vs/workbench/parts/debug/test/node/debugModel.test.ts +++ b/src/vs/workbench/parts/debug/test/node/debugModel.test.ts @@ -57,12 +57,10 @@ suite('Debug - Model', () => { assert.equal(model.getBreakpoints().length, 5); var bp = model.getBreakpoints()[0]; - var originalLineLumber = bp.lineNumber; const update: any = {}; update[bp.getId()] = { line: 100, verified: false }; model.updateBreakpoints(update); assert.equal(bp.lineNumber, 100); - assert.equal(bp.desiredLineNumber, originalLineLumber); model.enableOrDisableAllBreakpoints(false); model.getBreakpoints().forEach(bp => {