in src/activateMockDebug.ts [15:153]
export function activateMockDebug(context: vscode.ExtensionContext, factory?: vscode.DebugAdapterDescriptorFactory) {
context.subscriptions.push(
vscode.commands.registerCommand('extension.mock-debug.runEditorContents', (resource: vscode.Uri) => {
let targetResource = resource;
if (!targetResource && vscode.window.activeTextEditor) {
targetResource = vscode.window.activeTextEditor.document.uri;
}
if (targetResource) {
vscode.debug.startDebugging(undefined, {
type: 'mock',
name: 'Run File',
request: 'launch',
program: targetResource.fsPath
},
{ noDebug: true }
);
}
}),
vscode.commands.registerCommand('extension.mock-debug.debugEditorContents', (resource: vscode.Uri) => {
let targetResource = resource;
if (!targetResource && vscode.window.activeTextEditor) {
targetResource = vscode.window.activeTextEditor.document.uri;
}
if (targetResource) {
vscode.debug.startDebugging(undefined, {
type: 'mock',
name: 'Debug File',
request: 'launch',
program: targetResource.fsPath,
stopOnEntry: true
});
}
}),
vscode.commands.registerCommand('extension.mock-debug.toggleFormatting', (variable) => {
const ds = vscode.debug.activeDebugSession;
if (ds) {
ds.customRequest('toggleFormatting');
}
})
);
context.subscriptions.push(vscode.commands.registerCommand('extension.mock-debug.getProgramName', config => {
return vscode.window.showInputBox({
placeHolder: "Please enter the name of a markdown file in the workspace folder",
value: "readme.md"
});
}));
// register a configuration provider for 'mock' debug type
const provider = new MockConfigurationProvider();
context.subscriptions.push(vscode.debug.registerDebugConfigurationProvider('mock', provider));
// register a dynamic configuration provider for 'mock' debug type
context.subscriptions.push(vscode.debug.registerDebugConfigurationProvider('mock', {
provideDebugConfigurations(folder: WorkspaceFolder | undefined): ProviderResult<DebugConfiguration[]> {
return [
{
name: "Dynamic Launch",
request: "launch",
type: "mock",
program: "${file}"
},
{
name: "Another Dynamic Launch",
request: "launch",
type: "mock",
program: "${file}"
},
{
name: "Mock Launch",
request: "launch",
type: "mock",
program: "${file}"
}
];
}
}, vscode.DebugConfigurationProviderTriggerKind.Dynamic));
if (!factory) {
factory = new InlineDebugAdapterFactory();
}
context.subscriptions.push(vscode.debug.registerDebugAdapterDescriptorFactory('mock', factory));
if ('dispose' in factory) {
context.subscriptions.push(factory);
}
// override VS Code's default implementation of the debug hover
// here we match only Mock "variables", that are words starting with an '$'
context.subscriptions.push(vscode.languages.registerEvaluatableExpressionProvider('markdown', {
provideEvaluatableExpression(document: vscode.TextDocument, position: vscode.Position): vscode.ProviderResult<vscode.EvaluatableExpression> {
const VARIABLE_REGEXP = /\$[a-z][a-z0-9]*/ig;
const line = document.lineAt(position.line).text;
let m: RegExpExecArray | null;
while (m = VARIABLE_REGEXP.exec(line)) {
const varRange = new vscode.Range(position.line, m.index, position.line, m.index + m[0].length);
if (varRange.contains(position)) {
return new vscode.EvaluatableExpression(varRange);
}
}
return undefined;
}
}));
// override VS Code's default implementation of the "inline values" feature"
context.subscriptions.push(vscode.languages.registerInlineValuesProvider('markdown', {
provideInlineValues(document: vscode.TextDocument, viewport: vscode.Range, context: vscode.InlineValueContext) : vscode.ProviderResult<vscode.InlineValue[]> {
const allValues: vscode.InlineValue[] = [];
for (let l = viewport.start.line; l <= context.stoppedLocation.end.line; l++) {
const line = document.lineAt(l);
var regExp = /\$([a-z][a-z0-9]*)/ig; // variables are words starting with '$'
do {
var m = regExp.exec(line.text);
if (m) {
const varName = m[1];
const varRange = new vscode.Range(l, m.index, l, m.index + varName.length);
// some literal text
//allValues.push(new vscode.InlineValueText(varRange, `${varName}: ${viewport.start.line}`));
// value found via variable lookup
allValues.push(new vscode.InlineValueVariableLookup(varRange, varName, false));
// value determined via expression evaluation
//allValues.push(new vscode.InlineValueEvaluatableExpression(varRange, varName));
}
} while (m);
}
return allValues;
}
}));
}