in src/goRunTestCodelens.ts [96:179]
private async getCodeLensForFunctions(document: TextDocument, token: CancellationToken): Promise<CodeLens[]> {
const testPromise = async (): Promise<CodeLens[]> => {
const codelens: CodeLens[] = [];
const testFunctions = await getTestFunctions(this.goCtx, document, token);
if (!testFunctions) {
return codelens;
}
const simpleRunRegex = /t.Run\("([^"]+)",/;
for (const f of testFunctions) {
const functionName = f.name;
codelens.push(
new CodeLens(f.range, {
title: 'run test',
command: 'go.test.cursor',
arguments: [{ functionName }]
}),
new CodeLens(f.range, {
title: 'debug test',
command: 'go.debug.cursor',
arguments: [{ functionName }]
})
);
for (let i = f.range.start.line; i < f.range.end.line; i++) {
const line = document.lineAt(i);
const simpleMatch = line.text.match(simpleRunRegex);
// BUG: this does not handle nested subtests. This should
// be solved once codelens is handled by gopls and not by
// vscode.
if (simpleMatch) {
const subTestName = simpleMatch[1];
codelens.push(
new CodeLens(line.range, {
title: 'run test',
command: 'go.subtest.cursor',
arguments: [{ functionName, subTestName }]
}),
new CodeLens(line.range, {
title: 'debug test',
command: 'go.debug.subtest.cursor',
arguments: [{ functionName, subTestName }]
})
);
}
}
}
return codelens;
};
const benchmarkPromise = async (): Promise<CodeLens[]> => {
const benchmarkFunctions = await getBenchmarkFunctions(this.goCtx, document, token);
if (!benchmarkFunctions) {
return [];
}
const codelens: CodeLens[] = [];
for (const f of benchmarkFunctions) {
codelens.push(
new CodeLens(f.range, {
title: 'run benchmark',
command: 'go.benchmark.cursor',
arguments: [{ functionName: f.name }]
})
);
codelens.push(
new CodeLens(f.range, {
title: 'debug benchmark',
command: 'go.debug.cursor',
arguments: [{ functionName: f.name }]
})
);
}
return codelens;
};
const codelenses = await Promise.all([testPromise(), benchmarkPromise()]);
return ([] as CodeLens[]).concat(...codelenses);
}