diff --git a/src/vs/workbench/api/browser/mainThreadExtensionService.ts b/src/vs/workbench/api/browser/mainThreadExtensionService.ts index 4d91e90252e..98e4d5435d4 100644 --- a/src/vs/workbench/api/browser/mainThreadExtensionService.ts +++ b/src/vs/workbench/api/browser/mainThreadExtensionService.ts @@ -121,4 +121,7 @@ export class MainThreadExtensionService implements MainThreadExtensionServiceSha } } + $onExtensionHostExit(code: number): void { + this._extensionService._onExtensionHostExit(code); + } } diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index 332778774ef..4eefe4737b6 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -605,6 +605,7 @@ export interface MainThreadExtensionServiceShape extends IDisposable { $onDidActivateExtension(extensionId: ExtensionIdentifier, startup: boolean, codeLoadingTime: number, activateCallTime: number, activateResolvedTime: number, activationEvent: string | null): void; $onExtensionActivationError(extensionId: ExtensionIdentifier, error: ExtensionActivationError): Promise; $onExtensionRuntimeError(extensionId: ExtensionIdentifier, error: SerializedError): void; + $onExtensionHostExit(code: number): void; } export interface SCMProviderFeatures { diff --git a/src/vs/workbench/api/node/extHostExtensionService.ts b/src/vs/workbench/api/node/extHostExtensionService.ts index de88988672c..a36851e85f5 100644 --- a/src/vs/workbench/api/node/extHostExtensionService.ts +++ b/src/vs/workbench/api/node/extHostExtensionService.ts @@ -640,7 +640,14 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { private _gracefulExit(code: number): void { // to give the PH process a chance to flush any outstanding console // messages to the main process, we delay the exit() by some time - setTimeout(() => this._nativeExit(code), 500); + setTimeout(() => { + if (!!this._initData.environment.extensionTestsLocationURI) { + // If extension tests are running, give the exit code to the renderer + this._mainThreadExtensionsProxy.$onExtensionHostExit(code); + return; + } + this._nativeExit(code); + }, 500); } private _startExtensionHost(): Promise { diff --git a/src/vs/workbench/services/extensions/common/extensions.ts b/src/vs/workbench/services/extensions/common/extensions.ts index 107d91e721e..0a85f0fe6f3 100644 --- a/src/vs/workbench/services/extensions/common/extensions.ts +++ b/src/vs/workbench/services/extensions/common/extensions.ts @@ -224,7 +224,7 @@ export interface IExtensionService extends ICpuProfilerTarget { _onWillActivateExtension(extensionId: ExtensionIdentifier): void; _onDidActivateExtension(extensionId: ExtensionIdentifier, startup: boolean, codeLoadingTime: number, activateCallTime: number, activateResolvedTime: number, activationEvent: string): void; _onExtensionRuntimeError(extensionId: ExtensionIdentifier, err: Error): void; - + _onExtensionHostExit(code: number): void; } export interface ICpuProfilerTarget { @@ -290,4 +290,5 @@ export class NullExtensionService implements IExtensionService { _onWillActivateExtension(_extensionId: ExtensionIdentifier): void { } _onDidActivateExtension(_extensionId: ExtensionIdentifier, _startup: boolean, _codeLoadingTime: number, _activateCallTime: number, _activateResolvedTime: number, _activationEvent: string): void { } _onExtensionRuntimeError(_extensionId: ExtensionIdentifier, _err: Error): void { } + _onExtensionHostExit(code: number): void { } } diff --git a/src/vs/workbench/services/extensions/electron-browser/extensionService.ts b/src/vs/workbench/services/extensions/electron-browser/extensionService.ts index 6f72cd9127c..5dbe8556cde 100644 --- a/src/vs/workbench/services/extensions/electron-browser/extensionService.ts +++ b/src/vs/workbench/services/extensions/electron-browser/extensionService.ts @@ -5,6 +5,7 @@ import * as nls from 'vs/nls'; import * as path from 'vs/base/common/path'; +import { ipcRenderer as ipc } from 'electron'; import { isNonEmptyArray } from 'vs/base/common/arrays'; import { Barrier, runWhenIdle } from 'vs/base/common/async'; import { Emitter, Event } from 'vs/base/common/event'; @@ -840,6 +841,10 @@ export class ExtensionService extends Disposable implements IExtensionService { this._extensionHostExtensionRuntimeErrors.get(extensionKey)!.push(err); this._onDidChangeExtensionsStatus.fire([extensionId]); } + + public _onExtensionHostExit(code: number): void { + ipc.send('vscode:exit', code); + } } registerSingleton(IExtensionService, ExtensionService); \ No newline at end of file