in src/debugAdapter/goDebug.ts [1963:2098]
private initLaunchAttachRequest(
response: DebugProtocol.LaunchResponse,
args: LaunchRequestArguments | AttachRequestArguments
) {
this.logLevel =
args.trace === 'verbose' || args.trace === 'trace'
? Logger.LogLevel.Verbose
: args.trace === 'log' || args.trace === 'info' || args.trace === 'warn'
? Logger.LogLevel.Log
: Logger.LogLevel.Error;
const logPath =
this.logLevel !== Logger.LogLevel.Error ? path.join(os.tmpdir(), 'vscode-go-debug.txt') : undefined;
logger.setup(this.logLevel, logPath);
if (typeof args.showGlobalVariables === 'boolean') {
this.showGlobalVariables = args.showGlobalVariables;
}
if (args.stopOnEntry) {
this.stopOnEntry = args.stopOnEntry;
}
if (!args.port) {
args.port = random(2000, 50000);
}
if (!args.host) {
args.host = '127.0.0.1';
}
let localPath: string;
if (args.request === 'attach') {
localPath = args.cwd;
} else if (args.request === 'launch') {
localPath = args.program;
}
if (!args.remotePath) {
// too much code relies on remotePath never being null
args.remotePath = '';
}
this.localPathSeparator = findPathSeparator(localPath);
this.substitutePath = [];
if (args.remotePath.length > 0) {
this.remotePathSeparator = findPathSeparator(args.remotePath);
const llist = localPath.split(/\/|\\/).reverse();
const rlist = args.remotePath.split(/\/|\\/).reverse();
let i = 0;
for (; i < llist.length; i++) {
if (llist[i] !== rlist[i] || llist[i] === 'src') {
break;
}
}
if (i) {
localPath = llist.reverse().slice(0, -i).join(this.localPathSeparator) + this.localPathSeparator;
args.remotePath =
rlist.reverse().slice(0, -i).join(this.remotePathSeparator) + this.remotePathSeparator;
} else if (
args.remotePath.length > 1 &&
(args.remotePath.endsWith('\\') || args.remotePath.endsWith('/'))
) {
args.remotePath = args.remotePath.substring(0, args.remotePath.length - 1);
}
// Make the remotePath mapping the first one in substitutePath
// so that it will take precedence over the other mappings.
this.substitutePath.push({
from: normalizeSeparators(localPath),
to: normalizeSeparators(args.remotePath)
});
}
if (args.substitutePath) {
args.substitutePath.forEach((value) => {
if (!this.remotePathSeparator) {
this.remotePathSeparator = findPathSeparator(value.to);
}
this.substitutePath.push({
from: normalizeSeparators(value.from),
to: normalizeSeparators(value.to)
});
});
}
// Launch the Delve debugger on the program
this.delve = new Delve(args, localPath);
this.delve.onstdout = (str: string) => {
this.sendEvent(new OutputEvent(str, 'stdout'));
};
this.delve.onstderr = (str: string) => {
if (localPath.length > 0) {
str = expandFilePathInOutput(str, localPath);
}
this.sendEvent(new OutputEvent(str, 'stderr'));
};
this.delve.onclose = (code) => {
if (code !== 0) {
this.sendErrorResponse(response, 3000, 'Failed to continue: Check the debug console for details.');
}
log('Sending TerminatedEvent as delve is closed');
this.sendEvent(new TerminatedEvent());
};
this.delve.connection.then(
() => {
if (!this.delve.noDebug) {
this.delve.call<GetVersionOut>('GetVersion', [], (err, out) => {
if (err) {
logError(err);
return this.sendErrorResponse(
response,
2001,
'Failed to get remote server version: "{e}"',
{ e: err.toString() }
);
}
const clientVersion = this.delve.isApiV1 ? 1 : 2;
if (out.APIVersion !== clientVersion) {
const errorMessage = `The remote server is running on delve v${out.APIVersion} API and the client is running v${clientVersion} API. Change the version used on the client by using the property "apiVersion" in your launch.json file.`;
logError(errorMessage);
return this.sendErrorResponse(response, 3000, errorMessage);
}
});
this.sendEvent(new InitializedEvent());
log('InitializeEvent');
}
this.sendResponse(response);
},
(err) => {
this.sendErrorResponse(response, 3000, 'Failed to continue: "{e}"', {
e: err.toString()
});
log('ContinueResponse');
}
);
}