Merge from vscode c58aaab8a1cc22a7139b761166a0d4f37d41e998 (#7880)

* Merge from vscode c58aaab8a1cc22a7139b761166a0d4f37d41e998

* fix pipelines

* fix strict-null-checks

* add missing files
This commit is contained in:
Anthony Dresser
2019-10-21 22:12:22 -07:00
committed by GitHub
parent 7c9be74970
commit 1e22f47304
913 changed files with 18898 additions and 16536 deletions

View File

@@ -16,7 +16,7 @@ import * as platform from 'vs/base/common/platform';
import { URI } from 'vs/base/common/uri';
import { IRemoteConsoleLog, log } from 'vs/base/common/console';
import { logRemoteEntry } from 'vs/workbench/services/extensions/common/remoteConsoleUtil';
import { findFreePort, randomPort } from 'vs/base/node/ports';
import { findFreePort } from 'vs/base/node/ports';
import { IMessagePassingProtocol } from 'vs/base/parts/ipc/common/ipc';
import { PersistentProtocol } from 'vs/base/parts/ipc/common/ipc.net';
import { generateRandomPipeName, NodeSocket } from 'vs/base/parts/ipc/node/ipc.net';
@@ -45,6 +45,8 @@ export class ExtensionHostProcessWorker implements IExtensionHostStarter {
private readonly _onExit: Emitter<[number, string]> = new Emitter<[number, string]>();
public readonly onExit: Event<[number, string]> = this._onExit.event;
private readonly _onDidSetInspectPort = new Emitter<void>();
private readonly _toDispose = new DisposableStore();
private readonly _isExtensionDevHost: boolean;
@@ -127,10 +129,10 @@ export class ExtensionHostProcessWorker implements IExtensionHostStarter {
if (!this._messageProtocol) {
this._messageProtocol = Promise.all([
this._tryListenOnPipe(),
!this._environmentService.args['disable-inspect'] ? this._tryFindDebugPort() : Promise.resolve(null)
this._tryFindDebugPort()
]).then(data => {
const pipeName = data[0];
const portData = data[1];
const portNumber = data[1];
const opts = {
env: objects.mixin(objects.deepClone(process.env), {
@@ -151,16 +153,11 @@ export class ExtensionHostProcessWorker implements IExtensionHostStarter {
silent: true
};
if (portData && portData.actual) {
if (portNumber !== 0) {
opts.execArgv = [
'--nolazy',
(this._isExtensionDevDebugBrk ? '--inspect-brk=' : '--inspect=') + portData.actual
(this._isExtensionDevDebugBrk ? '--inspect-brk=' : '--inspect=') + portNumber
];
if (!portData.expected) {
// No one asked for 'inspect' or 'inspect-brk', only us. We add another
// option such that the extension host can manipulate the execArgv array
opts.env.VSCODE_PREVENT_FOREIGN_INSPECT = true;
}
}
const crashReporterOptions = undefined; // TODO@electron pass this in as options to the extension host after verifying this actually works
@@ -198,6 +195,7 @@ export class ExtensionHostProcessWorker implements IExtensionHostStarter {
}
if (!this._inspectPort) {
this._inspectPort = Number(inspectorUrlMatch[2]);
this._onDidSetInspectPort.fire();
}
} else {
console.group('Extension Host');
@@ -218,11 +216,12 @@ export class ExtensionHostProcessWorker implements IExtensionHostStarter {
this._extensionHostProcess.on('exit', (code: number, signal: string) => this._onExtHostProcessExit(code, signal));
// Notify debugger that we are ready to attach to the process if we run a development extension
if (portData) {
if (this._isExtensionDevHost && portData.actual && this._isExtensionDevDebug && this._environmentService.debugExtensionHost.debugId) {
this._extensionHostDebugService.attachSession(this._environmentService.debugExtensionHost.debugId, portData.actual);
if (portNumber) {
if (this._isExtensionDevHost && portNumber && this._isExtensionDevDebug && this._environmentService.debugExtensionHost.debugId) {
this._extensionHostDebugService.attachSession(this._environmentService.debugExtensionHost.debugId, portNumber);
}
this._inspectPort = portData.actual;
this._inspectPort = portNumber;
this._onDidSetInspectPort.fire();
}
// Help in case we fail to start it
@@ -275,29 +274,31 @@ export class ExtensionHostProcessWorker implements IExtensionHostStarter {
/**
* Find a free port if extension host debugging is enabled.
*/
private _tryFindDebugPort(): Promise<{ expected: number; actual: number }> {
let expected: number;
let startPort = randomPort();
if (typeof this._environmentService.debugExtensionHost.port === 'number') {
startPort = expected = this._environmentService.debugExtensionHost.port;
private async _tryFindDebugPort(): Promise<number> {
if (typeof this._environmentService.debugExtensionHost.port !== 'number') {
return 0;
}
return new Promise(resolve => {
return findFreePort(startPort, 10 /* try 10 ports */, 5000 /* try up to 5 seconds */).then(port => {
if (!port) {
console.warn('%c[Extension Host] %cCould not find a free port for debugging', 'color: blue', 'color:');
} else {
if (expected && port !== expected) {
console.warn(`%c[Extension Host] %cProvided debugging port ${expected} is not free, using ${port} instead.`, 'color: blue', 'color:');
}
if (this._isExtensionDevDebugBrk) {
console.warn(`%c[Extension Host] %cSTOPPED on first line for debugging on port ${port}`, 'color: blue', 'color:');
} else {
console.info(`%c[Extension Host] %cdebugger listening on port ${port}`, 'color: blue', 'color:');
}
}
return resolve({ expected, actual: port });
});
});
const expected = this._environmentService.debugExtensionHost.port;
const port = await findFreePort(expected, 10 /* try 10 ports */, 5000 /* try up to 5 seconds */);
if (!port) {
console.warn('%c[Extension Host] %cCould not find a free port for debugging', 'color: blue', 'color:');
return 0;
}
if (port !== expected) {
console.warn(`%c[Extension Host] %cProvided debugging port ${expected} is not free, using ${port} instead.`, 'color: blue', 'color:');
}
if (this._isExtensionDevDebugBrk) {
console.warn(`%c[Extension Host] %cSTOPPED on first line for debugging on port ${port}`, 'color: blue', 'color:');
} else {
console.info(`%c[Extension Host] %cdebugger listening on port ${port}`, 'color: blue', 'color:');
}
return port;
}
private _tryExtHostHandshake(): Promise<PersistentProtocol> {
@@ -467,6 +468,37 @@ export class ExtensionHostProcessWorker implements IExtensionHostStarter {
this._onExit.fire([code, signal]);
}
public async enableInspectPort(): Promise<boolean> {
if (typeof this._inspectPort === 'number') {
return true;
}
if (!this._extensionHostProcess) {
return false;
}
interface ProcessExt {
_debugProcess?(n: number): any;
}
if (typeof (<ProcessExt>process)._debugProcess === 'function') {
// use (undocumented) _debugProcess feature of node
(<ProcessExt>process)._debugProcess!(this._extensionHostProcess.pid);
await Promise.race([Event.toPromise(this._onDidSetInspectPort.event), timeout(1000)]);
return typeof this._inspectPort === 'number';
} else if (!platform.isWindows) {
// use KILL USR1 on non-windows platforms (fallback)
this._extensionHostProcess.kill('SIGUSR1');
await Promise.race([Event.toPromise(this._onDidSetInspectPort.event), timeout(1000)]);
return typeof this._inspectPort === 'number';
} else {
// not supported...
return false;
}
}
public getInspectPort(): number | undefined {
return withNullAsUndefined(this._inspectPort);
}

View File

@@ -542,9 +542,9 @@ export class ExtensionService extends AbstractExtensionService implements IExten
this._doHandleExtensionPoints(this._registry.getAllExtensionDescriptions());
}
public getInspectPort(): number {
public async getInspectPort(tryEnableInspector: boolean): Promise<number> {
if (this._extensionHostProcessManagers.length > 0) {
return this._extensionHostProcessManagers[0].getInspectPort();
return this._extensionHostProcessManagers[0].getInspectPort(tryEnableInspector);
}
return 0;
}