提交 ff683d9f 编写于 作者: J Johannes Rieken

have IHostUtils

上级 4423de89
...@@ -10,7 +10,6 @@ import { Barrier } from 'vs/base/common/async'; ...@@ -10,7 +10,6 @@ import { Barrier } from 'vs/base/common/async';
import { dispose, toDisposable } from 'vs/base/common/lifecycle'; import { dispose, toDisposable } from 'vs/base/common/lifecycle';
import { TernarySearchTree } from 'vs/base/common/map'; import { TernarySearchTree } from 'vs/base/common/map';
import { URI } from 'vs/base/common/uri'; import { URI } from 'vs/base/common/uri';
import * as pfs from 'vs/base/node/pfs';
import { ILogService } from 'vs/platform/log/common/log'; import { ILogService } from 'vs/platform/log/common/log';
import { createApiFactory, IExtensionApiFactory, NodeModuleRequireInterceptor, VSCodeNodeModuleFactory, KeytarNodeModuleFactory, OpenNodeModuleFactory } from 'vs/workbench/api/node/extHost.api.impl'; import { createApiFactory, IExtensionApiFactory, NodeModuleRequireInterceptor, VSCodeNodeModuleFactory, KeytarNodeModuleFactory, OpenNodeModuleFactory } from 'vs/workbench/api/node/extHost.api.impl';
import { ExtHostExtensionServiceShape, IEnvironment, IInitData, IMainContext, MainContext, MainThreadExtensionServiceShape, MainThreadTelemetryShape, MainThreadWorkspaceShape } from 'vs/workbench/api/common/extHost.protocol'; import { ExtHostExtensionServiceShape, IEnvironment, IInitData, IMainContext, MainContext, MainThreadExtensionServiceShape, MainThreadTelemetryShape, MainThreadWorkspaceShape } from 'vs/workbench/api/common/extHost.protocol';
...@@ -30,7 +29,6 @@ import { ExtensionIdentifier, IExtensionDescription } from 'vs/platform/extensio ...@@ -30,7 +29,6 @@ import { ExtensionIdentifier, IExtensionDescription } from 'vs/platform/extensio
import { IWorkspace } from 'vs/platform/workspace/common/workspace'; import { IWorkspace } from 'vs/platform/workspace/common/workspace';
import { Schemas } from 'vs/base/common/network'; import { Schemas } from 'vs/base/common/network';
import { withNullAsUndefined } from 'vs/base/common/types'; import { withNullAsUndefined } from 'vs/base/common/types';
import { realpath } from 'vs/base/node/extpath';
import { VSBuffer } from 'vs/base/common/buffer'; import { VSBuffer } from 'vs/base/common/buffer';
import { ISchemeTransformer } from 'vs/workbench/api/common/extHostLanguageFeatures'; import { ISchemeTransformer } from 'vs/workbench/api/common/extHostLanguageFeatures';
import { ExtensionMemento } from 'vs/workbench/api/common/extHostMemento'; import { ExtensionMemento } from 'vs/workbench/api/common/extHostMemento';
...@@ -40,11 +38,17 @@ interface ITestRunner { ...@@ -40,11 +38,17 @@ interface ITestRunner {
run(testsRoot: string, clb: (error: Error, failures?: number) => void): void; run(testsRoot: string, clb: (error: Error, failures?: number) => void): void;
} }
export interface IHostUtils {
exit(code?: number): void;
exists(path: string): Promise<boolean>;
realpath(path: string): Promise<string>;
}
export class ExtHostExtensionService implements ExtHostExtensionServiceShape { export class ExtHostExtensionService implements ExtHostExtensionServiceShape {
private static readonly WORKSPACE_CONTAINS_TIMEOUT = 7000; private static readonly WORKSPACE_CONTAINS_TIMEOUT = 7000;
private readonly _nativeExit: (code?: number) => void; private readonly _hostUtils: IHostUtils;
private readonly _initData: IInitData; private readonly _initData: IInitData;
private readonly _extHostContext: IMainContext; private readonly _extHostContext: IMainContext;
private readonly _extHostWorkspace: ExtHostWorkspace; private readonly _extHostWorkspace: ExtHostWorkspace;
...@@ -70,7 +74,7 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { ...@@ -70,7 +74,7 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape {
private _started: boolean; private _started: boolean;
constructor( constructor(
nativeExit: (code?: number) => void, hostUtils: IHostUtils,
initData: IInitData, initData: IInitData,
extHostContext: IMainContext, extHostContext: IMainContext,
extHostWorkspace: ExtHostWorkspace, extHostWorkspace: ExtHostWorkspace,
...@@ -80,7 +84,7 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { ...@@ -80,7 +84,7 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape {
schemeTransformer: ISchemeTransformer | null, schemeTransformer: ISchemeTransformer | null,
outputChannelName: string outputChannelName: string
) { ) {
this._nativeExit = nativeExit; this._hostUtils = hostUtils;
this._initData = initData; this._initData = initData;
this._extHostContext = extHostContext; this._extHostContext = extHostContext;
this._extHostWorkspace = extHostWorkspace; this._extHostWorkspace = extHostWorkspace;
...@@ -230,7 +234,7 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { ...@@ -230,7 +234,7 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape {
if (!ext.main) { if (!ext.main) {
return undefined; return undefined;
} }
return realpath(ext.extensionLocation.fsPath).then(value => tree.set(URI.file(value).fsPath, ext)); return this._hostUtils.realpath(ext.extensionLocation.fsPath).then(value => tree.set(URI.file(value).fsPath, ext));
}); });
this._extensionPathIndex = Promise.all(extensions).then(() => tree); this._extensionPathIndex = Promise.all(extensions).then(() => tree);
} }
...@@ -451,7 +455,7 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { ...@@ -451,7 +455,7 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape {
// find exact path // find exact path
for (const { uri } of workspace.folders) { for (const { uri } of workspace.folders) {
if (await pfs.exists(path.join(URI.revive(uri).fsPath, fileName))) { if (await this._hostUtils.exists(path.join(URI.revive(uri).fsPath, fileName))) {
// the file was found // the file was found
return ( return (
this._activateById(extensionId, new ExtensionActivatedByEvent(true, `workspaceContains:${fileName}`)) this._activateById(extensionId, new ExtensionActivatedByEvent(true, `workspaceContains:${fileName}`))
...@@ -561,7 +565,7 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { ...@@ -561,7 +565,7 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape {
return; return;
} }
this._nativeExit(code); this._hostUtils.exit(code);
}, 500); }, 500);
} }
...@@ -645,12 +649,12 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { ...@@ -645,12 +649,12 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape {
if (!extensionDescription) { if (!extensionDescription) {
return; return;
} }
const realpathValue = await realpath(extensionDescription.extensionLocation.fsPath); const realpathValue = await this._hostUtils.realpath(extensionDescription.extensionLocation.fsPath);
trie.delete(URI.file(realpathValue).fsPath); trie.delete(URI.file(realpathValue).fsPath);
})); }));
await Promise.all(toAdd.map(async (extensionDescription) => { await Promise.all(toAdd.map(async (extensionDescription) => {
const realpathValue = await realpath(extensionDescription.extensionLocation.fsPath); const realpathValue = await this._hostUtils.realpath(extensionDescription.extensionLocation.fsPath);
trie.set(URI.file(realpathValue).fsPath, extensionDescription); trie.set(URI.file(realpathValue).fsPath, extensionDescription);
})); }));
......
...@@ -12,7 +12,7 @@ import { IURITransformer } from 'vs/base/common/uriIpc'; ...@@ -12,7 +12,7 @@ import { IURITransformer } from 'vs/base/common/uriIpc';
import { IMessagePassingProtocol } from 'vs/base/parts/ipc/common/ipc'; import { IMessagePassingProtocol } from 'vs/base/parts/ipc/common/ipc';
import { IInitData, MainContext, MainThreadConsoleShape } from 'vs/workbench/api/common/extHost.protocol'; import { IInitData, MainContext, MainThreadConsoleShape } from 'vs/workbench/api/common/extHost.protocol';
import { ExtHostConfiguration } from 'vs/workbench/api/common/extHostConfiguration'; import { ExtHostConfiguration } from 'vs/workbench/api/common/extHostConfiguration';
import { ExtHostExtensionService } from 'vs/workbench/api/node/extHostExtensionService'; import { ExtHostExtensionService, IHostUtils } from 'vs/workbench/api/node/extHostExtensionService';
import { ExtHostLogService } from 'vs/workbench/api/common/extHostLogService'; import { ExtHostLogService } from 'vs/workbench/api/common/extHostLogService';
import { ExtHostWorkspace } from 'vs/workbench/api/common/extHostWorkspace'; import { ExtHostWorkspace } from 'vs/workbench/api/common/extHostWorkspace';
import { RPCProtocol } from 'vs/workbench/services/extensions/common/rpcProtocol'; import { RPCProtocol } from 'vs/workbench/services/extensions/common/rpcProtocol';
...@@ -40,7 +40,7 @@ export interface ILogServiceFn { ...@@ -40,7 +40,7 @@ export interface ILogServiceFn {
export class ExtensionHostMain { export class ExtensionHostMain {
private _isTerminating: boolean; private _isTerminating: boolean;
private readonly _exitFn: IExitFn; private readonly _hostUtils: IHostUtils;
private readonly _extensionService: ExtHostExtensionService; private readonly _extensionService: ExtHostExtensionService;
private readonly _extHostLogService: ExtHostLogService; private readonly _extHostLogService: ExtHostLogService;
private disposables: IDisposable[] = []; private disposables: IDisposable[] = [];
...@@ -50,15 +50,15 @@ export class ExtensionHostMain { ...@@ -50,15 +50,15 @@ export class ExtensionHostMain {
constructor( constructor(
protocol: IMessagePassingProtocol, protocol: IMessagePassingProtocol,
initData: IInitData, initData: IInitData,
exitFn: IExitFn, hostUtils: IHostUtils,
consolePatchFn: IConsolePatchFn, consolePatchFn: IConsolePatchFn,
logServiceFn: ILogServiceFn, logServiceFn: ILogServiceFn,
uriTransformer: IURITransformer | null, uriTransformer: IURITransformer | null,
schemeTransformer: ISchemeTransformer | null, schemeTransformer: ISchemeTransformer | null,
outputChannelName: string outputChannelName: string,
) { ) {
this._isTerminating = false; this._isTerminating = false;
this._exitFn = exitFn; this._hostUtils = hostUtils;
const rpcProtocol = new RPCProtocol(protocol, null, uriTransformer); const rpcProtocol = new RPCProtocol(protocol, null, uriTransformer);
// ensure URIs are transformed and revived // ensure URIs are transformed and revived
...@@ -79,7 +79,7 @@ export class ExtensionHostMain { ...@@ -79,7 +79,7 @@ export class ExtensionHostMain {
const extHostConfiguraiton = new ExtHostConfiguration(rpcProtocol.getProxy(MainContext.MainThreadConfiguration), extHostWorkspace); const extHostConfiguraiton = new ExtHostConfiguration(rpcProtocol.getProxy(MainContext.MainThreadConfiguration), extHostWorkspace);
this._extensionService = new ExtHostExtensionService( this._extensionService = new ExtHostExtensionService(
exitFn, hostUtils,
initData, initData,
rpcProtocol, rpcProtocol,
extHostWorkspace, extHostWorkspace,
...@@ -141,7 +141,7 @@ export class ExtensionHostMain { ...@@ -141,7 +141,7 @@ export class ExtensionHostMain {
// Give extensions 1 second to wrap up any async dispose, then exit in at most 4 seconds // Give extensions 1 second to wrap up any async dispose, then exit in at most 4 seconds
setTimeout(() => { setTimeout(() => {
Promise.race([timeout(4000), extensionsDeactivated]).finally(() => this._exitFn()); Promise.race([timeout(4000), extensionsDeactivated]).finally(() => this._hostUtils.exit());
}, 1000); }, 1000);
} }
......
...@@ -20,6 +20,9 @@ import { createSpdLogService } from 'vs/platform/log/node/spdlogService'; ...@@ -20,6 +20,9 @@ import { createSpdLogService } from 'vs/platform/log/node/spdlogService';
import { ExtensionHostLogFileName } from 'vs/workbench/services/extensions/common/extensions'; import { ExtensionHostLogFileName } from 'vs/workbench/services/extensions/common/extensions';
import { ISchemeTransformer } from 'vs/workbench/api/common/extHostLanguageFeatures'; import { ISchemeTransformer } from 'vs/workbench/api/common/extHostLanguageFeatures';
import { IURITransformer } from 'vs/base/common/uriIpc'; import { IURITransformer } from 'vs/base/common/uriIpc';
import { exists } from 'vs/base/node/pfs';
import { realpath } from 'vs/base/node/extpath';
import { IHostUtils } from 'vs/workbench/api/node/extHostExtensionService';
// With Electron 2.x and node.js 8.x the "natives" module // With Electron 2.x and node.js 8.x the "natives" module
// can cause a native crash (see https://github.com/nodejs/node/issues/19891 and // can cause a native crash (see https://github.com/nodejs/node/issues/19891 and
...@@ -270,10 +273,19 @@ createExtHostProtocol().then(protocol => { ...@@ -270,10 +273,19 @@ createExtHostProtocol().then(protocol => {
const schemeTransformer: ISchemeTransformer | null = null; const schemeTransformer: ISchemeTransformer | null = null;
const outputChannelName = nls.localize('extension host Log', "Extension Host"); const outputChannelName = nls.localize('extension host Log', "Extension Host");
// host abstraction
const hostUtils = new class NodeHost implements IHostUtils {
exit(code: number) { nativeExit(code); }
exists(path: string) { return exists(path); }
realpath(path: string) { return realpath(path); }
};
const extensionHostMain = new ExtensionHostMain( const extensionHostMain = new ExtensionHostMain(
renderer.protocol, renderer.protocol,
initData, initData,
nativeExit, hostUtils,
patchPatchedConsole, patchPatchedConsole,
createLogService, createLogService,
uriTransformer, uriTransformer,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册