From 36135bd2eec1aa6c1caaba6e53399425d5434655 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 7 Aug 2019 21:20:51 +0200 Subject: [PATCH] add debug and extension service to injector --- .../api/common/extHostDebugService.ts | 34 +++++++++++++++++ .../api/common/extHostExtensionService.ts | 22 +++++++++++ src/vs/workbench/api/node/extHost.api.impl.ts | 15 ++++---- src/vs/workbench/api/node/extHost.services.ts | 3 ++ .../workbench/api/node/extHostDebugService.ts | 37 +++++++++++-------- .../api/node/extHostExtensionService.ts | 19 +++++++--- .../extensions/node/extensionHostMain.ts | 3 +- 7 files changed, 102 insertions(+), 31 deletions(-) create mode 100644 src/vs/workbench/api/common/extHostDebugService.ts create mode 100644 src/vs/workbench/api/common/extHostExtensionService.ts diff --git a/src/vs/workbench/api/common/extHostDebugService.ts b/src/vs/workbench/api/common/extHostDebugService.ts new file mode 100644 index 00000000000..02b3c423f87 --- /dev/null +++ b/src/vs/workbench/api/common/extHostDebugService.ts @@ -0,0 +1,34 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { Event } from 'vs/base/common/event'; +import { ExtHostDebugServiceShape } from 'vs/workbench/api/common/extHost.protocol'; +import * as vscode from 'vscode'; +import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; +import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; + +export const IExtHostDebugService = createDecorator('IExtHostDebugService'); + +export interface IExtHostDebugService extends ExtHostDebugServiceShape { + + readonly _serviceBrand: any; + + onDidStartDebugSession: Event; + onDidTerminateDebugSession: Event; + onDidChangeActiveDebugSession: Event; + activeDebugSession: vscode.DebugSession | undefined; + activeDebugConsole: vscode.DebugConsole; + onDidReceiveDebugSessionCustomEvent: Event; + onDidChangeBreakpoints: Event; + breakpoints: vscode.Breakpoint[]; + + addBreakpoints(breakpoints0: vscode.Breakpoint[]): Promise; + removeBreakpoints(breakpoints0: vscode.Breakpoint[]): Promise; + startDebugging(folder: vscode.WorkspaceFolder | undefined, nameOrConfig: string | vscode.DebugConfiguration, parentSession?: vscode.DebugSession): Promise; + registerDebugConfigurationProvider(type: string, provider: vscode.DebugConfigurationProvider): vscode.Disposable; + registerDebugAdapterDescriptorFactory(extension: IExtensionDescription, type: string, factory: vscode.DebugAdapterDescriptorFactory): vscode.Disposable; + registerDebugAdapterTrackerFactory(type: string, factory: vscode.DebugAdapterTrackerFactory): vscode.Disposable; +} + diff --git a/src/vs/workbench/api/common/extHostExtensionService.ts b/src/vs/workbench/api/common/extHostExtensionService.ts new file mode 100644 index 00000000000..0833e6f7e83 --- /dev/null +++ b/src/vs/workbench/api/common/extHostExtensionService.ts @@ -0,0 +1,22 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { ExtHostExtensionServiceShape } from 'vs/workbench/api/common/extHost.protocol'; +import { ExtensionActivationReason, IExtensionAPI } from 'vs/workbench/api/common/extHostExtensionActivator'; +import { ExtensionDescriptionRegistry } from 'vs/workbench/services/extensions/common/extensionDescriptionRegistry'; +import * as vscode from 'vscode'; +import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; +import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; + +export const IExtHostExtensionService = createDecorator('IExtHostExtensionService'); + +export interface IExtHostExtensionService extends ExtHostExtensionServiceShape { + _serviceBrand: any; + isActivated(extensionId: ExtensionIdentifier): boolean; + activateByIdWithErrors(extensionId: ExtensionIdentifier, reason: ExtensionActivationReason): Promise; + getExtensionExports(extensionId: ExtensionIdentifier): IExtensionAPI | null | undefined; + getExtensionRegistry(): Promise; + registerRemoteAuthorityResolver(authorityPrefix: string, resolver: vscode.RemoteAuthorityResolver): vscode.Disposable; +} diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index 4f324cacaeb..8870ae9a0cf 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -21,7 +21,6 @@ import { ExtHostClipboard } from 'vs/workbench/api/common/extHostClipboard'; 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 { ExtHostDiagnostics } from 'vs/workbench/api/common/extHostDiagnostics'; import { ExtHostDialogs } from 'vs/workbench/api/common/extHostDialogs'; import { ExtHostDocumentContentProvider } from 'vs/workbench/api/common/extHostDocumentContentProviders'; @@ -29,7 +28,7 @@ import { ExtHostDocumentSaveParticipant } from 'vs/workbench/api/common/extHostD import { ExtHostDocuments } from 'vs/workbench/api/common/extHostDocuments'; 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 { IExtHostExtensionService } from 'vs/workbench/api/common/extHostExtensionService'; import { ExtHostFileSystem } from 'vs/workbench/api/common/extHostFileSystem'; import { ExtHostFileSystemEventService } from 'vs/workbench/api/common/extHostFileSystemEventService'; import { ExtHostLanguageFeatures } from 'vs/workbench/api/common/extHostLanguageFeatures'; @@ -66,9 +65,10 @@ import { IURITransformer } from 'vs/base/common/uriIpc'; import { ExtHostEditorInsets } from 'vs/workbench/api/common/extHostCodeInsets'; import { ExtHostLabelService } from 'vs/workbench/api/common/extHostLabelService'; import { getRemoteName } from 'vs/platform/remote/common/remoteHosts'; -import { ServicesAccessor, IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { IExtHostDecorations } from 'vs/workbench/api/common/extHostDecorations'; import { IExtHostTask } from 'vs/workbench/api/common/extHostTask'; +import { IExtHostDebugService } from 'vs/workbench/api/common/extHostDebugService'; export interface IExtensionApiFactory { (extension: IExtensionDescription, registry: ExtensionDescriptionRegistry, configProvider: ExtHostConfigProvider): typeof vscode; @@ -91,14 +91,13 @@ export function createApiFactory( rpcProtocol: IMainContext, extHostWorkspace: ExtHostWorkspace, extHostConfiguration: ExtHostConfiguration, - extensionService: ExtHostExtensionService, extHostLogService: ExtHostLogService, extHostStorage: ExtHostStorage, uriTransformer: IURITransformer | null ): IExtensionApiFactory { // services - const instaService = accessor.get(IInstantiationService); + const extensionService = accessor.get(IExtHostExtensionService); // Addressable instances rpcProtocol.set(ExtHostContext.ExtHostLogService, extHostLogService); @@ -122,7 +121,7 @@ export function createApiFactory( 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, accessor.get(IExtHostTerminalService)); - const extHostDebugService = rpcProtocol.set(ExtHostContext.ExtHostDebugService, instaService.createInstance(ExtHostDebugService, rpcProtocol, extHostWorkspace, extensionService, extHostDocumentsAndEditors, extHostConfiguration, extHostTerminalService, extHostCommands)); + const extHostDebugService = rpcProtocol.set(ExtHostContext.ExtHostDebugService, accessor.get(IExtHostDebugService)); const extHostSCM = rpcProtocol.set(ExtHostContext.ExtHostSCM, new ExtHostSCM(rpcProtocol, extHostCommands, extHostLogService)); const extHostComment = rpcProtocol.set(ExtHostContext.ExtHostComments, new ExtHostComments(rpcProtocol, extHostCommands, extHostDocuments)); const extHostSearch = rpcProtocol.set(ExtHostContext.ExtHostSearch, new ExtHostSearch(rpcProtocol, uriTransformer, extHostLogService)); @@ -908,7 +907,7 @@ export function createApiFactory( class Extension implements vscode.Extension { - private _extensionService: ExtHostExtensionService; + private _extensionService: IExtHostExtensionService; private _identifier: ExtensionIdentifier; readonly id: string; @@ -916,7 +915,7 @@ class Extension implements vscode.Extension { readonly packageJSON: IExtensionDescription; readonly extensionKind: vscode.ExtensionKind; - constructor(extensionService: ExtHostExtensionService, description: IExtensionDescription, kind: extHostTypes.ExtensionKind) { + constructor(extensionService: IExtHostExtensionService, description: IExtensionDescription, kind: extHostTypes.ExtensionKind) { this._extensionService = extensionService; this._identifier = description.identifier; this.id = description.identifier.value; diff --git a/src/vs/workbench/api/node/extHost.services.ts b/src/vs/workbench/api/node/extHost.services.ts index 3e5f9b5c3c1..4a8176170d7 100644 --- a/src/vs/workbench/api/node/extHost.services.ts +++ b/src/vs/workbench/api/node/extHost.services.ts @@ -15,6 +15,8 @@ import { ExtHostTerminalService } from 'vs/workbench/api/node/extHostTerminalSer import { IExtHostTerminalService } from 'vs/workbench/api/common/extHostTerminalService'; import { IExtHostTask } from 'vs/workbench/api/common/extHostTask'; import { ExtHostTask } from 'vs/workbench/api/node/extHostTask'; +import { ExtHostDebugService } from 'vs/workbench/api/node/extHostDebugService'; +import { IExtHostDebugService } from 'vs/workbench/api/common/extHostDebugService'; // register singleton services registerSingleton(IExtHostOutputService, ExtHostOutputService2); @@ -25,3 +27,4 @@ registerSingleton(IExtHostCommands, ExtHostCommands); registerSingleton(IExtHostDocumentsAndEditors, ExtHostDocumentsAndEditors); registerSingleton(IExtHostTerminalService, ExtHostTerminalService); registerSingleton(IExtHostTask, ExtHostTask); +registerSingleton(IExtHostDebugService, ExtHostDebugService); diff --git a/src/vs/workbench/api/node/extHostDebugService.ts b/src/vs/workbench/api/node/extHostDebugService.ts index 9b26206924d..cf179f59a6f 100644 --- a/src/vs/workbench/api/node/extHostDebugService.ts +++ b/src/vs/workbench/api/node/extHostDebugService.ts @@ -11,33 +11,37 @@ import { asPromise } from 'vs/base/common/async'; import * as nls from 'vs/nls'; import { MainContext, MainThreadDebugServiceShape, ExtHostDebugServiceShape, DebugSessionUUID, - IMainContext, IBreakpointsDeltaDto, ISourceMultiBreakpointDto, IFunctionBreakpointDto, IDebugSessionDto + IBreakpointsDeltaDto, ISourceMultiBreakpointDto, IFunctionBreakpointDto, IDebugSessionDto } from 'vs/workbench/api/common/extHost.protocol'; import * as vscode from 'vscode'; import { Disposable, Position, Location, SourceBreakpoint, FunctionBreakpoint, DebugAdapterServer, DebugAdapterExecutable } from 'vs/workbench/api/common/extHostTypes'; import { ExecutableDebugAdapter, SocketDebugAdapter } from 'vs/workbench/contrib/debug/node/debugAdapter'; import { AbstractDebugAdapter } from 'vs/workbench/contrib/debug/common/abstractDebugAdapter'; -import { IExtHostWorkspaceProvider } from 'vs/workbench/api/common/extHostWorkspace'; -import { ExtHostExtensionService } from 'vs/workbench/api/node/extHostExtensionService'; -import { ExtHostDocumentsAndEditors } from 'vs/workbench/api/common/extHostDocumentsAndEditors'; +import { IExtHostWorkspace } from 'vs/workbench/api/common/extHostWorkspace'; +import { IExtHostExtensionService } from 'vs/workbench/api/common/extHostExtensionService'; +import { ExtHostDocumentsAndEditors, IExtHostDocumentsAndEditors } from 'vs/workbench/api/common/extHostDocumentsAndEditors'; import { IDebuggerContribution, IConfig, IDebugAdapter, IDebugAdapterServer, IDebugAdapterExecutable, IAdapterDescriptor } from 'vs/workbench/contrib/debug/common/debug'; import { hasChildProcesses, prepareCommand, runInExternalTerminal } from 'vs/workbench/contrib/debug/node/terminals'; import { IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; import { AbstractVariableResolverService } from 'vs/workbench/services/configurationResolver/common/variableResolver'; -import { ExtHostConfiguration, ExtHostConfigProvider } from '../common/extHostConfiguration'; +import { ExtHostConfigProvider, IExtHostConfiguration } from '../common/extHostConfiguration'; import { convertToVSCPaths, convertToDAPaths, isDebuggerMainContribution } from 'vs/workbench/contrib/debug/common/debugUtils'; -import { ExtHostTerminalService } from 'vs/workbench/api/node/extHostTerminalService'; import { IDisposable } from 'vs/base/common/lifecycle'; import { IConfigurationResolverService } from 'vs/workbench/services/configurationResolver/common/configurationResolver'; import { CancellationToken } from 'vs/base/common/cancellation'; -import { ExtHostCommands } from 'vs/workbench/api/common/extHostCommands'; +import { IExtHostCommands } from 'vs/workbench/api/common/extHostCommands'; import { ExtensionDescriptionRegistry } from 'vs/workbench/services/extensions/common/extensionDescriptionRegistry'; import { IProcessEnvironment } from 'vs/base/common/platform'; import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import { SignService } from 'vs/platform/sign/node/signService'; import { ISignService } from 'vs/platform/sign/common/sign'; +import { IExtHostTerminalService } from 'vs/workbench/api/common/extHostTerminalService'; +import { IExtHostRpcService } from 'vs/workbench/api/common/rpcService'; +import { IExtHostDebugService } from 'vs/workbench/api/common/extHostDebugService'; -export class ExtHostDebugService implements ExtHostDebugServiceShape { +export class ExtHostDebugService implements IExtHostDebugService, ExtHostDebugServiceShape { + + readonly _serviceBrand: any; private _configProviderHandleCounter: number; private _configProviders: ConfigProviderTuple[]; @@ -86,13 +90,14 @@ export class ExtHostDebugService implements ExtHostDebugServiceShape { private _signService: ISignService; - constructor(mainContext: IMainContext, - private _workspaceService: IExtHostWorkspaceProvider, - private _extensionService: ExtHostExtensionService, - private _editorsService: ExtHostDocumentsAndEditors, - private _configurationService: ExtHostConfiguration, - private _terminalService: ExtHostTerminalService, - private _commandService: ExtHostCommands + constructor( + @IExtHostRpcService extHostRpcService: IExtHostRpcService, + @IExtHostWorkspace private _workspaceService: IExtHostWorkspace, + @IExtHostExtensionService private _extensionService: IExtHostExtensionService, + @IExtHostDocumentsAndEditors private _editorsService: IExtHostDocumentsAndEditors, + @IExtHostConfiguration private _configurationService: IExtHostConfiguration, + @IExtHostTerminalService private _terminalService: IExtHostTerminalService, + @IExtHostCommands private _commandService: IExtHostCommands ) { this._configProviderHandleCounter = 0; this._configProviders = []; @@ -112,7 +117,7 @@ export class ExtHostDebugService implements ExtHostDebugServiceShape { this._onDidChangeActiveDebugSession = new Emitter(); this._onDidReceiveDebugSessionCustomEvent = new Emitter(); - this._debugServiceProxy = mainContext.getProxy(MainContext.MainThreadDebugService); + this._debugServiceProxy = extHostRpcService.getProxy(MainContext.MainThreadDebugService); this._onDidChangeBreakpoints = new Emitter({ onFirstListenerAdd: () => { diff --git a/src/vs/workbench/api/node/extHostExtensionService.ts b/src/vs/workbench/api/node/extHostExtensionService.ts index 0d1c9447fc6..237223240e2 100644 --- a/src/vs/workbench/api/node/extHostExtensionService.ts +++ b/src/vs/workbench/api/node/extHostExtensionService.ts @@ -36,6 +36,8 @@ 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 { IExtHostInitDataService } from 'vs/workbench/api/common/extHostInitDataService'; +import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; +import { IExtHostExtensionService } from 'vs/workbench/api/common/extHostExtensionService'; interface ITestRunner { /** Old test runner API, as exported from `vscode/lib/testrunner` */ @@ -63,7 +65,9 @@ type TelemetryActivationEventFragment = { reason: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; }; -export class ExtHostExtensionService implements ExtHostExtensionServiceShape { +export class ExtHostExtensionService implements IExtHostExtensionService, ExtHostExtensionServiceShape { + + readonly _serviceBrand: any; private static readonly WORKSPACE_CONTAINS_TIMEOUT = 7000; @@ -74,8 +78,6 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { private readonly _extHostConfiguration: ExtHostConfiguration; private readonly _extHostLogService: ExtHostLogService; - private readonly _instaService: IInstantiationService; - private readonly _mainThreadWorkspaceProxy: MainThreadWorkspaceShape; private readonly _mainThreadTelemetryProxy: MainThreadTelemetryShape; private readonly _mainThreadExtensionsProxy: MainThreadExtensionServiceShape; @@ -100,6 +102,7 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { hostUtils: IHostUtils, uriTransformer: IURITransformer | null, extHostContext: IMainContext, + services: ServiceCollection, @IInstantiationService instaService: IInstantiationService, @IExtHostWorkspace extHostWorkspace: IExtHostWorkspace, @IExtHostConfiguration extHostConfiguration: IExtHostConfiguration, @@ -109,7 +112,7 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { this._hostUtils = hostUtils; this._extHostContext = extHostContext; this._initData = initData; - this._instaService = instaService; + this._extHostWorkspace = extHostWorkspace; this._extHostConfiguration = extHostConfiguration; this._extHostLogService = extHostLogService; @@ -146,13 +149,17 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { }); this._extensionPathIndex = null; + // todo@joh this is a hack! + // the problem is that this service doesn't create the insta-service + // but downlevel things it creates depend on this service... + services.set(IExtHostExtensionService, this); + // initialize API first (i.e. do not release barrier until the API is initialized) - this._extensionApiFactory = this._instaService.invokeFunction(createApiFactory, + this._extensionApiFactory = instaService.invokeFunction(createApiFactory, this._initData, this._extHostContext, this._extHostWorkspace, this._extHostConfiguration, - this, this._extHostLogService, this._storage, uriTransformer diff --git a/src/vs/workbench/services/extensions/node/extensionHostMain.ts b/src/vs/workbench/services/extensions/node/extensionHostMain.ts index 9a35343785c..89ce6ba8bc0 100644 --- a/src/vs/workbench/services/extensions/node/extensionHostMain.ts +++ b/src/vs/workbench/services/extensions/node/extensionHostMain.ts @@ -82,7 +82,8 @@ export class ExtensionHostMain { ExtHostExtensionService, hostUtils, uriTransformer, - rpcProtocol + rpcProtocol, + services, // todo@joh hack! ); // error forwarding and stack trace scanning