diff --git a/src/vs/workbench/api/browser/mainThreadMessageService.ts b/src/vs/workbench/api/browser/mainThreadMessageService.ts index aaf480f8b67..7057922be81 100644 --- a/src/vs/workbench/api/browser/mainThreadMessageService.ts +++ b/src/vs/workbench/api/browser/mainThreadMessageService.ts @@ -13,7 +13,7 @@ import { INotificationService } from 'vs/platform/notification/common/notificati import { Event } from 'vs/base/common/event'; import { ICommandService } from 'vs/platform/commands/common/commands'; import { dispose } from 'vs/base/common/lifecycle'; -import { ExtensionIdentifier, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; +import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; @extHostNamedCustomer(MainContext.MainThreadMessageService) export class MainThreadMessageService implements MainThreadMessageServiceShape { @@ -35,11 +35,11 @@ export class MainThreadMessageService implements MainThreadMessageServiceShape { if (options.modal) { return this._showModalMessage(severity, message, options.detail, commands, options.useCustom); } else { - return this._showMessage(severity, message, commands, options.extension); + return this._showMessage(severity, message, commands, options); } } - private _showMessage(severity: Severity, message: string, commands: { title: string; isCloseAffordance: boolean; handle: number; }[], extension: IExtensionDescription | undefined): Promise { + private _showMessage(severity: Severity, message: string, commands: { title: string; isCloseAffordance: boolean; handle: number; }[], options: MainThreadMessageOptions): Promise { return new Promise(resolve => { @@ -66,11 +66,11 @@ export class MainThreadMessageService implements MainThreadMessageServiceShape { primaryActions.push(new MessageItemAction('_extension_message_handle_' + command.handle, command.title, command.handle)); }); - let source: string | { label: string, id: string } | undefined; - if (extension) { + let source: string | { label: string, id: string; } | undefined; + if (options.source) { source = { - label: nls.localize('extensionSource', "{0} (Extension)", extension.displayName || extension.name), - id: extension.identifier.value + label: nls.localize('extensionSource', "{0} (Extension)", options.source.label), + id: options.source.identifier.value }; } @@ -79,8 +79,8 @@ export class MainThreadMessageService implements MainThreadMessageServiceShape { } const secondaryActions: IAction[] = []; - if (extension && !extension.isUnderDevelopment) { - secondaryActions.push(new ManageExtensionAction(extension.identifier, nls.localize('manageExtension', "Manage Extension"), this._commandService)); + if (options.source) { + secondaryActions.push(new ManageExtensionAction(options.source.identifier, nls.localize('manageExtension', "Manage Extension"), this._commandService)); } const messageHandle = this._notificationService.notify({ diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index 059fd2eb488..6dfeca21e4f 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -185,7 +185,7 @@ export interface MainThreadAuthenticationShape extends IDisposable { $unregisterAuthenticationProvider(id: string): void; $ensureProvider(id: string): Promise; $sendDidChangeSessions(providerId: string, event: modes.AuthenticationSessionsChangeEvent): void; - $getSession(providerId: string, scopes: readonly string[], extensionId: string, extensionName: string, options: { createIfNone?: boolean, forceNewSession?: boolean | { detail: string }, clearSessionPreference?: boolean }): Promise; + $getSession(providerId: string, scopes: readonly string[], extensionId: string, extensionName: string, options: { createIfNone?: boolean, forceNewSession?: boolean | { detail: string; }, clearSessionPreference?: boolean; }): Promise; $removeSession(providerId: string, sessionId: string): Promise; } @@ -303,9 +303,9 @@ export interface MainThreadTextEditorsShape extends IDisposable { } export interface MainThreadTreeViewsShape extends IDisposable { - $registerTreeViewDataProvider(treeViewId: string, options: { showCollapseAll: boolean, canSelectMany: boolean, dragAndDropMimeTypes: string[] | undefined, hasWillDrop: boolean }): Promise; + $registerTreeViewDataProvider(treeViewId: string, options: { showCollapseAll: boolean, canSelectMany: boolean, dragAndDropMimeTypes: string[] | undefined, hasWillDrop: boolean; }): Promise; $refresh(treeViewId: string, itemsToRefresh?: { [treeItemHandle: string]: ITreeItem; }): Promise; - $reveal(treeViewId: string, itemInfo: { item: ITreeItem, parentChain: ITreeItem[] } | undefined, options: IRevealOptions): Promise; + $reveal(treeViewId: string, itemInfo: { item: ITreeItem, parentChain: ITreeItem[]; } | undefined, options: IRevealOptions): Promise; $setMessage(treeViewId: string, message: string): void; $setTitle(treeViewId: string, title: string, description: string | undefined): void; } @@ -435,13 +435,13 @@ export interface MainThreadLanguageFeaturesShape extends IDisposable { export interface MainThreadLanguagesShape extends IDisposable { $changeLanguage(resource: UriComponents, languageId: string): Promise; - $tokensAtPosition(resource: UriComponents, position: IPosition): Promise; + $tokensAtPosition(resource: UriComponents, position: IPosition): Promise; $setLanguageStatus(handle: number, status: ILanguageStatus): void; $removeLanguageStatus(handle: number): void; } export interface MainThreadMessageOptions { - extension?: IExtensionDescription; + source?: { identifier: ExtensionIdentifier, label: string; }; modal?: boolean; detail?: string; useCustom?: boolean; @@ -483,7 +483,7 @@ export interface TerminalLaunchConfig { shellArgs?: string[] | string; cwd?: string | UriComponents; env?: ITerminalEnvironment; - icon?: URI | { light: URI; dark: URI } | ThemeIcon; + icon?: URI | { light: URI; dark: URI; } | ThemeIcon; color?: string; initialText?: string; waitOnExit?: boolean; @@ -493,7 +493,7 @@ export interface TerminalLaunchConfig { isFeatureTerminal?: boolean; isExtensionOwnedTerminal?: boolean; useShellEnvironment?: boolean; - location?: TerminalLocation | { viewColumn: number, preserveFocus?: boolean } | { parentTerminal: ExtHostTerminalIdentifier } | { splitActiveTerminal: boolean }; + location?: TerminalLocation | { viewColumn: number, preserveFocus?: boolean; } | { parentTerminal: ExtHostTerminalIdentifier; } | { splitActiveTerminal: boolean; }; disablePersistence?: boolean; } @@ -655,7 +655,7 @@ export interface IEditorTabDto { resource?: UriComponents; editorId?: string; isActive: boolean; - additionalResourcesAndViewIds: { resource?: UriComponents, viewId?: string }[] + additionalResourcesAndViewIds: { resource?: UriComponents, viewId?: string; }[]; } export interface IExtHostEditorTabsShape { @@ -740,7 +740,7 @@ export interface WebviewMessageArrayBufferReference { export interface MainThreadWebviewsShape extends IDisposable { $setHtml(handle: WebviewHandle, value: string): void; $setOptions(handle: WebviewHandle, options: IWebviewContentOptions): void; - $postMessage(handle: WebviewHandle, value: string, ...buffers: VSBuffer[]): Promise + $postMessage(handle: WebviewHandle, value: string, ...buffers: VSBuffer[]): Promise; } export interface IWebviewIconPath { @@ -768,7 +768,7 @@ export interface MainThreadWebviewPanelsShape extends IDisposable { $setTitle(handle: WebviewHandle, value: string): void; $setIconPath(handle: WebviewHandle, value: IWebviewIconPath | undefined): void; - $registerSerializer(viewType: string, options: { serializeBuffersForPostMessage: boolean }): void; + $registerSerializer(viewType: string, options: { serializeBuffersForPostMessage: boolean; }): void; $unregisterSerializer(viewType: string): void; } @@ -782,7 +782,7 @@ export interface MainThreadCustomEditorsShape extends IDisposable { } export interface MainThreadWebviewViewsShape extends IDisposable { - $registerWebviewViewProvider(extension: WebviewExtensionDescription, viewType: string, options: { retainContextWhenHidden?: boolean, serializeBuffersForPostMessage: boolean }): void; + $registerWebviewViewProvider(extension: WebviewExtensionDescription, viewType: string, options: { retainContextWhenHidden?: boolean, serializeBuffersForPostMessage: boolean; }): void; $unregisterWebviewViewProvider(viewType: string): void; $setWebviewViewTitle(handle: WebviewHandle, value: string | undefined): void; @@ -833,7 +833,7 @@ export interface ExtHostCustomEditorsShape { position: EditorGroupColumn, cancellation: CancellationToken ): Promise; - $createCustomDocument(resource: UriComponents, viewType: string, backupId: string | undefined, untitledDocumentData: VSBuffer | undefined, cancellation: CancellationToken): Promise<{ editable: boolean }>; + $createCustomDocument(resource: UriComponents, viewType: string, backupId: string | undefined, untitledDocumentData: VSBuffer | undefined, cancellation: CancellationToken): Promise<{ editable: boolean; }>; $disposeCustomDocument(resource: UriComponents, viewType: string): Promise; $undo(resource: UriComponents, viewType: string, editId: number, isDirty: boolean): Promise; @@ -904,11 +904,11 @@ export interface MainThreadNotebookEditorsShape extends IDisposable { $removeNotebookEditorDecorationType(key: string): void; $trySetSelections(id: string, range: ICellRange[]): void; $trySetDecorations(id: string, range: ICellRange, decorationKey: string): void; - $tryApplyEdits(editorId: string, modelVersionId: number, cellEdits: ICellEditOperationDto[]): Promise + $tryApplyEdits(editorId: string, modelVersionId: number, cellEdits: ICellEditOperationDto[]): Promise; } export interface MainThreadNotebookDocumentsShape extends IDisposable { - $tryCreateNotebook(options: { viewType: string, content?: NotebookDataDto }): Promise; + $tryCreateNotebook(options: { viewType: string, content?: NotebookDataDto; }): Promise; $tryOpenNotebook(uriComponents: UriComponents): Promise; $trySaveNotebook(uri: UriComponents): Promise; } @@ -925,7 +925,7 @@ export interface INotebookKernelDto2 { supportedLanguages?: string[]; supportsInterrupt?: boolean; supportsExecutionOrder?: boolean; - preloads?: { uri: UriComponents; provides: string[] }[]; + preloads?: { uri: UriComponents; provides: string[]; }[]; } export interface ICellExecuteOutputEditDto { @@ -933,7 +933,7 @@ export interface ICellExecuteOutputEditDto { uri: UriComponents; cellHandle: number; append?: boolean; - outputs: NotebookOutputDto[] + outputs: NotebookOutputDto[]; } export interface ICellExecuteOutputItemEditDto { @@ -942,7 +942,7 @@ export interface ICellExecuteOutputItemEditDto { cellHandle: number; append?: boolean; outputId: string; - items: NotebookOutputItemDto[] + items: NotebookOutputItemDto[]; } export interface ICellExecutionStateUpdateDto extends ICellExecutionStateUpdate { @@ -993,7 +993,7 @@ export interface MainThreadUriOpenersShape extends IDisposable { export interface ExtHostUriOpenersShape { $canOpenUri(id: string, uri: UriComponents, token: CancellationToken): Promise; - $openUri(id: string, context: { resolvedUri: UriComponents, sourceUri: UriComponents }, token: CancellationToken): Promise; + $openUri(id: string, context: { resolvedUri: UriComponents, sourceUri: UriComponents; }, token: CancellationToken): Promise; } export interface ITextSearchComplete { @@ -1189,7 +1189,7 @@ export interface PortAttributesProviderSelector { export interface MainThreadTunnelServiceShape extends IDisposable { $openTunnel(tunnelOptions: TunnelOptions, source: string | undefined): Promise; - $closeTunnel(remote: { host: string, port: number }): Promise; + $closeTunnel(remote: { host: string, port: number; }): Promise; $getTunnels(): Promise; $setTunnelProvider(features: TunnelProviderFeatures): Promise; $setRemoteTunnelService(processId: number): Promise; @@ -1335,7 +1335,7 @@ export interface ExtHostAuthenticationShape { } export interface ExtHostSecretStateShape { - $onDidChangePassword(e: { extensionId: string, key: string }): Promise; + $onDidChangePassword(e: { extensionId: string, key: string; }): Promise; } export interface ExtHostSearchShape { @@ -1392,7 +1392,7 @@ export interface SourceTargetPair { export interface IWillRunFileOperationParticipation { edit: IWorkspaceEditDto; - extensionNames: string[] + extensionNames: string[]; } export interface ExtHostFileSystemEventServiceShape { @@ -1513,8 +1513,8 @@ export interface IInlayHintDto { } export interface IInlayHintsDto { - cacheId?: CacheId - hints: IInlayHintDto[] + cacheId?: CacheId; + hints: IInlayHintDto[]; } export interface ILocationDto { @@ -1544,7 +1544,7 @@ export interface IWorkspaceEditEntryMetadataDto { needsConfirmation: boolean; label: string; description?: string; - iconPath?: { id: string } | UriComponents | { light: UriComponents, dark: UriComponents }; + iconPath?: { id: string; } | UriComponents | { light: UriComponents, dark: UriComponents; }; } export const enum WorkspaceEditType { @@ -1557,7 +1557,7 @@ export interface IWorkspaceFileEditDto { _type: WorkspaceEditType.File; oldUri?: UriComponents; newUri?: UriComponents; - options?: modes.WorkspaceFileEditOptions + options?: modes.WorkspaceFileEditOptions; metadata?: IWorkspaceEditEntryMetadataDto; } @@ -1576,7 +1576,7 @@ export type ICellEditOperationDto = editType: notebookCommon.CellEditType.Replace, index: number, count: number, - cells: NotebookCellDataDto[] + cells: NotebookCellDataDto[]; }; export interface IWorkspaceCellEditDto { @@ -1628,7 +1628,7 @@ export interface ICodeActionListDto { export interface ICodeActionProviderMetadataDto { readonly providedKinds?: readonly string[]; - readonly documentation?: ReadonlyArray<{ readonly kind: string, readonly command: ICommandDto }>; + readonly documentation?: ReadonlyArray<{ readonly kind: string, readonly command: ICommandDto; }>; } export type CacheId = number; @@ -1672,7 +1672,7 @@ export interface IOutgoingCallDto { export interface ILanguageWordDefinitionDto { languageId: string; regexSource: string; - regexFlags: string + regexFlags: string; } export interface ILinkedEditingRangesDto { @@ -1711,7 +1711,7 @@ export interface ExtHostLanguageFeaturesShape { $provideWorkspaceSymbols(handle: number, search: string, token: CancellationToken): Promise; $resolveWorkspaceSymbol(handle: number, symbol: IWorkspaceSymbolDto, token: CancellationToken): Promise; $releaseWorkspaceSymbols(handle: number, id: number): void; - $provideRenameEdits(handle: number, resource: UriComponents, position: IPosition, newName: string, token: CancellationToken): Promise; + $provideRenameEdits(handle: number, resource: UriComponents, position: IPosition, newName: string, token: CancellationToken): Promise; $resolveRenameLocation(handle: number, resource: UriComponents, position: IPosition, token: CancellationToken): Promise; $provideDocumentSemanticTokens(handle: number, resource: UriComponents, previousResultId: number, token: CancellationToken): Promise; $releaseDocumentSemanticTokens(handle: number, semanticColoringResultId: number): void; @@ -1724,7 +1724,7 @@ export interface ExtHostLanguageFeaturesShape { $freeInlineCompletionsList(handle: number, pid: number): void; $provideSignatureHelp(handle: number, resource: UriComponents, position: IPosition, context: modes.SignatureHelpContext, token: CancellationToken): Promise; $releaseSignatureHelp(handle: number, id: number): void; - $provideInlayHints(handle: number, resource: UriComponents, range: IRange, token: CancellationToken): Promise + $provideInlayHints(handle: number, resource: UriComponents, range: IRange, token: CancellationToken): Promise; $resolveInlayHint(handle: number, id: ChainedCacheId, token: CancellationToken): Promise; $releaseInlayHints(handle: number, id: number): void; $provideDocumentLinks(handle: number, resource: UriComponents, token: CancellationToken): Promise; @@ -1974,7 +1974,7 @@ export interface INotebookEditorAddData { documentUri: UriComponents; selections: ICellRange[]; visibleRanges: ICellRange[]; - viewColumn?: number + viewColumn?: number; } export interface INotebookDocumentsAndEditorsDelta { @@ -2125,7 +2125,7 @@ export interface MainThreadThemingShape extends IDisposable { export interface ExtHostTunnelServiceShape { $forwardPort(tunnelOptions: TunnelOptions, tunnelCreationOptions: TunnelCreationOptions): Promise; - $closeTunnel(remote: { host: string, port: number }, silent?: boolean): Promise; + $closeTunnel(remote: { host: string, port: number; }, silent?: boolean): Promise; $onDidTunnelsChange(): Promise; $registerCandidateFinder(enable: boolean): Promise; $applyCandidateFilter(candidates: CandidatePort[]): Promise; diff --git a/src/vs/workbench/api/common/extHostMessageService.ts b/src/vs/workbench/api/common/extHostMessageService.ts index be719110986..a9a9c5b6e17 100644 --- a/src/vs/workbench/api/common/extHostMessageService.ts +++ b/src/vs/workbench/api/common/extHostMessageService.ts @@ -31,7 +31,9 @@ export class ExtHostMessageService { showMessage(extension: IExtensionDescription, severity: Severity, message: string, optionsOrFirstItem: vscode.MessageOptions | vscode.MessageItem | string | undefined, rest: Array): Promise; showMessage(extension: IExtensionDescription, severity: Severity, message: string, optionsOrFirstItem: vscode.MessageOptions | string | vscode.MessageItem | undefined, rest: Array): Promise { - const options: MainThreadMessageOptions = { extension }; + const options: MainThreadMessageOptions = { + source: { identifier: extension.identifier, label: extension.displayName || extension.name } + }; let items: (string | vscode.MessageItem)[]; if (typeof optionsOrFirstItem === 'string' || isMessageItem(optionsOrFirstItem)) { diff --git a/src/vs/workbench/api/common/extHostWorkspace.ts b/src/vs/workbench/api/common/extHostWorkspace.ts index b499cde36ae..00ce08840b3 100644 --- a/src/vs/workbench/api/common/extHostWorkspace.ts +++ b/src/vs/workbench/api/common/extHostWorkspace.ts @@ -28,7 +28,7 @@ import { Range, RelativePattern } from 'vs/workbench/api/common/extHostTypes'; import { ITextQueryBuilderOptions } from 'vs/workbench/contrib/search/common/queryBuilder'; import { IRawFileMatch2, resultIsMatch } from 'vs/workbench/services/search/common/search'; import * as vscode from 'vscode'; -import { ExtHostWorkspaceShape, IWorkspaceData, MainContext, MainThreadMessageServiceShape, MainThreadWorkspaceShape } from './extHost.protocol'; +import { ExtHostWorkspaceShape, IWorkspaceData, MainContext, MainThreadMessageOptions, MainThreadMessageServiceShape, MainThreadWorkspaceShape } from './extHost.protocol'; export interface IExtHostWorkspaceProvider { getWorkspaceFolder2(uri: vscode.Uri, resolveParent?: boolean): Promise; @@ -53,7 +53,7 @@ function compareWorkspaceFolderByUriAndNameAndIndex(a: vscode.WorkspaceFolder, b return isFolderEqual(a.uri, b.uri, extHostFileSystemInfo) ? compare(a.name, b.name) : compare(a.uri.toString(), b.uri.toString()); } -function delta(oldFolders: vscode.WorkspaceFolder[], newFolders: vscode.WorkspaceFolder[], compare: (a: vscode.WorkspaceFolder, b: vscode.WorkspaceFolder, extHostFileSystemInfo: IExtHostFileSystemInfo) => number, extHostFileSystemInfo: IExtHostFileSystemInfo): { removed: vscode.WorkspaceFolder[], added: vscode.WorkspaceFolder[] } { +function delta(oldFolders: vscode.WorkspaceFolder[], newFolders: vscode.WorkspaceFolder[], compare: (a: vscode.WorkspaceFolder, b: vscode.WorkspaceFolder, extHostFileSystemInfo: IExtHostFileSystemInfo) => number, extHostFileSystemInfo: IExtHostFileSystemInfo): { removed: vscode.WorkspaceFolder[], added: vscode.WorkspaceFolder[]; } { const oldSortedFolders = oldFolders.slice(0).sort((a, b) => compare(a, b, extHostFileSystemInfo)); const newSortedFolders = newFolders.slice(0).sort((a, b) => compare(a, b, extHostFileSystemInfo)); @@ -72,7 +72,7 @@ interface MutableWorkspaceFolder extends vscode.WorkspaceFolder { class ExtHostWorkspaceImpl extends Workspace { - static toExtHostWorkspace(data: IWorkspaceData | null, previousConfirmedWorkspace: ExtHostWorkspaceImpl | undefined, previousUnconfirmedWorkspace: ExtHostWorkspaceImpl | undefined, extHostFileSystemInfo: IExtHostFileSystemInfo): { workspace: ExtHostWorkspaceImpl | null, added: vscode.WorkspaceFolder[], removed: vscode.WorkspaceFolder[] } { + static toExtHostWorkspace(data: IWorkspaceData | null, previousConfirmedWorkspace: ExtHostWorkspaceImpl | undefined, previousUnconfirmedWorkspace: ExtHostWorkspaceImpl | undefined, extHostFileSystemInfo: IExtHostFileSystemInfo): { workspace: ExtHostWorkspaceImpl | null, added: vscode.WorkspaceFolder[], removed: vscode.WorkspaceFolder[]; } { if (!data) { return { workspace: null, added: [], removed: [] }; } @@ -256,8 +256,8 @@ export class ExtHostWorkspace implements ExtHostWorkspaceShape, IExtHostWorkspac return this._actualWorkspace.workspaceFolders.slice(0); } - updateWorkspaceFolders(extension: IExtensionDescription, index: number, deleteCount: number, ...workspaceFoldersToAdd: { uri: vscode.Uri, name?: string }[]): boolean { - const validatedDistinctWorkspaceFoldersToAdd: { uri: vscode.Uri, name?: string }[] = []; + updateWorkspaceFolders(extension: IExtensionDescription, index: number, deleteCount: number, ...workspaceFoldersToAdd: { uri: vscode.Uri, name?: string; }[]): boolean { + const validatedDistinctWorkspaceFoldersToAdd: { uri: vscode.Uri, name?: string; }[] = []; if (Array.isArray(workspaceFoldersToAdd)) { workspaceFoldersToAdd.forEach(folderToAdd => { if (URI.isUri(folderToAdd.uri) && !validatedDistinctWorkspaceFoldersToAdd.some(f => isFolderEqual(f.uri, folderToAdd.uri, this._extHostFileSystemInfo))) { @@ -310,7 +310,8 @@ export class ExtHostWorkspace implements ExtHostWorkspaceShape, IExtHostWorkspac this._unconfirmedWorkspace = undefined; // show error to user - this._messageService.$showMessage(Severity.Error, localize('updateerror', "Extension '{0}' failed to update workspace folders: {1}", extName, error.toString()), { extension }, []); + const options: MainThreadMessageOptions = { source: { identifier: extension.identifier, label: extension.displayName || extension.name } }; + this._messageService.$showMessage(Severity.Error, localize('updateerror', "Extension '{0}' failed to update workspace folders: {1}", extName, error.toString()), options, []); }); } @@ -578,7 +579,7 @@ export class ExtHostWorkspace implements ExtHostWorkspaceShape, IExtHostWorkspac export const IExtHostWorkspace = createDecorator('IExtHostWorkspace'); export interface IExtHostWorkspace extends ExtHostWorkspace, ExtHostWorkspaceShape, IExtHostWorkspaceProvider { } -function parseSearchInclude(include: RelativePattern | string | undefined): { includePattern?: string, folder?: URI } { +function parseSearchInclude(include: RelativePattern | string | undefined): { includePattern?: string, folder?: URI; } { let includePattern: string | undefined; let includeFolder: URI | undefined; if (include) {