(target: ITarget, launcher: ILauncher)
| 338 | } |
| 339 | |
| 340 | public async attach(target: ITarget, launcher: ILauncher) { |
| 341 | if (!this._launchParams) { |
| 342 | throw new Error('Cannot launch before params have been set'); |
| 343 | } |
| 344 | |
| 345 | if (!target.canAttach()) { |
| 346 | return; |
| 347 | } |
| 348 | const cdp = await target.attach(); |
| 349 | if (!cdp) { |
| 350 | return; |
| 351 | } |
| 352 | const connection = await this._delegate.acquireDap(target); |
| 353 | const dap = await connection.dap(); |
| 354 | const launchParams = this._launchParams; |
| 355 | |
| 356 | if (!this._asyncStackPolicy) { |
| 357 | this._asyncStackPolicy = getAsyncStackPolicy(launchParams.showAsyncStacks); |
| 358 | } |
| 359 | |
| 360 | const parentTarget = target.parent(); |
| 361 | const parentContainer = |
| 362 | (parentTarget && this._serviceTree.get(parentTarget)) || this._rootServices; |
| 363 | const container = createTargetContainer(parentContainer, target, dap, cdp); |
| 364 | connection.attachTelemetry(container.get(ITelemetryReporter)); |
| 365 | this._serviceTree.set(target, parentContainer); |
| 366 | |
| 367 | // todo: move scriptskipper into services collection |
| 368 | const debugAdapter = new DebugAdapter(dap, this._asyncStackPolicy, launchParams, container); |
| 369 | const thread = debugAdapter.createThread(cdp, target); |
| 370 | this._threads.set(target, { thread, debugAdapter }); |
| 371 | const startThread = async () => { |
| 372 | await debugAdapter.launchBlocker(); |
| 373 | cdp.Runtime.runIfWaitingForDebugger({}); |
| 374 | return {}; |
| 375 | }; |
| 376 | if (await this._delegate.initAdapter(debugAdapter, target, launcher)) { |
| 377 | startThread(); |
| 378 | } else { |
| 379 | dap.on('attach', startThread); |
| 380 | dap.on('launch', startThread); |
| 381 | dap.on('disconnect', () => this.detachTarget(target, container)); |
| 382 | dap.on('terminate', () => this.stopTarget(target, container)); |
| 383 | dap.on('restart', async () => { |
| 384 | if (target.canRestart()) target.restart(); |
| 385 | else await this._restart(); |
| 386 | return {}; |
| 387 | }); |
| 388 | } |
| 389 | |
| 390 | await target.afterBind(); |
| 391 | } |
| 392 | |
| 393 | /** |
| 394 | * Called when we get a disconnect for a target. We stop the |
no test coverage detected