(node: TargetTreeNode, launcher: ILauncher)
| 387 | } |
| 388 | |
| 389 | private async attach(node: TargetTreeNode, launcher: ILauncher) { |
| 390 | if (!this._launchParams) { |
| 391 | throw new Error('Cannot launch before params have been set'); |
| 392 | } |
| 393 | |
| 394 | const target = node.value; |
| 395 | if (!target.canAttach()) { |
| 396 | return; |
| 397 | } |
| 398 | const cdp = await target.attach(); |
| 399 | if (!cdp) { |
| 400 | return; |
| 401 | } |
| 402 | const connection = await this._delegate.acquireDap(target); |
| 403 | const dap = connection.dap(); |
| 404 | const launchParams = this._launchParams; |
| 405 | |
| 406 | if (!this._asyncStackPolicy) { |
| 407 | this._asyncStackPolicy = getAsyncStackPolicy(launchParams.showAsyncStacks); |
| 408 | } |
| 409 | |
| 410 | const parentTarget = target.parent(); |
| 411 | const parentContainer = (parentTarget && this._serviceTree.get(parentTarget)) |
| 412 | || this._rootServices; |
| 413 | const container = createTargetContainer(parentContainer, target, dap, cdp); |
| 414 | connection.attachTelemetry(container.get(ITelemetryReporter)); |
| 415 | this._serviceTree.set(target, parentContainer); |
| 416 | |
| 417 | const debugAdapter = new DebugAdapter(dap, this._asyncStackPolicy, launchParams, container); |
| 418 | const thread = debugAdapter.createThread(cdp, target); |
| 419 | |
| 420 | const isBlazor = 'inspectUri' in launchParams && !!launchParams.inspectUri; |
| 421 | if (isBlazor) { |
| 422 | this.attachDotnetDebuggerEvent( |
| 423 | cdp, |
| 424 | this._rootServices.get(ITelemetryReporter), |
| 425 | this._rootServices.get(IsVSCode), |
| 426 | ); |
| 427 | } |
| 428 | |
| 429 | const startThread = async () => { |
| 430 | await debugAdapter.launchBlocker(); |
| 431 | target.runIfWaitingForDebugger(); |
| 432 | node.threadData.resolve({ thread, debugAdapter }); |
| 433 | return {}; |
| 434 | }; |
| 435 | |
| 436 | // default disconnect/terminate/restart handlers that can be overridden |
| 437 | // by the delegate in initAdapter() |
| 438 | dap.on('disconnect', args => this._disconnectTarget(node, args)); |
| 439 | dap.on('terminate', () => this._terminateTarget(node)); |
| 440 | dap.on('restart', async () => { |
| 441 | if (target.canRestart()) { |
| 442 | target.restart(); |
| 443 | } else { |
| 444 | await this._restart(); |
| 445 | } |
| 446 |
no test coverage detected