diff --git a/src/vs/workbench/api/common/extHostCommands.ts b/src/vs/workbench/api/common/extHostCommands.ts index 6576c56192b..3ab2fdbf2fc 100644 --- a/src/vs/workbench/api/common/extHostCommands.ts +++ b/src/vs/workbench/api/common/extHostCommands.ts @@ -8,7 +8,7 @@ import { ICommandHandlerDescription, ICommandEvent } from 'vs/platform/commands/ import * as extHostTypes from 'vs/workbench/api/common/extHostTypes'; import * as extHostTypeConverter from 'vs/workbench/api/common/extHostTypeConverters'; import { cloneAndChange } from 'vs/base/common/objects'; -import { MainContext, MainThreadCommandsShape, ExtHostCommandsShape, ObjectIdentifier, IMainContext, ICommandDto } from './extHost.protocol'; +import { MainContext, MainThreadCommandsShape, ExtHostCommandsShape, ObjectIdentifier, ICommandDto } from './extHost.protocol'; import { isNonEmptyArray } from 'vs/base/common/arrays'; import * as modes from 'vs/editor/common/modes'; import * as vscode from 'vscode'; @@ -19,6 +19,8 @@ import { Position } from 'vs/editor/common/core/position'; import { URI } from 'vs/base/common/uri'; import { Event, Emitter } from 'vs/base/common/event'; import { DisposableStore, toDisposable } from 'vs/base/common/lifecycle'; +import { IExtHostContextService } from 'vs/workbench/api/common/extHostContextService'; +import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; interface CommandHandler { callback: Function; @@ -32,6 +34,8 @@ export interface ArgumentProcessor { export class ExtHostCommands implements ExtHostCommandsShape { + readonly _serviceBrand: any; + private readonly _onDidExecuteCommand: Emitter; readonly onDidExecuteCommand: Event; @@ -42,10 +46,10 @@ export class ExtHostCommands implements ExtHostCommandsShape { private readonly _argumentProcessors: ArgumentProcessor[]; constructor( - mainContext: IMainContext, - logService: ILogService + @IExtHostContextService extHostContext: IExtHostContextService, + @ILogService logService: ILogService ) { - this._proxy = mainContext.getProxy(MainContext.MainThreadCommands); + this._proxy = extHostContext.rpc.getProxy(MainContext.MainThreadCommands); this._onDidExecuteCommand = new Emitter({ onFirstListenerDidAdd: () => this._proxy.$registerCommandListener(), onLastListenerRemove: () => this._proxy.$unregisterCommandListener(), @@ -282,3 +286,6 @@ export class CommandsConverter { } } + +export interface IExtHostCommands extends ExtHostCommands { } +export const IExtHostCommands = createDecorator('IExtHostCommands'); diff --git a/src/vs/workbench/api/common/extHostConfiguration.ts b/src/vs/workbench/api/common/extHostConfiguration.ts index 4f19d1f59e4..32f8db76d64 100644 --- a/src/vs/workbench/api/common/extHostConfiguration.ts +++ b/src/vs/workbench/api/common/extHostConfiguration.ts @@ -7,8 +7,8 @@ import { mixin, deepClone } from 'vs/base/common/objects'; import { URI } from 'vs/base/common/uri'; import { Event, Emitter } from 'vs/base/common/event'; import * as vscode from 'vscode'; -import { ExtHostWorkspace } from 'vs/workbench/api/common/extHostWorkspace'; -import { ExtHostConfigurationShape, MainThreadConfigurationShape, IWorkspaceConfigurationChangeEventData, IConfigurationInitData } from './extHost.protocol'; +import { ExtHostWorkspace, IExtHostWorkspace } from 'vs/workbench/api/common/extHostWorkspace'; +import { ExtHostConfigurationShape, MainThreadConfigurationShape, IWorkspaceConfigurationChangeEventData, IConfigurationInitData, MainContext } from './extHost.protocol'; import { ConfigurationTarget as ExtHostConfigurationTarget } from './extHostTypes'; import { IConfigurationData, ConfigurationTarget, IConfigurationModel } from 'vs/platform/configuration/common/configuration'; import { Configuration, ConfigurationChangeEvent, ConfigurationModel } from 'vs/platform/configuration/common/configurationModels'; @@ -18,6 +18,8 @@ import { ConfigurationScope, OVERRIDE_PROPERTY_PATTERN } from 'vs/platform/confi import { isObject } from 'vs/base/common/types'; import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; import { Barrier } from 'vs/base/common/async'; +import { IExtHostContextService } from 'vs/workbench/api/common/extHostContextService'; +import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; function lookUp(tree: any, key: string) { if (key) { @@ -40,13 +42,18 @@ type ConfigurationInspect = { export class ExtHostConfiguration implements ExtHostConfigurationShape { + readonly _serviceBrand: any; + private readonly _proxy: MainThreadConfigurationShape; private readonly _extHostWorkspace: ExtHostWorkspace; private readonly _barrier: Barrier; private _actual: ExtHostConfigProvider | null; - constructor(proxy: MainThreadConfigurationShape, extHostWorkspace: ExtHostWorkspace) { - this._proxy = proxy; + constructor( + @IExtHostContextService extHostContext: IExtHostContextService, + @IExtHostWorkspace extHostWorkspace: IExtHostWorkspace + ) { + this._proxy = extHostContext.rpc.getProxy(MainContext.MainThreadConfiguration); this._extHostWorkspace = extHostWorkspace; this._barrier = new Barrier(); this._actual = null; @@ -274,3 +281,6 @@ export class ExtHostConfigProvider { return new ConfigurationModel(model.contents, model.keys, model.overrides).freeze(); } } + +export const IExtHostConfiguration = createDecorator('IExtHostConfiguration'); +export interface IExtHostConfiguration extends ExtHostConfiguration { } diff --git a/src/vs/workbench/api/common/extHostContextService.ts b/src/vs/workbench/api/common/extHostContextService.ts new file mode 100644 index 00000000000..77094e73009 --- /dev/null +++ b/src/vs/workbench/api/common/extHostContextService.ts @@ -0,0 +1,24 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { IMainContext, IInitData } from './extHost.protocol'; +import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; + +export const IExtHostContextService = createDecorator('IExtHostContextService'); + +export interface IExtHostContextService { + _serviceBrand: undefined; + + readonly rpc: IMainContext; + readonly initData: IInitData; +} + +export class ExtHostContextService implements IExtHostContextService { + _serviceBrand: any; + constructor( + readonly rpc: IMainContext, + readonly initData: IInitData + ) { } +} diff --git a/src/vs/workbench/api/common/extHostDecorations.ts b/src/vs/workbench/api/common/extHostDecorations.ts index 0c176afc362..6d964143779 100644 --- a/src/vs/workbench/api/common/extHostDecorations.ts +++ b/src/vs/workbench/api/common/extHostDecorations.ts @@ -5,26 +5,31 @@ import * as vscode from 'vscode'; import { URI } from 'vs/base/common/uri'; -import { MainContext, IMainContext, ExtHostDecorationsShape, MainThreadDecorationsShape, DecorationData, DecorationRequest, DecorationReply } from 'vs/workbench/api/common/extHost.protocol'; +import { MainContext, ExtHostDecorationsShape, MainThreadDecorationsShape, DecorationData, DecorationRequest, DecorationReply } from 'vs/workbench/api/common/extHost.protocol'; import { Disposable } from 'vs/workbench/api/common/extHostTypes'; import { CancellationToken } from 'vs/base/common/cancellation'; import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; import { asArray } from 'vs/base/common/arrays'; +import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; +import { IExtHostContextService } from 'vs/workbench/api/common/extHostContextService'; interface ProviderData { provider: vscode.DecorationProvider; extensionId: ExtensionIdentifier; } -export class ExtHostDecorations implements ExtHostDecorationsShape { +export class ExtHostDecorations implements IExtHostDecorations { private static _handlePool = 0; + readonly _serviceBrand: undefined; private readonly _provider = new Map(); private readonly _proxy: MainThreadDecorationsShape; - constructor(mainContext: IMainContext) { - this._proxy = mainContext.getProxy(MainContext.MainThreadDecorations); + constructor( + @IExtHostContextService contextService: IExtHostContextService, + ) { + this._proxy = contextService.rpc.getProxy(MainContext.MainThreadDecorations); } registerDecorationProvider(provider: vscode.DecorationProvider, extensionId: ExtensionIdentifier): vscode.Disposable { @@ -70,3 +75,6 @@ export class ExtHostDecorations implements ExtHostDecorationsShape { }); } } + +export const IExtHostDecorations = createDecorator('IExtHostDecorations'); +export interface IExtHostDecorations extends ExtHostDecorations, ExtHostDecorationsShape { } diff --git a/src/vs/workbench/api/common/extHostDocumentsAndEditors.ts b/src/vs/workbench/api/common/extHostDocumentsAndEditors.ts index 98002f78c71..0f31898cb3a 100644 --- a/src/vs/workbench/api/common/extHostDocumentsAndEditors.ts +++ b/src/vs/workbench/api/common/extHostDocumentsAndEditors.ts @@ -7,14 +7,18 @@ import * as assert from 'vs/base/common/assert'; import { Emitter, Event } from 'vs/base/common/event'; import { dispose } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; -import { ExtHostDocumentsAndEditorsShape, IDocumentsAndEditorsDelta, IMainContext, MainContext } from 'vs/workbench/api/common/extHost.protocol'; +import { ExtHostDocumentsAndEditorsShape, IDocumentsAndEditorsDelta, MainContext } from 'vs/workbench/api/common/extHost.protocol'; import { ExtHostDocumentData } from 'vs/workbench/api/common/extHostDocumentData'; import { ExtHostTextEditor } from 'vs/workbench/api/common/extHostTextEditor'; import * as typeConverters from 'vs/workbench/api/common/extHostTypeConverters'; import { Disposable } from 'vs/workbench/api/common/extHostTypes'; +import { IExtHostContextService } from 'vs/workbench/api/common/extHostContextService'; +import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; export class ExtHostDocumentsAndEditors implements ExtHostDocumentsAndEditorsShape { + readonly _serviceBrand: any; + private _disposables: Disposable[] = []; private _activeEditorId: string | null = null; @@ -33,7 +37,7 @@ export class ExtHostDocumentsAndEditors implements ExtHostDocumentsAndEditorsSha readonly onDidChangeActiveTextEditor: Event = this._onDidChangeActiveTextEditor.event; constructor( - private readonly _mainContext: IMainContext, + @IExtHostContextService private readonly _ctx: IExtHostContextService, ) { } dispose() { @@ -64,7 +68,7 @@ export class ExtHostDocumentsAndEditors implements ExtHostDocumentsAndEditorsSha assert.ok(!this._documents.has(resource.toString()), `document '${resource} already exists!'`); const documentData = new ExtHostDocumentData( - this._mainContext.getProxy(MainContext.MainThreadDocuments), + this._ctx.rpc.getProxy(MainContext.MainThreadDocuments), resource, data.lines, data.EOL, @@ -95,7 +99,7 @@ export class ExtHostDocumentsAndEditors implements ExtHostDocumentsAndEditorsSha const documentData = this._documents.get(resource.toString())!; const editor = new ExtHostTextEditor( - this._mainContext.getProxy(MainContext.MainThreadTextEditors), + this._ctx.rpc.getProxy(MainContext.MainThreadTextEditors), data.id, documentData, data.selections.map(typeConverters.Selection.to), @@ -159,3 +163,6 @@ export class ExtHostDocumentsAndEditors implements ExtHostDocumentsAndEditorsSha return result; } } + +export interface IExtHostDocumentsAndEditors extends ExtHostDocumentsAndEditors { } +export const IExtHostDocumentsAndEditors = createDecorator('IExtHostDocumentsAndEditors'); diff --git a/src/vs/workbench/api/common/extHostOutput.ts b/src/vs/workbench/api/common/extHostOutput.ts index 3580d0e6679..91466ccaf92 100644 --- a/src/vs/workbench/api/common/extHostOutput.ts +++ b/src/vs/workbench/api/common/extHostOutput.ts @@ -3,12 +3,14 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { MainContext, MainThreadOutputServiceShape, IMainContext, ExtHostOutputServiceShape } from './extHost.protocol'; +import { MainContext, MainThreadOutputServiceShape, ExtHostOutputServiceShape } from './extHost.protocol'; import * as vscode from 'vscode'; import { URI } from 'vs/base/common/uri'; import { Event, Emitter } from 'vs/base/common/event'; -import { Disposable, IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { Disposable, MutableDisposable } from 'vs/base/common/lifecycle'; import { VSBuffer } from 'vs/base/common/buffer'; +import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; +import { IExtHostContextService } from 'vs/workbench/api/common/extHostContextService'; export abstract class AbstractExtHostOutputChannel extends Disposable implements vscode.OutputChannel { @@ -106,38 +108,50 @@ class ExtHostLogFileOutputChannel extends AbstractExtHostOutputChannel { } } -export interface IOutputChannelFactory { - createOutputChannel(name: string, logsLocation: URI, proxy: MainThreadOutputServiceShape): Promise; -} +export class LazyOutputChannel implements vscode.OutputChannel { -export const PushOutputChannelFactory = new class implements IOutputChannelFactory { - async createOutputChannel(name: string, _logsLocation: URI, proxy: MainThreadOutputServiceShape): Promise { - return new ExtHostPushOutputChannel(name, proxy); + constructor( + readonly name: string, + private readonly _channel: Promise + ) { } + + append(value: string): void { + this._channel.then(channel => channel.append(value)); } -}; + appendLine(value: string): void { + this._channel.then(channel => channel.appendLine(value)); + } + clear(): void { + this._channel.then(channel => channel.clear()); + } + show(columnOrPreserveFocus?: vscode.ViewColumn | boolean, preserveFocus?: boolean): void { + this._channel.then(channel => channel.show(columnOrPreserveFocus, preserveFocus)); + } + hide(): void { + this._channel.then(channel => channel.hide()); + } + dispose(): void { + this._channel.then(channel => channel.dispose()); + } +} export class ExtHostOutputService implements ExtHostOutputServiceShape { - private readonly _factory: IOutputChannelFactory; - private readonly _logsLocation: URI; - private readonly _proxy: MainThreadOutputServiceShape; - private readonly _channels: Map = new Map(); - private _visibleChannelDisposable?: IDisposable; + readonly _serviceBrand: any; - constructor(factory: IOutputChannelFactory, logsLocation: URI, mainContext: IMainContext) { - this._factory = factory; - this._logsLocation = logsLocation; - this._proxy = mainContext.getProxy(MainContext.MainThreadOutputService); + protected readonly _proxy: MainThreadOutputServiceShape; + protected readonly _channels: Map = new Map(); + protected readonly _visibleChannelDisposable = new MutableDisposable(); + + constructor(@IExtHostContextService extHostContext: IExtHostContextService) { + this._proxy = extHostContext.rpc.getProxy(MainContext.MainThreadOutputService); } $setVisibleChannel(channelId: string): void { - if (this._visibleChannelDisposable) { - this._visibleChannelDisposable = dispose(this._visibleChannelDisposable); - } if (channelId) { const channel = this._channels.get(channelId); if (channel) { - this._visibleChannelDisposable = channel.onDidAppend(() => channel.update()); + this._visibleChannelDisposable.value = channel.onDidAppend(() => channel.update()); } } } @@ -146,33 +160,8 @@ export class ExtHostOutputService implements ExtHostOutputServiceShape { name = name.trim(); if (!name) { throw new Error('illegal argument `name`. must not be falsy'); - } else { - const extHostOutputChannel = this._factory.createOutputChannel(name, this._logsLocation, this._proxy); - extHostOutputChannel.then(channel => channel._id.then(id => this._channels.set(id, channel))); - return { - get name(): string { - return name; - }, - append(value: string): void { - extHostOutputChannel.then(channel => channel.append(value)); - }, - appendLine(value: string): void { - extHostOutputChannel.then(channel => channel.appendLine(value)); - }, - clear(): void { - extHostOutputChannel.then(channel => channel.clear()); - }, - show(columnOrPreserveFocus?: vscode.ViewColumn | boolean, preserveFocus?: boolean): void { - extHostOutputChannel.then(channel => channel.show(columnOrPreserveFocus, preserveFocus)); - }, - hide(): void { - extHostOutputChannel.then(channel => channel.hide()); - }, - dispose(): void { - extHostOutputChannel.then(channel => channel.dispose()); - } - }; } + return new ExtHostPushOutputChannel(name, this._proxy); } createOutputChannelFromLogFile(name: string, file: URI): vscode.OutputChannel { @@ -186,3 +175,6 @@ export class ExtHostOutputService implements ExtHostOutputServiceShape { return new ExtHostLogFileOutputChannel(name, file, this._proxy); } } + +export interface IExtHostOutputService extends ExtHostOutputService { } +export const IExtHostOutputService = createDecorator('IExtHostOutputService'); diff --git a/src/vs/workbench/api/common/extHostTerminalService.ts b/src/vs/workbench/api/common/extHostTerminalService.ts new file mode 100644 index 00000000000..9a0552a89ba --- /dev/null +++ b/src/vs/workbench/api/common/extHostTerminalService.ts @@ -0,0 +1,30 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as vscode from 'vscode'; +import { Event } from 'vs/base/common/event'; +import { ExtHostTerminalServiceShape } from 'vs/workbench/api/common/extHost.protocol'; +import { ExtHostConfigProvider } from 'vs/workbench/api/common/extHostConfiguration'; +import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; + +export interface IExtHostTerminalService extends ExtHostTerminalServiceShape { + + activeTerminal: vscode.Terminal | undefined; + terminals: vscode.Terminal[]; + + onDidCloseTerminal: Event; + onDidOpenTerminal: Event; + onDidChangeActiveTerminal: Event; + onDidChangeTerminalDimensions: Event; + onDidWriteTerminalData: Event; + + createTerminal(name?: string, shellPath?: string, shellArgs?: string[] | string): vscode.Terminal; + createTerminalFromOptions(options: vscode.TerminalOptions): vscode.Terminal; + createExtensionTerminal(options: vscode.ExtensionTerminalOptions): vscode.Terminal; + attachPtyToTerminal(id: number, pty: vscode.Pseudoterminal): void; + getDefaultShell(configProvider: ExtHostConfigProvider): string; +} + +export const IExtHostTerminalService = createDecorator('IExtHostTerminalService'); diff --git a/src/vs/workbench/api/common/extHostWorkspace.ts b/src/vs/workbench/api/common/extHostWorkspace.ts index 3c176107270..fa066e18686 100644 --- a/src/vs/workbench/api/common/extHostWorkspace.ts +++ b/src/vs/workbench/api/common/extHostWorkspace.ts @@ -20,11 +20,13 @@ import { Workspace, WorkspaceFolder } from 'vs/platform/workspace/common/workspa import { Range, RelativePattern } from 'vs/workbench/api/common/extHostTypes'; import { ITextQueryBuilderOptions } from 'vs/workbench/contrib/search/common/queryBuilder'; import * as vscode from 'vscode'; -import { ExtHostWorkspaceShape, IWorkspaceData, MainThreadMessageServiceShape, MainThreadWorkspaceShape, IMainContext, MainContext, IStaticWorkspaceData } from './extHost.protocol'; +import { ExtHostWorkspaceShape, IWorkspaceData, MainThreadMessageServiceShape, MainThreadWorkspaceShape, MainContext } from './extHost.protocol'; import { ExtensionIdentifier, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import { Barrier } from 'vs/base/common/async'; import { Schemas } from 'vs/base/common/network'; import { withUndefinedAsNull } from 'vs/base/common/types'; +import { IExtHostContextService } from 'vs/workbench/api/common/extHostContextService'; +import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; export interface IExtHostWorkspaceProvider { getWorkspaceFolder2(uri: vscode.Uri, resolveParent?: boolean): Promise; @@ -153,6 +155,8 @@ class ExtHostWorkspaceImpl extends Workspace { export class ExtHostWorkspace implements ExtHostWorkspaceShape, IExtHostWorkspaceProvider { + readonly _serviceBrand: any; + private readonly _onDidChangeWorkspace = new Emitter(); readonly onDidChangeWorkspace: Event = this._onDidChangeWorkspace.event; @@ -169,20 +173,20 @@ export class ExtHostWorkspace implements ExtHostWorkspaceShape, IExtHostWorkspac private readonly _activeSearchCallbacks: ((match: IRawFileMatch2) => any)[] = []; constructor( - mainContext: IMainContext, - logService: ILogService, - data?: IStaticWorkspaceData + @IExtHostContextService extHostContext: IExtHostContextService, + @ILogService logService: ILogService, ) { this._logService = logService; this._requestIdProvider = new Counter(); this._barrier = new Barrier(); - this._proxy = mainContext.getProxy(MainContext.MainThreadWorkspace); - this._messageService = mainContext.getProxy(MainContext.MainThreadMessageService); + this._proxy = extHostContext.rpc.getProxy(MainContext.MainThreadWorkspace); + this._messageService = extHostContext.rpc.getProxy(MainContext.MainThreadMessageService); + const data = extHostContext.initData.workspace; this._confirmedWorkspace = data ? new ExtHostWorkspaceImpl(data.id, data.name, [], data.configuration ? URI.revive(data.configuration) : null, !!data.isUntitled) : undefined; } - $initializeWorkspace(data: IWorkspaceData): void { + $initializeWorkspace(data: IWorkspaceData | null): void { this.$acceptWorkspaceData(data); this._barrier.open(); } @@ -389,7 +393,7 @@ export class ExtHostWorkspace implements ExtHostWorkspaceShape, IExtHostWorkspac } } - $acceptWorkspaceData(data: IWorkspaceData): void { + $acceptWorkspaceData(data: IWorkspaceData | null): void { const { workspace, added, removed } = ExtHostWorkspaceImpl.toExtHostWorkspace(data, this._confirmedWorkspace, this._unconfirmedWorkspace); @@ -545,3 +549,6 @@ export class ExtHostWorkspace implements ExtHostWorkspaceShape, IExtHostWorkspac return this._proxy.$resolveProxy(url); } } + +export const IExtHostWorkspace = createDecorator('IExtHostWorkspace'); +export interface IExtHostWorkspace extends ExtHostWorkspace, ExtHostWorkspaceShape, IExtHostWorkspaceProvider { } diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index acf5138be85..d9ceabda83b 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -18,17 +18,16 @@ import * as files from 'vs/platform/files/common/files'; import { ExtHostContext, IInitData, IMainContext, MainContext } from 'vs/workbench/api/common/extHost.protocol'; import { ExtHostApiCommands } from 'vs/workbench/api/common/extHostApiCommands'; import { ExtHostClipboard } from 'vs/workbench/api/common/extHostClipboard'; -import { ExtHostCommands } from 'vs/workbench/api/common/extHostCommands'; +import { IExtHostCommands } from 'vs/workbench/api/common/extHostCommands'; import { ExtHostComments } from 'vs/workbench/api/common/extHostComments'; import { ExtHostConfiguration, ExtHostConfigProvider } from 'vs/workbench/api/common/extHostConfiguration'; import { ExtHostDebugService } from 'vs/workbench/api/node/extHostDebugService'; -import { ExtHostDecorations } from 'vs/workbench/api/common/extHostDecorations'; import { ExtHostDiagnostics } from 'vs/workbench/api/common/extHostDiagnostics'; import { ExtHostDialogs } from 'vs/workbench/api/common/extHostDialogs'; import { ExtHostDocumentContentProvider } from 'vs/workbench/api/common/extHostDocumentContentProviders'; import { ExtHostDocumentSaveParticipant } from 'vs/workbench/api/common/extHostDocumentSaveParticipant'; import { ExtHostDocuments } from 'vs/workbench/api/common/extHostDocuments'; -import { ExtHostDocumentsAndEditors } from 'vs/workbench/api/common/extHostDocumentsAndEditors'; +import { IExtHostDocumentsAndEditors } from 'vs/workbench/api/common/extHostDocumentsAndEditors'; import { ExtensionActivatedByAPI } from 'vs/workbench/api/common/extHostExtensionActivator'; import { ExtHostExtensionService } from 'vs/workbench/api/node/extHostExtensionService'; import { ExtHostFileSystem } from 'vs/workbench/api/common/extHostFileSystem'; @@ -37,8 +36,7 @@ import { ExtHostLanguageFeatures } from 'vs/workbench/api/common/extHostLanguage import { ExtHostLanguages } from 'vs/workbench/api/common/extHostLanguages'; import { ExtHostLogService } from 'vs/workbench/api/common/extHostLogService'; import { ExtHostMessageService } from 'vs/workbench/api/common/extHostMessageService'; -import { ExtHostOutputService } from 'vs/workbench/api/common/extHostOutput'; -import { LogOutputChannelFactory } from 'vs/workbench/api/node/extHostOutputService'; +import { IExtHostOutputService } from 'vs/workbench/api/common/extHostOutput'; import { ExtHostProgress } from 'vs/workbench/api/common/extHostProgress'; import { ExtHostQuickOpen } from 'vs/workbench/api/common/extHostQuickOpen'; import { ExtHostSCM } from 'vs/workbench/api/common/extHostSCM'; @@ -46,7 +44,7 @@ import { ExtHostSearch, registerEHSearchProviders } from 'vs/workbench/api/node/ import { ExtHostStatusBar } from 'vs/workbench/api/common/extHostStatusBar'; import { ExtHostStorage } from 'vs/workbench/api/common/extHostStorage'; import { ExtHostTask } from 'vs/workbench/api/node/extHostTask'; -import { ExtHostTerminalService } from 'vs/workbench/api/node/extHostTerminalService'; +import { IExtHostTerminalService } from 'vs/workbench/api/common/extHostTerminalService'; import { ExtHostEditors } from 'vs/workbench/api/common/extHostTextEditors'; import { ExtHostTreeViews } from 'vs/workbench/api/common/extHostTreeViews'; import { ExtHostDownloadService } from 'vs/workbench/api/node/extHostDownloadService'; @@ -68,10 +66,9 @@ import { Schemas } from 'vs/base/common/network'; import { IURITransformer } from 'vs/base/common/uriIpc'; import { ExtHostEditorInsets } from 'vs/workbench/api/common/extHostCodeInsets'; import { ExtHostLabelService } from 'vs/workbench/api/common/extHostLabelService'; -import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; -import { InstantiationService } from 'vs/platform/instantiation/common/instantiationService'; -import { getSingletonServiceDescriptors } from 'vs/platform/instantiation/common/extensions'; import { getRemoteName } from 'vs/platform/remote/common/remoteHosts'; +import { ServicesAccessor, IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { IExtHostDecorations } from 'vs/workbench/api/common/extHostDecorations'; export interface IExtensionApiFactory { (extension: IExtensionDescription, registry: ExtensionDescriptionRegistry, configProvider: ExtHostConfigProvider): typeof vscode; @@ -89,6 +86,7 @@ function proposedApiFunction(extension: IExtensionDescription, fn: T): T { * This method instantiates and returns the extension API surface */ export function createApiFactory( + accessor: ServicesAccessor, initData: IInitData, rpcProtocol: IMainContext, extHostWorkspace: ExtHostWorkspace, @@ -99,21 +97,20 @@ export function createApiFactory( uriTransformer: IURITransformer | null ): IExtensionApiFactory { - // bootstrap services - const services = new ServiceCollection(...getSingletonServiceDescriptors()); - const instaService = new InstantiationService(services); + // services + const instaService = accessor.get(IInstantiationService); // Addressable instances rpcProtocol.set(ExtHostContext.ExtHostLogService, extHostLogService); - const extHostDecorations = rpcProtocol.set(ExtHostContext.ExtHostDecorations, new ExtHostDecorations(rpcProtocol)); + const extHostDecorations = rpcProtocol.set(ExtHostContext.ExtHostDecorations, accessor.get(IExtHostDecorations)); const extHostWebviews = rpcProtocol.set(ExtHostContext.ExtHostWebviews, new ExtHostWebviews(rpcProtocol, initData.environment)); const extHostUrls = rpcProtocol.set(ExtHostContext.ExtHostUrls, new ExtHostUrls(rpcProtocol)); - const extHostDocumentsAndEditors = rpcProtocol.set(ExtHostContext.ExtHostDocumentsAndEditors, new ExtHostDocumentsAndEditors(rpcProtocol)); + const extHostDocumentsAndEditors = rpcProtocol.set(ExtHostContext.ExtHostDocumentsAndEditors, accessor.get(IExtHostDocumentsAndEditors)); const extHostDocuments = rpcProtocol.set(ExtHostContext.ExtHostDocuments, new ExtHostDocuments(rpcProtocol, extHostDocumentsAndEditors)); const extHostDocumentContentProviders = rpcProtocol.set(ExtHostContext.ExtHostDocumentContentProviders, new ExtHostDocumentContentProvider(rpcProtocol, extHostDocumentsAndEditors, extHostLogService)); const extHostDocumentSaveParticipant = rpcProtocol.set(ExtHostContext.ExtHostDocumentSaveParticipant, new ExtHostDocumentSaveParticipant(extHostLogService, extHostDocuments, rpcProtocol.getProxy(MainContext.MainThreadTextEditors))); const extHostEditors = rpcProtocol.set(ExtHostContext.ExtHostEditors, new ExtHostEditors(rpcProtocol, extHostDocumentsAndEditors)); - const extHostCommands = rpcProtocol.set(ExtHostContext.ExtHostCommands, new ExtHostCommands(rpcProtocol, extHostLogService)); + const extHostCommands = rpcProtocol.set(ExtHostContext.ExtHostCommands, accessor.get(IExtHostCommands)); const extHostTreeViews = rpcProtocol.set(ExtHostContext.ExtHostTreeViews, new ExtHostTreeViews(rpcProtocol.getProxy(MainContext.MainThreadTreeViews), extHostCommands, extHostLogService)); rpcProtocol.set(ExtHostContext.ExtHostDownloadService, new ExtHostDownloadService(rpcProtocol.getProxy(MainContext.MainThreadDownloadService), extHostCommands)); rpcProtocol.set(ExtHostContext.ExtHostWorkspace, extHostWorkspace); @@ -124,7 +121,7 @@ export function createApiFactory( const extHostFileSystem = rpcProtocol.set(ExtHostContext.ExtHostFileSystem, new ExtHostFileSystem(rpcProtocol, extHostLanguageFeatures)); const extHostFileSystemEvent = rpcProtocol.set(ExtHostContext.ExtHostFileSystemEventService, new ExtHostFileSystemEventService(rpcProtocol, extHostDocumentsAndEditors)); const extHostQuickOpen = rpcProtocol.set(ExtHostContext.ExtHostQuickOpen, new ExtHostQuickOpen(rpcProtocol, extHostWorkspace, extHostCommands)); - const extHostTerminalService = rpcProtocol.set(ExtHostContext.ExtHostTerminalService, new ExtHostTerminalService(rpcProtocol, extHostConfiguration, extHostWorkspace, extHostDocumentsAndEditors, extHostLogService)); + const extHostTerminalService = rpcProtocol.set(ExtHostContext.ExtHostTerminalService, accessor.get(IExtHostTerminalService)); const extHostDebugService = rpcProtocol.set(ExtHostContext.ExtHostDebugService, instaService.createInstance(ExtHostDebugService, rpcProtocol, extHostWorkspace, extensionService, extHostDocumentsAndEditors, extHostConfiguration, extHostTerminalService, extHostCommands)); const extHostSCM = rpcProtocol.set(ExtHostContext.ExtHostSCM, new ExtHostSCM(rpcProtocol, extHostCommands, extHostLogService)); const extHostComment = rpcProtocol.set(ExtHostContext.ExtHostComments, new ExtHostComments(rpcProtocol, extHostCommands, extHostDocuments)); @@ -133,7 +130,7 @@ export function createApiFactory( const extHostWindow = rpcProtocol.set(ExtHostContext.ExtHostWindow, new ExtHostWindow(rpcProtocol)); rpcProtocol.set(ExtHostContext.ExtHostExtensionService, extensionService); const extHostProgress = rpcProtocol.set(ExtHostContext.ExtHostProgress, new ExtHostProgress(rpcProtocol.getProxy(MainContext.MainThreadProgress))); - const extHostOutputService = rpcProtocol.set(ExtHostContext.ExtHostOutputService, new ExtHostOutputService(LogOutputChannelFactory, initData.logsLocation, rpcProtocol)); + const extHostOutputService = rpcProtocol.set(ExtHostContext.ExtHostOutputService, accessor.get(IExtHostOutputService)); rpcProtocol.set(ExtHostContext.ExtHostStorage, extHostStorage); const extHostLabelService = rpcProtocol.set(ExtHostContext.ExtHosLabelService, new ExtHostLabelService(rpcProtocol)); diff --git a/src/vs/workbench/api/node/extHost.services.ts b/src/vs/workbench/api/node/extHost.services.ts new file mode 100644 index 00000000000..ff8a01bd9f8 --- /dev/null +++ b/src/vs/workbench/api/node/extHost.services.ts @@ -0,0 +1,24 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; +import { IExtHostOutputService } from 'vs/workbench/api/common/extHostOutput'; +import { ExtHostOutputService2 } from 'vs/workbench/api/node/extHostOutputService'; +import { IExtHostWorkspace, ExtHostWorkspace } from 'vs/workbench/api/common/extHostWorkspace'; +import { IExtHostDecorations, ExtHostDecorations } from 'vs/workbench/api/common/extHostDecorations'; +import { IExtHostConfiguration, ExtHostConfiguration } from 'vs/workbench/api/common/extHostConfiguration'; +import { IExtHostCommands, ExtHostCommands } from 'vs/workbench/api/common/extHostCommands'; +import { IExtHostDocumentsAndEditors, ExtHostDocumentsAndEditors } from 'vs/workbench/api/common/extHostDocumentsAndEditors'; +import { ExtHostTerminalService } from 'vs/workbench/api/node/extHostTerminalService'; +import { IExtHostTerminalService } from 'vs/workbench/api/common/extHostTerminalService'; + +// register singleton services +registerSingleton(IExtHostOutputService, ExtHostOutputService2); +registerSingleton(IExtHostWorkspace, ExtHostWorkspace); +registerSingleton(IExtHostDecorations, ExtHostDecorations); +registerSingleton(IExtHostConfiguration, ExtHostConfiguration); +registerSingleton(IExtHostCommands, ExtHostCommands); +registerSingleton(IExtHostDocumentsAndEditors, ExtHostDocumentsAndEditors); +registerSingleton(IExtHostTerminalService, ExtHostTerminalService); diff --git a/src/vs/workbench/api/node/extHostExtensionService.ts b/src/vs/workbench/api/node/extHostExtensionService.ts index 2ee2b919b1d..faafb11b7fe 100644 --- a/src/vs/workbench/api/node/extHostExtensionService.ts +++ b/src/vs/workbench/api/node/extHostExtensionService.ts @@ -13,12 +13,12 @@ import { URI } from 'vs/base/common/uri'; import { ILogService } from 'vs/platform/log/common/log'; import { createApiFactory, IExtensionApiFactory } from 'vs/workbench/api/node/extHost.api.impl'; import { NodeModuleRequireInterceptor, VSCodeNodeModuleFactory, KeytarNodeModuleFactory, OpenNodeModuleFactory } from 'vs/workbench/api/node/extHostRequireInterceptor'; -import { ExtHostExtensionServiceShape, IEnvironment, IInitData, IMainContext, MainContext, MainThreadExtensionServiceShape, MainThreadTelemetryShape, MainThreadWorkspaceShape, IResolveAuthorityResult } from 'vs/workbench/api/common/extHost.protocol'; -import { ExtHostConfiguration } from 'vs/workbench/api/common/extHostConfiguration'; +import { ExtHostExtensionServiceShape, IInitData, IMainContext, MainContext, MainThreadExtensionServiceShape, MainThreadTelemetryShape, MainThreadWorkspaceShape, IResolveAuthorityResult } from 'vs/workbench/api/common/extHost.protocol'; +import { ExtHostConfiguration, IExtHostConfiguration } from 'vs/workbench/api/common/extHostConfiguration'; import { ActivatedExtension, EmptyExtension, ExtensionActivatedByAPI, ExtensionActivatedByEvent, ExtensionActivationReason, ExtensionActivationTimes, ExtensionActivationTimesBuilder, ExtensionsActivator, IExtensionAPI, IExtensionContext, IExtensionModule, HostExtension, ExtensionActivationTimesFragment } from 'vs/workbench/api/common/extHostExtensionActivator'; import { ExtHostLogService } from 'vs/workbench/api/common/extHostLogService'; import { ExtHostStorage } from 'vs/workbench/api/common/extHostStorage'; -import { ExtHostWorkspace } from 'vs/workbench/api/common/extHostWorkspace'; +import { ExtHostWorkspace, IExtHostWorkspace } from 'vs/workbench/api/common/extHostWorkspace'; import { ExtensionActivationError } from 'vs/workbench/services/extensions/common/extensions'; import { ExtensionDescriptionRegistry } from 'vs/workbench/services/extensions/common/extensionDescriptionRegistry'; import { connectProxyResolver } from 'vs/workbench/services/extensions/node/proxyResolver'; @@ -34,6 +34,8 @@ import { ExtensionStoragePaths } from 'vs/workbench/api/node/extHostStoragePaths import { RemoteAuthorityResolverError, ExtensionExecutionContext } from 'vs/workbench/api/common/extHostTypes'; import { IURITransformer } from 'vs/base/common/uriIpc'; import { ResolvedAuthority, ResolvedOptions } from 'vs/platform/remote/common/remoteAuthorityResolver'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { IExtHostContextService } from 'vs/workbench/api/common/extHostContextService'; interface ITestRunner { /** Old test runner API, as exported from `vscode/lib/testrunner` */ @@ -70,9 +72,10 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { private readonly _extHostContext: IMainContext; private readonly _extHostWorkspace: ExtHostWorkspace; private readonly _extHostConfiguration: ExtHostConfiguration; - private readonly _environment: IEnvironment; private readonly _extHostLogService: ExtHostLogService; + private readonly _instaService: IInstantiationService; + private readonly _mainThreadWorkspaceProxy: MainThreadWorkspaceShape; private readonly _mainThreadTelemetryProxy: MainThreadTelemetryShape; private readonly _mainThreadExtensionsProxy: MainThreadExtensionServiceShape; @@ -95,20 +98,19 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { constructor( hostUtils: IHostUtils, - initData: IInitData, - extHostContext: IMainContext, - extHostWorkspace: ExtHostWorkspace, - extHostConfiguration: ExtHostConfiguration, - environment: IEnvironment, - extHostLogService: ExtHostLogService, - uriTransformer: IURITransformer | null + uriTransformer: IURITransformer | null, + @IInstantiationService instaService: IInstantiationService, + @IExtHostContextService extHostContext: IExtHostContextService, + @IExtHostWorkspace extHostWorkspace: IExtHostWorkspace, + @IExtHostConfiguration extHostConfiguration: IExtHostConfiguration, + @ILogService extHostLogService: ExtHostLogService, ) { this._hostUtils = hostUtils; - this._initData = initData; - this._extHostContext = extHostContext; + this._initData = extHostContext.initData; + this._extHostContext = extHostContext.rpc; + this._instaService = instaService; this._extHostWorkspace = extHostWorkspace; this._extHostConfiguration = extHostConfiguration; - this._environment = environment; this._extHostLogService = extHostLogService; this._disposables = new DisposableStore(); @@ -119,14 +121,14 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { this._almostReadyToRunExtensions = new Barrier(); this._readyToStartExtensionHost = new Barrier(); this._readyToRunExtensions = new Barrier(); - this._registry = new ExtensionDescriptionRegistry(initData.extensions); + this._registry = new ExtensionDescriptionRegistry(this._initData.extensions); this._storage = new ExtHostStorage(this._extHostContext); - this._storagePath = new ExtensionStoragePaths(withNullAsUndefined(initData.workspace), initData.environment); + this._storagePath = new ExtensionStoragePaths(withNullAsUndefined(this._initData.workspace), this._initData.environment); const hostExtensions = new Set(); - initData.hostExtensions.forEach((extensionId) => hostExtensions.add(ExtensionIdentifier.toKey(extensionId))); + this._initData.hostExtensions.forEach((extensionId) => hostExtensions.add(ExtensionIdentifier.toKey(extensionId))); - this._activator = new ExtensionsActivator(this._registry, initData.resolvedExtensions, initData.hostExtensions, { + this._activator = new ExtensionsActivator(this._registry, this._initData.resolvedExtensions, this._initData.hostExtensions, { onExtensionActivationError: (extensionId: ExtensionIdentifier, error: ExtensionActivationError): void => { this._mainThreadExtensionsProxy.$onExtensionActivationError(extensionId, error); }, @@ -144,7 +146,7 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { this._extensionPathIndex = null; // initialize API first (i.e. do not release barrier until the API is initialized) - this._extensionApiFactory = createApiFactory( + this._extensionApiFactory = this._instaService.invokeFunction(createApiFactory, this._initData, this._extHostContext, this._extHostWorkspace, @@ -171,7 +173,7 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { const configProvider = await this._extHostConfiguration.getConfigProvider(); const extensionPaths = await this.getExtensionPathIndex(); NodeModuleRequireInterceptor.INSTANCE.register(new VSCodeNodeModuleFactory(this._extensionApiFactory, extensionPaths, this._registry, configProvider)); - NodeModuleRequireInterceptor.INSTANCE.register(new KeytarNodeModuleFactory(this._extHostContext.getProxy(MainContext.MainThreadKeytar), this._environment)); + NodeModuleRequireInterceptor.INSTANCE.register(new KeytarNodeModuleFactory(this._extHostContext.getProxy(MainContext.MainThreadKeytar), this._initData.environment)); if (this._initData.remote.isRemote) { NodeModuleRequireInterceptor.INSTANCE.register(new OpenNodeModuleFactory( this._extHostContext.getProxy(MainContext.MainThreadWindow), diff --git a/src/vs/workbench/api/node/extHostOutputService.ts b/src/vs/workbench/api/node/extHostOutputService.ts index e06299a5a32..9a228497d4e 100644 --- a/src/vs/workbench/api/node/extHostOutputService.ts +++ b/src/vs/workbench/api/node/extHostOutputService.ts @@ -10,7 +10,8 @@ import { join } from 'vs/base/common/path'; import { OutputAppender } from 'vs/workbench/services/output/node/outputAppender'; import { toLocalISOString } from 'vs/base/common/date'; import { dirExists, mkdirp } from 'vs/base/node/pfs'; -import { AbstractExtHostOutputChannel, IOutputChannelFactory, ExtHostPushOutputChannel } from 'vs/workbench/api/common/extHostOutput'; +import { AbstractExtHostOutputChannel, ExtHostPushOutputChannel, ExtHostOutputService, LazyOutputChannel } from 'vs/workbench/api/common/extHostOutput'; +import { IExtHostContextService } from 'vs/workbench/api/common/extHostContextService'; export class ExtHostOutputChannelBackedByFile extends AbstractExtHostOutputChannel { @@ -43,23 +44,36 @@ export class ExtHostOutputChannelBackedByFile extends AbstractExtHostOutputChann } } -export const LogOutputChannelFactory = new class implements IOutputChannelFactory { +export class ExtHostOutputService2 extends ExtHostOutputService { - _namePool = 1; + private _logsLocation: URI; + private _namePool: number = 1; - async createOutputChannel(name: string, logsLocation: URI, proxy: MainThreadOutputServiceShape): Promise { + constructor(@IExtHostContextService extHostContext: IExtHostContextService) { + super(extHostContext); + this._logsLocation = extHostContext.initData.logsLocation; + } + + createOutputChannel(name: string): vscode.OutputChannel { + name = name.trim(); + if (!name) { + throw new Error('illegal argument `name`. must not be falsy'); + } + return new LazyOutputChannel(name, this._doCreateOutChannel(name)); + } + + private async _doCreateOutChannel(name: string): Promise { try { - const outputDirPath = join(logsLocation.fsPath, `output_logging_${toLocalISOString(new Date()).replace(/-|:|\.\d+Z$/g, '')}`); - const outputDir = await dirExists(outputDirPath).then(exists => exists ? exists : mkdirp(outputDirPath).then(() => true)).then(() => outputDirPath); + const outputDirPath = join(this._logsLocation.fsPath, `output_logging_${toLocalISOString(new Date()).replace(/-|:|\.\d+Z$/g, '')}`); + const outputDir = await dirExists(outputDirPath).then(exists => exists || mkdirp(outputDirPath).then(() => true)).then(() => outputDirPath); const fileName = `${this._namePool++}-${name.replace(/[\\/:\*\?"<>\|]/g, '')}`; const file = URI.file(join(outputDir, `${fileName}.log`)); const appender = new OutputAppender(fileName, file.fsPath); - return new ExtHostOutputChannelBackedByFile(name, appender, proxy); + return new ExtHostOutputChannelBackedByFile(name, appender, this._proxy); } catch (error) { // Do not crash if logger cannot be created console.log(error); - return new ExtHostPushOutputChannel(name, proxy); + return new ExtHostPushOutputChannel(name, this._proxy); } } -}; - +} diff --git a/src/vs/workbench/api/node/extHostTask.ts b/src/vs/workbench/api/node/extHostTask.ts index b34f0ea8b95..de5c164f00d 100644 --- a/src/vs/workbench/api/node/extHostTask.ts +++ b/src/vs/workbench/api/node/extHostTask.ts @@ -27,10 +27,10 @@ import { import { ExtHostVariableResolverService } from 'vs/workbench/api/node/extHostDebugService'; import { ExtHostDocumentsAndEditors } from 'vs/workbench/api/common/extHostDocumentsAndEditors'; import { ExtHostConfiguration } from 'vs/workbench/api/common/extHostConfiguration'; -import { ExtHostTerminalService } from 'vs/workbench/api/node/extHostTerminalService'; import { IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; import { CancellationToken } from 'vs/base/common/cancellation'; import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; +import { IExtHostTerminalService } from 'vs/workbench/api/common/extHostTerminalService'; namespace TaskDefinitionDTO { export function from(value: vscode.TaskDefinition): TaskDefinitionDTO | undefined { @@ -358,7 +358,7 @@ export class ExtHostTask implements ExtHostTaskShape { private _workspaceProvider: IExtHostWorkspaceProvider; private _editorService: ExtHostDocumentsAndEditors; private _configurationService: ExtHostConfiguration; - private _terminalService: ExtHostTerminalService; + private _terminalService: IExtHostTerminalService; private _handleCounter: number; private _handlers: Map; private _taskExecutions: Map; @@ -376,7 +376,7 @@ export class ExtHostTask implements ExtHostTaskShape { workspaceService: ExtHostWorkspace, editorService: ExtHostDocumentsAndEditors, configurationService: ExtHostConfiguration, - extHostTerminalService: ExtHostTerminalService) { + extHostTerminalService: IExtHostTerminalService) { this._proxy = mainContext.getProxy(MainContext.MainThreadTask); this._workspaceProvider = workspaceService; this._editorService = editorService; diff --git a/src/vs/workbench/api/node/extHostTerminalService.ts b/src/vs/workbench/api/node/extHostTerminalService.ts index b4aa39cce9a..3d88152da0c 100644 --- a/src/vs/workbench/api/node/extHostTerminalService.ts +++ b/src/vs/workbench/api/node/extHostTerminalService.ts @@ -10,19 +10,21 @@ import { URI, UriComponents } from 'vs/base/common/uri'; import * as platform from 'vs/base/common/platform'; import * as terminalEnvironment from 'vs/workbench/contrib/terminal/common/terminalEnvironment'; import { Event, Emitter } from 'vs/base/common/event'; -import { ExtHostTerminalServiceShape, MainContext, MainThreadTerminalServiceShape, IMainContext, IShellLaunchConfigDto, IShellDefinitionDto, IShellAndArgsDto, ITerminalDimensionsDto } from 'vs/workbench/api/common/extHost.protocol'; -import { ExtHostConfiguration, ExtHostConfigProvider } from 'vs/workbench/api/common/extHostConfiguration'; +import { ExtHostTerminalServiceShape, MainContext, MainThreadTerminalServiceShape, IShellLaunchConfigDto, IShellDefinitionDto, IShellAndArgsDto, ITerminalDimensionsDto } from 'vs/workbench/api/common/extHost.protocol'; +import { ExtHostConfiguration, ExtHostConfigProvider, IExtHostConfiguration } from 'vs/workbench/api/common/extHostConfiguration'; import { ILogService } from 'vs/platform/log/common/log'; import { EXT_HOST_CREATION_DELAY, IShellLaunchConfig, ITerminalEnvironment, ITerminalChildProcess, ITerminalDimensions } from 'vs/workbench/contrib/terminal/common/terminal'; import { TerminalProcess } from 'vs/workbench/contrib/terminal/node/terminalProcess'; import { timeout } from 'vs/base/common/async'; -import { ExtHostWorkspace } from 'vs/workbench/api/common/extHostWorkspace'; +import { ExtHostWorkspace, IExtHostWorkspace } from 'vs/workbench/api/common/extHostWorkspace'; import { IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; import { ExtHostVariableResolverService } from 'vs/workbench/api/node/extHostDebugService'; -import { ExtHostDocumentsAndEditors } from 'vs/workbench/api/common/extHostDocumentsAndEditors'; +import { ExtHostDocumentsAndEditors, IExtHostDocumentsAndEditors } from 'vs/workbench/api/common/extHostDocumentsAndEditors'; import { getSystemShell, detectAvailableShells } from 'vs/workbench/contrib/terminal/node/terminal'; import { getMainProcessParentEnv } from 'vs/workbench/contrib/terminal/node/terminalEnvironment'; import { IDisposable } from 'vs/base/common/lifecycle'; +import { IExtHostContextService } from 'vs/workbench/api/common/extHostContextService'; +import { IExtHostTerminalService } from 'vs/workbench/api/common/extHostTerminalService'; export class BaseExtHostTerminal { public _id: number | undefined; @@ -196,7 +198,7 @@ export class ExtHostTerminal extends BaseExtHostTerminal implements vscode.Termi } } -export class ExtHostTerminalService implements ExtHostTerminalServiceShape { +export class ExtHostTerminalService implements IExtHostTerminalService, ExtHostTerminalServiceShape { private _proxy: MainThreadTerminalServiceShape; private _activeTerminal: ExtHostTerminal | undefined; private _terminals: ExtHostTerminal[] = []; @@ -223,13 +225,13 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { public get onDidWriteTerminalData(): Event { return this._onDidWriteTerminalData && this._onDidWriteTerminalData.event; } constructor( - mainContext: IMainContext, - private _extHostConfiguration: ExtHostConfiguration, - private _extHostWorkspace: ExtHostWorkspace, - private _extHostDocumentsAndEditors: ExtHostDocumentsAndEditors, - private _logService: ILogService + @IExtHostContextService extHostContext: IExtHostContextService, + @IExtHostConfiguration private _extHostConfiguration: ExtHostConfiguration, + @IExtHostWorkspace private _extHostWorkspace: ExtHostWorkspace, + @IExtHostDocumentsAndEditors private _extHostDocumentsAndEditors: ExtHostDocumentsAndEditors, + @ILogService private _logService: ILogService ) { - this._proxy = mainContext.getProxy(MainContext.MainThreadTerminalService); + this._proxy = extHostContext.rpc.getProxy(MainContext.MainThreadTerminalService); this._onDidWriteTerminalData = new Emitter({ onFirstListenerAdd: () => this._proxy.$startSendingDataEvents(), onLastListenerRemove: () => this._proxy.$stopSendingDataEvents() diff --git a/src/vs/workbench/services/extensions/node/extensionHostMain.ts b/src/vs/workbench/services/extensions/node/extensionHostMain.ts index 6cf41ef0492..18b294ad091 100644 --- a/src/vs/workbench/services/extensions/node/extensionHostMain.ts +++ b/src/vs/workbench/services/extensions/node/extensionHostMain.ts @@ -10,14 +10,16 @@ import { URI, setUriThrowOnMissingScheme } from 'vs/base/common/uri'; import { IURITransformer } from 'vs/base/common/uriIpc'; import { IMessagePassingProtocol } from 'vs/base/parts/ipc/common/ipc'; import { IInitData, MainContext, MainThreadConsoleShape } from 'vs/workbench/api/common/extHost.protocol'; -import { ExtHostConfiguration } from 'vs/workbench/api/common/extHostConfiguration'; import { ExtHostExtensionService, IHostUtils } from 'vs/workbench/api/node/extHostExtensionService'; import { ExtHostLogService } from 'vs/workbench/api/common/extHostLogService'; -import { ExtHostWorkspace } from 'vs/workbench/api/common/extHostWorkspace'; import { RPCProtocol } from 'vs/workbench/services/extensions/common/rpcProtocol'; import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; -import { withNullAsUndefined } from 'vs/base/common/types'; import { ILogService } from 'vs/platform/log/common/log'; +import { getSingletonServiceDescriptors } from 'vs/platform/instantiation/common/extensions'; +import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; +import { IExtHostContextService, ExtHostContextService } from 'vs/workbench/api/common/extHostContextService'; +import { InstantiationService } from 'vs/platform/instantiation/common/instantiationService'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; // we don't (yet) throw when extensions parse // uris that have no scheme @@ -64,20 +66,19 @@ export class ExtensionHostMain { const extHostLogService = new ExtHostLogService(logServiceFn(initData), initData.logsLocation.fsPath); this._disposables.add(extHostLogService); - const extHostWorkspace = new ExtHostWorkspace(rpcProtocol, extHostLogService, withNullAsUndefined(initData.workspace)); + // bootstrap services + const services = new ServiceCollection(...getSingletonServiceDescriptors()); + services.set(IExtHostContextService, new ExtHostContextService(rpcProtocol, initData)); + services.set(ILogService, extHostLogService); + + const instaService: IInstantiationService = new InstantiationService(services); extHostLogService.info('extension host started'); extHostLogService.trace('initData', initData); - const extHostConfiguraiton = new ExtHostConfiguration(rpcProtocol.getProxy(MainContext.MainThreadConfiguration), extHostWorkspace); - this._extensionService = new ExtHostExtensionService( + this._extensionService = instaService.createInstance( + ExtHostExtensionService, hostUtils, - initData, - rpcProtocol, - extHostWorkspace, - extHostConfiguraiton, - initData.environment, - extHostLogService, uriTransformer ); diff --git a/src/vs/workbench/services/extensions/node/extensionHostProcessSetup.ts b/src/vs/workbench/services/extensions/node/extensionHostProcessSetup.ts index 1a5822e645f..75b8c4c16a0 100644 --- a/src/vs/workbench/services/extensions/node/extensionHostProcessSetup.ts +++ b/src/vs/workbench/services/extensions/node/extensionHostProcessSetup.ts @@ -22,6 +22,7 @@ import { exists } from 'vs/base/node/pfs'; import { realpath } from 'vs/base/node/extpath'; import { IHostUtils } from 'vs/workbench/api/node/extHostExtensionService'; import { SpdLogService } from 'vs/platform/log/node/spdlogService'; +import 'vs/workbench/api/node/extHost.services'; interface ParsedExtHostArgs { uriTransformerPath?: string; diff --git a/src/vs/workbench/test/electron-browser/api/extHostApiCommands.test.ts b/src/vs/workbench/test/electron-browser/api/extHostApiCommands.test.ts index 779c40e9656..ea33dffbd70 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostApiCommands.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostApiCommands.test.ts @@ -21,7 +21,7 @@ import { ExtHostCommands } from 'vs/workbench/api/common/extHostCommands'; import { MainThreadCommands } from 'vs/workbench/api/browser/mainThreadCommands'; import { ExtHostDocuments } from 'vs/workbench/api/common/extHostDocuments'; import { ExtHostDocumentsAndEditors } from 'vs/workbench/api/common/extHostDocumentsAndEditors'; -import { MainContext, ExtHostContext } from 'vs/workbench/api/common/extHost.protocol'; +import { MainContext, ExtHostContext, IInitData } from 'vs/workbench/api/common/extHost.protocol'; import { ExtHostDiagnostics } from 'vs/workbench/api/common/extHostDiagnostics'; import * as vscode from 'vscode'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; @@ -30,6 +30,8 @@ import { NullLogService } from 'vs/platform/log/common/log'; import { ITextModel } from 'vs/editor/common/model'; import { nullExtensionDescription } from 'vs/workbench/services/extensions/common/extensions'; import { dispose } from 'vs/base/common/lifecycle'; +import { ExtHostContextService } from 'vs/workbench/api/common/extHostContextService'; +import { mock } from 'vs/workbench/test/electron-browser/api/mock'; const defaultSelector = { scheme: 'far' }; const model: ITextModel = EditorModel.createFromString( @@ -93,7 +95,9 @@ suite('ExtHostLanguageFeatureCommands', function () { inst = instantiationService; } - const extHostDocumentsAndEditors = new ExtHostDocumentsAndEditors(rpcProtocol); + const extHostContext = new ExtHostContextService(rpcProtocol, new class extends mock() { }); + + const extHostDocumentsAndEditors = new ExtHostDocumentsAndEditors(extHostContext); extHostDocumentsAndEditors.$acceptDocumentsAndEditorsDelta({ addedDocuments: [{ isDirty: false, @@ -107,7 +111,7 @@ suite('ExtHostLanguageFeatureCommands', function () { const extHostDocuments = new ExtHostDocuments(rpcProtocol, extHostDocumentsAndEditors); rpcProtocol.set(ExtHostContext.ExtHostDocuments, extHostDocuments); - commands = new ExtHostCommands(rpcProtocol, new NullLogService()); + commands = new ExtHostCommands(extHostContext, new NullLogService()); rpcProtocol.set(ExtHostContext.ExtHostCommands, commands); rpcProtocol.set(MainContext.MainThreadCommands, inst.createInstance(MainThreadCommands, rpcProtocol)); ExtHostApiCommands.register(commands); diff --git a/src/vs/workbench/test/electron-browser/api/extHostCommands.test.ts b/src/vs/workbench/test/electron-browser/api/extHostCommands.test.ts index d0cf59f320e..0f4769ae329 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostCommands.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostCommands.test.ts @@ -5,11 +5,12 @@ import * as assert from 'assert'; import { ExtHostCommands } from 'vs/workbench/api/common/extHostCommands'; -import { MainThreadCommandsShape } from 'vs/workbench/api/common/extHost.protocol'; +import { MainThreadCommandsShape, IInitData } from 'vs/workbench/api/common/extHost.protocol'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; import { SingleProxyRPCProtocol } from './testRPCProtocol'; import { mock } from 'vs/workbench/test/electron-browser/api/mock'; import { NullLogService } from 'vs/platform/log/common/log'; +import { ExtHostContextService } from 'vs/workbench/api/common/extHostContextService'; suite('ExtHostCommands', function () { @@ -26,7 +27,10 @@ suite('ExtHostCommands', function () { } }; - const commands = new ExtHostCommands(SingleProxyRPCProtocol(shape), new NullLogService()); + const commands = new ExtHostCommands( + new ExtHostContextService(SingleProxyRPCProtocol(shape), new class extends mock() { }), + new NullLogService() + ); commands.registerCommand(true, 'foo', (): any => { }).dispose(); assert.equal(lastUnregister!, 'foo'); assert.equal(CommandsRegistry.getCommand('foo'), undefined); @@ -46,7 +50,10 @@ suite('ExtHostCommands', function () { } }; - const commands = new ExtHostCommands(SingleProxyRPCProtocol(shape), new NullLogService()); + const commands = new ExtHostCommands( + new ExtHostContextService(SingleProxyRPCProtocol(shape), new class extends mock() { }), + new NullLogService() + ); const reg = commands.registerCommand(true, 'foo', (): any => { }); reg.dispose(); reg.dispose(); diff --git a/src/vs/workbench/test/electron-browser/api/extHostConfiguration.test.ts b/src/vs/workbench/test/electron-browser/api/extHostConfiguration.test.ts index 3104b573b5c..4e2f172115a 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostConfiguration.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostConfiguration.test.ts @@ -7,7 +7,7 @@ import * as assert from 'assert'; import { URI, UriComponents } from 'vs/base/common/uri'; import { ExtHostWorkspace } from 'vs/workbench/api/common/extHostWorkspace'; import { ExtHostConfigProvider } from 'vs/workbench/api/common/extHostConfiguration'; -import { MainThreadConfigurationShape, IConfigurationInitData } from 'vs/workbench/api/common/extHost.protocol'; +import { MainThreadConfigurationShape, IConfigurationInitData, IInitData } from 'vs/workbench/api/common/extHost.protocol'; import { ConfigurationModel } from 'vs/platform/configuration/common/configurationModels'; import { TestRPCProtocol } from './testRPCProtocol'; import { mock } from 'vs/workbench/test/electron-browser/api/mock'; @@ -26,11 +26,19 @@ suite('ExtHostConfiguration', function () { } } + function createExtHostWorkspace(): ExtHostWorkspace { + return new ExtHostWorkspace({ + _serviceBrand: undefined, + rpc: new TestRPCProtocol(), + initData: new class extends mock() { } + }, new NullLogService()); + } + function createExtHostConfiguration(contents: any = Object.create(null), shape?: MainThreadConfigurationShape) { if (!shape) { shape = new class extends mock() { }; } - return new ExtHostConfigProvider(shape, new ExtHostWorkspace(new TestRPCProtocol(), new NullLogService()), createConfigurationData(contents)); + return new ExtHostConfigProvider(shape, createExtHostWorkspace(), createConfigurationData(contents)); } function createConfigurationData(contents: any): IConfigurationInitData { @@ -263,7 +271,7 @@ suite('ExtHostConfiguration', function () { test('inspect in no workspace context', function () { const testObject = new ExtHostConfigProvider( new class extends mock() { }, - new ExtHostWorkspace(new TestRPCProtocol(), new NullLogService()), + createExtHostWorkspace(), { defaults: new ConfigurationModel({ 'editor': { @@ -303,7 +311,7 @@ suite('ExtHostConfiguration', function () { } }, ['editor.wordWrap']); folders.push([workspaceUri, workspace]); - const extHostWorkspace = new ExtHostWorkspace(new TestRPCProtocol(), new NullLogService()); + const extHostWorkspace = createExtHostWorkspace(); extHostWorkspace.$initializeWorkspace({ 'id': 'foo', 'folders': [aWorkspaceFolder(URI.file('foo'), 0)], @@ -378,7 +386,7 @@ suite('ExtHostConfiguration', function () { }, ['editor.wordWrap'])]); folders.push([thirdRoot, new ConfigurationModel({}, [])]); - const extHostWorkspace = new ExtHostWorkspace(new TestRPCProtocol(), new NullLogService()); + const extHostWorkspace = createExtHostWorkspace(); extHostWorkspace.$initializeWorkspace({ 'id': 'foo', 'folders': [aWorkspaceFolder(firstRoot, 0), aWorkspaceFolder(secondRoot, 1)], @@ -588,7 +596,7 @@ suite('ExtHostConfiguration', function () { test('configuration change event', (done) => { const workspaceFolder = aWorkspaceFolder(URI.file('folder1'), 0); - const extHostWorkspace = new ExtHostWorkspace(new TestRPCProtocol(), new NullLogService()); + const extHostWorkspace = createExtHostWorkspace(); extHostWorkspace.$initializeWorkspace({ 'id': 'foo', 'folders': [workspaceFolder], diff --git a/src/vs/workbench/test/electron-browser/api/extHostDocumentSaveParticipant.test.ts b/src/vs/workbench/test/electron-browser/api/extHostDocumentSaveParticipant.test.ts index d85eae55ebf..bf67278fb60 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostDocumentSaveParticipant.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostDocumentSaveParticipant.test.ts @@ -7,7 +7,7 @@ import { URI } from 'vs/base/common/uri'; import { ExtHostDocuments } from 'vs/workbench/api/common/extHostDocuments'; import { ExtHostDocumentsAndEditors } from 'vs/workbench/api/common/extHostDocumentsAndEditors'; import { TextDocumentSaveReason, TextEdit, Position, EndOfLine } from 'vs/workbench/api/common/extHostTypes'; -import { MainThreadTextEditorsShape, IWorkspaceEditDto } from 'vs/workbench/api/common/extHost.protocol'; +import { MainThreadTextEditorsShape, IWorkspaceEditDto, IInitData } from 'vs/workbench/api/common/extHost.protocol'; import { ExtHostDocumentSaveParticipant } from 'vs/workbench/api/common/extHostDocumentSaveParticipant'; import { SingleProxyRPCProtocol } from './testRPCProtocol'; import { SaveReason } from 'vs/workbench/services/textfile/common/textfiles'; @@ -17,6 +17,7 @@ import { NullLogService } from 'vs/platform/log/common/log'; import { isResourceTextEdit, ResourceTextEdit } from 'vs/editor/common/modes'; import { timeout } from 'vs/base/common/async'; import { ExtensionIdentifier, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; +import { ExtHostContextService } from 'vs/workbench/api/common/extHostContextService'; suite('ExtHostDocumentSaveParticipant', () => { @@ -37,7 +38,8 @@ suite('ExtHostDocumentSaveParticipant', () => { }; setup(() => { - const documentsAndEditors = new ExtHostDocumentsAndEditors(SingleProxyRPCProtocol(null)); + const extHostContext = new ExtHostContextService(SingleProxyRPCProtocol(null), new class extends mock() { }); + const documentsAndEditors = new ExtHostDocumentsAndEditors(extHostContext); documentsAndEditors.$acceptDocumentsAndEditorsDelta({ addedDocuments: [{ isDirty: false, diff --git a/src/vs/workbench/test/electron-browser/api/extHostDocumentsAndEditors.test.ts b/src/vs/workbench/test/electron-browser/api/extHostDocumentsAndEditors.test.ts index 67916da33da..8eb015f77dc 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostDocumentsAndEditors.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostDocumentsAndEditors.test.ts @@ -6,16 +6,23 @@ import * as assert from 'assert'; import { URI } from 'vs/base/common/uri'; import { ExtHostDocumentsAndEditors } from 'vs/workbench/api/common/extHostDocumentsAndEditors'; +import { mock } from 'vs/workbench/test/electron-browser/api/mock'; +import { IInitData } from 'vs/workbench/api/common/extHost.protocol'; suite('ExtHostDocumentsAndEditors', () => { let editors: ExtHostDocumentsAndEditors; setup(function () { + editors = new ExtHostDocumentsAndEditors({ - getProxy: () => { return undefined!; }, - set: undefined!, - assertRegistered: undefined! + _serviceBrand: undefined, + rpc: { + getProxy: () => { return undefined!; }, + set: undefined!, + assertRegistered: undefined! + }, + initData: new class extends mock() { } }); }); diff --git a/src/vs/workbench/test/electron-browser/api/extHostLanguageFeatures.test.ts b/src/vs/workbench/test/electron-browser/api/extHostLanguageFeatures.test.ts index 18ecedc673b..b31cebfb56d 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostLanguageFeatures.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostLanguageFeatures.test.ts @@ -34,7 +34,7 @@ import { provideSignatureHelp } from 'vs/editor/contrib/parameterHints/provideSi import { provideSuggestionItems, CompletionOptions } from 'vs/editor/contrib/suggest/suggest'; import { getDocumentFormattingEditsUntilResult, getDocumentRangeFormattingEditsUntilResult, getOnTypeFormattingEdits } from 'vs/editor/contrib/format/format'; import { getLinks } from 'vs/editor/contrib/links/getLinks'; -import { MainContext, ExtHostContext } from 'vs/workbench/api/common/extHost.protocol'; +import { MainContext, ExtHostContext, IInitData } from 'vs/workbench/api/common/extHost.protocol'; import { ExtHostDiagnostics } from 'vs/workbench/api/common/extHostDiagnostics'; import * as vscode from 'vscode'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; @@ -48,6 +48,7 @@ import { mock } from 'vs/workbench/test/electron-browser/api/mock'; import { IEditorWorkerService } from 'vs/editor/common/services/editorWorkerService'; import { dispose } from 'vs/base/common/lifecycle'; import { withNullAsUndefined } from 'vs/base/common/types'; +import { ExtHostContextService } from 'vs/workbench/api/common/extHostContextService'; const defaultSelector = { scheme: 'far' }; const model: ITextModel = EditorModel.createFromString( @@ -85,7 +86,9 @@ suite('ExtHostLanguageFeatures', function () { originalErrorHandler = errorHandler.getUnexpectedErrorHandler(); setUnexpectedErrorHandler(() => { }); - const extHostDocumentsAndEditors = new ExtHostDocumentsAndEditors(rpcProtocol); + const extHostContext = new ExtHostContextService(rpcProtocol, new class extends mock() { }); + + const extHostDocumentsAndEditors = new ExtHostDocumentsAndEditors(extHostContext); extHostDocumentsAndEditors.$acceptDocumentsAndEditorsDelta({ addedDocuments: [{ isDirty: false, @@ -99,7 +102,7 @@ suite('ExtHostLanguageFeatures', function () { const extHostDocuments = new ExtHostDocuments(rpcProtocol, extHostDocumentsAndEditors); rpcProtocol.set(ExtHostContext.ExtHostDocuments, extHostDocuments); - const commands = new ExtHostCommands(rpcProtocol, new NullLogService()); + const commands = new ExtHostCommands(extHostContext, new NullLogService()); rpcProtocol.set(ExtHostContext.ExtHostCommands, commands); rpcProtocol.set(MainContext.MainThreadCommands, inst.createInstance(MainThreadCommands, rpcProtocol)); diff --git a/src/vs/workbench/test/electron-browser/api/extHostTextEditors.test.ts b/src/vs/workbench/test/electron-browser/api/extHostTextEditors.test.ts index a66b5b43b9f..3690ff5519f 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostTextEditors.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostTextEditors.test.ts @@ -4,13 +4,14 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; import * as extHostTypes from 'vs/workbench/api/common/extHostTypes'; -import { MainContext, MainThreadTextEditorsShape, IWorkspaceEditDto } from 'vs/workbench/api/common/extHost.protocol'; +import { MainContext, MainThreadTextEditorsShape, IWorkspaceEditDto, IInitData } from 'vs/workbench/api/common/extHost.protocol'; import { URI } from 'vs/base/common/uri'; import { mock } from 'vs/workbench/test/electron-browser/api/mock'; import { ExtHostDocumentsAndEditors } from 'vs/workbench/api/common/extHostDocumentsAndEditors'; import { SingleProxyRPCProtocol, TestRPCProtocol } from 'vs/workbench/test/electron-browser/api/testRPCProtocol'; import { ExtHostEditors } from 'vs/workbench/api/common/extHostTextEditors'; import { ResourceTextEdit } from 'vs/editor/common/modes'; +import { ExtHostContextService } from 'vs/workbench/api/common/extHostContextService'; suite('ExtHostTextEditors.applyWorkspaceEdit', () => { @@ -28,7 +29,8 @@ suite('ExtHostTextEditors.applyWorkspaceEdit', () => { return Promise.resolve(true); } }); - const documentsAndEditors = new ExtHostDocumentsAndEditors(SingleProxyRPCProtocol(null)); + const extHostContext = new ExtHostContextService(SingleProxyRPCProtocol(null), new class extends mock() { }); + const documentsAndEditors = new ExtHostDocumentsAndEditors(extHostContext); documentsAndEditors.$acceptDocumentsAndEditorsDelta({ addedDocuments: [{ isDirty: false, diff --git a/src/vs/workbench/test/electron-browser/api/extHostTreeViews.test.ts b/src/vs/workbench/test/electron-browser/api/extHostTreeViews.test.ts index 5f05a9bc453..f0e702295d8 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostTreeViews.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostTreeViews.test.ts @@ -8,7 +8,7 @@ import * as sinon from 'sinon'; import { Emitter } from 'vs/base/common/event'; import { ExtHostTreeViews } from 'vs/workbench/api/common/extHostTreeViews'; import { ExtHostCommands } from 'vs/workbench/api/common/extHostCommands'; -import { MainThreadTreeViewsShape, MainContext } from 'vs/workbench/api/common/extHost.protocol'; +import { MainThreadTreeViewsShape, MainContext, IInitData } from 'vs/workbench/api/common/extHost.protocol'; import { TreeDataProvider, TreeItem } from 'vscode'; import { TestRPCProtocol } from './testRPCProtocol'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; @@ -18,6 +18,7 @@ import { mock } from 'vs/workbench/test/electron-browser/api/mock'; import { TreeItemCollapsibleState, ITreeItem } from 'vs/workbench/common/views'; import { NullLogService } from 'vs/platform/log/common/log'; import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; +import { ExtHostContextService } from 'vs/workbench/api/common/extHostContextService'; suite('ExtHostTreeView', function () { @@ -71,7 +72,10 @@ suite('ExtHostTreeView', function () { rpcProtocol.set(MainContext.MainThreadCommands, inst.createInstance(MainThreadCommands, rpcProtocol)); target = new RecordingShape(); - testObject = new ExtHostTreeViews(target, new ExtHostCommands(rpcProtocol, new NullLogService()), new NullLogService()); + testObject = new ExtHostTreeViews(target, new ExtHostCommands( + new ExtHostContextService(rpcProtocol, new class extends mock() { }), + new NullLogService() + ), new NullLogService()); onDidChangeTreeNode = new Emitter<{ key: string }>(); onDidChangeTreeNodeWithId = new Emitter<{ key: string }>(); testObject.createTreeView('testNodeTreeProvider', { treeDataProvider: aNodeTreeDataProvider() }, { enableProposedApi: true } as IExtensionDescription); diff --git a/src/vs/workbench/test/electron-browser/api/extHostWorkspace.test.ts b/src/vs/workbench/test/electron-browser/api/extHostWorkspace.test.ts index 0441b998625..833b6dbc7a9 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostWorkspace.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostWorkspace.test.ts @@ -11,14 +11,18 @@ import { ExtensionIdentifier, IExtensionDescription } from 'vs/platform/extensio import { ILogService, NullLogService } from 'vs/platform/log/common/log'; import { IWorkspaceFolderData } from 'vs/platform/workspace/common/workspace'; import { MainThreadWorkspace } from 'vs/workbench/api/browser/mainThreadWorkspace'; -import { IMainContext, IWorkspaceData, MainContext } from 'vs/workbench/api/common/extHost.protocol'; +import { IMainContext, IWorkspaceData, MainContext, IInitData } from 'vs/workbench/api/common/extHost.protocol'; import { RelativePattern } from 'vs/workbench/api/common/extHostTypes'; import { ExtHostWorkspace } from 'vs/workbench/api/common/extHostWorkspace'; import { mock } from 'vs/workbench/test/electron-browser/api/mock'; import { TestRPCProtocol } from './testRPCProtocol'; function createExtHostWorkspace(mainContext: IMainContext, data: IWorkspaceData, logService: ILogService): ExtHostWorkspace { - const result = new ExtHostWorkspace(mainContext, logService); + const result = new ExtHostWorkspace({ + _serviceBrand: undefined, + rpc: mainContext, + initData: new class extends mock() { workspace = data; } + }, logService); result.$initializeWorkspace(data); return result; }