提交 40d95595 编写于 作者: I isidor

Breakpoints allow to move to different sources on update

fixes #89756
上级 d7eac676
......@@ -17,7 +17,7 @@ import {
ITreeElement, IExpression, IExpressionContainer, IDebugSession, IStackFrame, IExceptionBreakpoint, IBreakpoint, IFunctionBreakpoint, IDebugModel,
IThread, IRawModelUpdate, IScope, IRawStoppedDetails, IEnablement, IBreakpointData, IExceptionInfo, IBreakpointsChangeEvent, IBreakpointUpdateData, IBaseBreakpoint, State, IDataBreakpoint
} from 'vs/workbench/contrib/debug/common/debug';
import { Source, UNKNOWN_SOURCE_LABEL } from 'vs/workbench/contrib/debug/common/debugSource';
import { Source, UNKNOWN_SOURCE_LABEL, getUriFromSource } from 'vs/workbench/contrib/debug/common/debugSource';
import { commonSuffixLength } from 'vs/base/common/strings';
import { posix } from 'vs/base/common/path';
import { IEditorService } from 'vs/workbench/services/editor/common/editorService';
......@@ -515,6 +515,7 @@ interface IBreakpointSessionData extends DebugProtocol.Breakpoint {
supportsLogPoints: boolean;
supportsFunctionBreakpoints: boolean;
supportsDataBreakpoints: boolean;
sessionId: string;
}
function toBreakpointSessionData(data: DebugProtocol.Breakpoint, capabilities: DebugProtocol.Capabilities): IBreakpointSessionData {
......@@ -549,6 +550,7 @@ export abstract class BaseBreakpoint extends Enablement implements IBaseBreakpoi
if (!data) {
this.sessionData.delete(sessionId);
} else {
data.sessionId = sessionId;
this.sessionData.set(sessionId, data);
}
......@@ -596,7 +598,7 @@ export abstract class BaseBreakpoint extends Enablement implements IBaseBreakpoi
export class Breakpoint extends BaseBreakpoint implements IBreakpoint {
constructor(
public uri: uri,
private _uri: uri,
private _lineNumber: number,
private _column: number | undefined,
enabled: boolean,
......@@ -616,12 +618,16 @@ export class Breakpoint extends BaseBreakpoint implements IBreakpoint {
get verified(): boolean {
if (this.data) {
return this.data.verified && !this.textFileService.isDirty(this.uri);
return this.data.verified && !this.textFileService.isDirty(this._uri);
}
return true;
}
get uri(): uri {
return this.verified && this.data && this.data.source ? getUriFromSource(this.data.source, this.data.source.path, this.data.sessionId) : this._uri;
}
get column(): number | undefined {
return this.verified && this.data && typeof this.data.column === 'number' ? this.data.column : this._column;
}
......
......@@ -4,7 +4,7 @@
*--------------------------------------------------------------------------------------------*/
import * as nls from 'vs/nls';
import { URI as uri } from 'vs/base/common/uri';
import { URI } from 'vs/base/common/uri';
import { normalize, isAbsolute } from 'vs/base/common/path';
import * as resources from 'vs/base/common/resources';
import { DEBUG_SCHEME } from 'vs/workbench/contrib/debug/common/debug';
......@@ -32,7 +32,7 @@ export const UNKNOWN_SOURCE_LABEL = nls.localize('unknownSource', "Unknown Sourc
export class Source {
readonly uri: uri;
readonly uri: URI;
available: boolean;
raw: DebugProtocol.Source;
......@@ -48,30 +48,7 @@ export class Source {
path = `${DEBUG_SCHEME}:${UNKNOWN_SOURCE_LABEL}`;
}
if (typeof this.raw.sourceReference === 'number' && this.raw.sourceReference > 0) {
this.uri = uri.from({
scheme: DEBUG_SCHEME,
path,
query: `session=${sessionId}&ref=${this.raw.sourceReference}`
});
} else {
if (isUri(path)) { // path looks like a uri
this.uri = uri.parse(path);
} else {
// assume a filesystem path
if (isAbsolute(path)) {
this.uri = uri.file(path);
} else {
// path is relative: since VS Code cannot deal with this by itself
// create a debug url that will result in a DAP 'source' request when the url is resolved.
this.uri = uri.from({
scheme: DEBUG_SCHEME,
path,
query: `session=${sessionId}`
});
}
}
}
this.uri = getUriFromSource(this.raw, path, sessionId);
}
get name() {
......@@ -108,7 +85,7 @@ export class Source {
}, sideBySide ? SIDE_GROUP : ACTIVE_GROUP);
}
static getEncodedDebugData(modelUri: uri): { name: string, path: string, sessionId?: string, sourceReference?: number } {
static getEncodedDebugData(modelUri: URI): { name: string, path: string, sessionId?: string, sourceReference?: number } {
let path: string;
let sourceReference: number | undefined;
let sessionId: string | undefined;
......@@ -149,3 +126,28 @@ export class Source {
};
}
}
export function getUriFromSource(raw: DebugProtocol.Source, path: string | undefined, sessionId: string): URI {
if (typeof raw.sourceReference === 'number' && raw.sourceReference > 0) {
return URI.from({
scheme: DEBUG_SCHEME,
path,
query: `session=${sessionId}&ref=${raw.sourceReference}`
});
}
if (path && isUri(path)) { // path looks like a uri
return URI.parse(path);
}
// assume a filesystem path
if (path && isAbsolute(path)) {
return URI.file(path);
}
// path is relative: since VS Code cannot deal with this by itself
// create a debug url that will result in a DAP 'source' request when the url is resolved.
return URI.from({
scheme: DEBUG_SCHEME,
path,
query: `session=${sessionId}`
});
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册