in src/util.ts [1036:1111]
export function runGodoc(
cwd: string,
packagePath: string,
receiver: string | undefined,
symbol: string,
token: vscode.CancellationToken
) {
if (!packagePath) {
return Promise.reject(new Error('Package Path not provided'));
}
if (!symbol) {
return Promise.reject(new Error('Symbol not provided'));
}
const goRuntimePath = getBinPath('go');
if (!goRuntimePath) {
return Promise.reject(new Error('Cannot find "go" binary. Update PATH or GOROOT appropriately'));
}
const getCurrentPackagePromise = path.isAbsolute(packagePath)
? getCurrentPackage(packagePath)
: Promise.resolve(packagePath);
return getCurrentPackagePromise.then((packageImportPath) => {
return new Promise<string>((resolve, reject) => {
if (receiver) {
receiver = receiver.replace(/^\*/, '');
symbol = receiver + '.' + symbol;
}
const env = toolExecutionEnvironment();
const args = ['doc', '-c', '-cmd', '-u', packageImportPath, symbol];
const p = cp.execFile(goRuntimePath, args, { env, cwd }, (err, stdout, stderr) => {
if (err) {
return reject(err.message || stderr);
}
let doc = '';
const godocLines = stdout.split('\n');
if (!godocLines.length) {
return resolve(doc);
}
// Recent versions of Go have started to include the package statement
// tht we dont need.
if (godocLines[0].startsWith('package ')) {
godocLines.splice(0, 1);
if (!godocLines[0].trim()) {
godocLines.splice(0, 1);
}
}
// Skip trailing empty lines
let lastLine = godocLines.length - 1;
for (; lastLine > 1; lastLine--) {
if (godocLines[lastLine].trim()) {
break;
}
}
for (let i = 1; i <= lastLine; i++) {
if (godocLines[i].startsWith(' ')) {
doc += godocLines[i].substring(4) + '\n';
} else if (!godocLines[i].trim()) {
doc += '\n';
}
}
return resolve(doc);
});
if (token) {
token.onCancellationRequested(() => {
killProcessTree(p);
});
}
});
});
}