提交 f8026782 编写于 作者: I isidor

debug: try to send source reference when possible to adapter.

fixes #1514
上级 ba04fe4c
......@@ -5,24 +5,44 @@
import uri from 'vs/base/common/uri';
import paths = require('vs/base/common/paths');
import { IModel } from 'vs/workbench/parts/debug/common/debug';
export class Source {
public uri: uri;
public inMemory: boolean;
public available: boolean;
private static INTERNAL_URI_PREFIX = 'debug://internal/';
constructor(public name: string, uriStr: string, public reference = 0) {
this.uri = uri.parse(uriStr);
this.inMemory = uriStr.indexOf(Source.INTERNAL_URI_PREFIX) === 0;
this.available = true;
}
public toRawSource(): DebugProtocol.Source {
return this.inMemory ? { name: this.name } :
{ path: paths.normalize(this.uri.fsPath, true) };
public get inMemory() {
return Source.isInMemory(this.uri);
}
public static toRawSource(uri: uri, model: IModel): DebugProtocol.Source {
// First try to find the raw source amongst the stack frames - since that represenation has more data (source reference),
const threads = model.getThreads();
for (var threadId in threads) {
if (threads.hasOwnProperty(threadId) && threads[threadId].callStack) {
const found = threads[threadId].callStack.filter(sf => sf.source.uri.toString() === uri.toString()).pop();
if (found) {
return {
name: found.source.name,
path: found.source.uri.fsPath,
sourceReference: found.source.reference
}
}
}
}
// Did not find the raw source amongst the stack frames, construct the raw stack frame from the limited data you have.
return Source.isInMemory(uri) ? { name: Source.getName(uri) } :
{ path: paths.normalize(uri.fsPath, true) };
}
public static fromRawSource(rawSource: DebugProtocol.Source): Source {
......@@ -31,7 +51,15 @@ export class Source {
}
public static fromUri(uri: uri): Source {
return new Source(Source.getName(uri), uri.toString());
}
private static getName(uri: uri): string {
var uriStr = uri.toString();
return new Source(uriStr.substr(uriStr.lastIndexOf('/') + 1), uriStr);
return uriStr.substr(uriStr.lastIndexOf('/') + 1);
}
private static isInMemory(uri: uri): boolean {
return uri.toString().indexOf(Source.INTERNAL_URI_PREFIX) === 0;
}
}
......@@ -776,7 +776,8 @@ export class DebugService extends ee.EventEmitter implements debug.IDebugService
bp => `${ bp.desiredLineNumber }`
);
return this.session.setBreakpoints({ source: Source.fromUri(modelUri).toRawSource(), lines: breakpointsToSend.map(bp => bp.desiredLineNumber) }).then(response => {
return this.session.setBreakpoints({ source: Source.toRawSource(modelUri, this.model), lines: breakpointsToSend.map(bp => bp.desiredLineNumber) }).then(response => {
const data: {[id: string]: { line: number, verified: boolean } } = { };
for (let i = 0; i < breakpointsToSend.length; i++) {
data[breakpointsToSend[i].getId()] = response.body.breakpoints[i];
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册