diff --git a/src/vs/workbench/api/common/extHost.api.impl.ts b/src/vs/workbench/api/common/extHost.api.impl.ts index 88ef2492dec..864b227de8e 100644 --- a/src/vs/workbench/api/common/extHost.api.impl.ts +++ b/src/vs/workbench/api/common/extHost.api.impl.ts @@ -91,7 +91,7 @@ import { ExtHostNotebookEditors } from 'vs/workbench/api/common/extHostNotebookE import { ExtHostNotebookDocuments } from 'vs/workbench/api/common/extHostNotebookDocuments'; import { ExtHostInteractive } from 'vs/workbench/api/common/extHostInteractive'; import { combinedDisposable } from 'vs/base/common/lifecycle'; -import { checkProposedApiEnabled, isProposedApiEnabled } from 'vs/workbench/services/extensions/common/extensions'; +import { checkProposedApiEnabled, ExtensionIdentifierSet, isProposedApiEnabled } from 'vs/workbench/services/extensions/common/extensions'; import { DebugConfigurationProviderTriggerKind } from 'vs/workbench/contrib/debug/common/debug'; import { ExtHostNotebookProxyKernels } from 'vs/workbench/api/common/extHostNotebookProxyKernels'; @@ -419,12 +419,11 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I }, get allAcrossExtensionHosts(): vscode.Extension[] { checkProposedApiEnabled(extension, 'extensionsAny'); + const local = new ExtensionIdentifierSet(extensionInfo.mine.getAllExtensionDescriptions().map(desc => desc.identifier)); const result: vscode.Extension[] = []; - for (const desc of extensionInfo.mine.getAllExtensionDescriptions()) { - result.push(new Extension(extensionService, extension.identifier, desc, extensionKind, false)); - } for (const desc of extensionInfo.all.getAllExtensionDescriptions()) { - result.push(new Extension(extensionService, extension.identifier, desc, extensionKind /* TODO@alexdima THIS IS WRONG */, true)); + const isFromDifferentExtensionHost = !local.has(desc.identifier); + result.push(new Extension(extensionService, extension.identifier, desc, extensionKind /* TODO@alexdima THIS IS WRONG */, isFromDifferentExtensionHost)); } return result; }, diff --git a/src/vs/workbench/services/extensions/common/extensions.ts b/src/vs/workbench/services/extensions/common/extensions.ts index 1a564e9a491..722dba8dd6b 100644 --- a/src/vs/workbench/services/extensions/common/extensions.ts +++ b/src/vs/workbench/services/extensions/common/extensions.ts @@ -283,6 +283,65 @@ export class ExtensionHostExtensions { } } +export class ExtensionIdentifierSet implements Set { + + readonly [Symbol.toStringTag]: string = 'ExtensionIdentifierSet'; + + private readonly _map = new Map(); + private readonly _toKey = ExtensionIdentifier.toKey; + + constructor(values?: Iterable) { + if (values) { + for (const value of values) { + this.add(value); + } + } + } + + get size(): number { + return this._map.size; + } + + add(value: ExtensionIdentifier): this { + this._map.set(this._toKey(value), value); + return this; + } + + clear(): void { + this._map.clear(); + } + + delete(value: ExtensionIdentifier): boolean { + return this._map.delete(this._toKey(value)); + } + + has(value: ExtensionIdentifier): boolean { + return this._map.has(this._toKey(value)); + } + + forEach(callbackfn: (value: ExtensionIdentifier, value2: ExtensionIdentifier, set: Set) => void, thisArg?: any): void { + this._map.forEach(value => callbackfn.call(thisArg, value, value, this)); + } + + *entries(): IterableIterator<[ExtensionIdentifier, ExtensionIdentifier]> { + for (let [_key, value] of this._map) { + yield [value, value]; + } + } + + keys(): IterableIterator { + return this._map.values(); + } + + values(): IterableIterator { + return this._map.values(); + } + + [Symbol.iterator](): IterableIterator { + return this._map.values(); + } +} + export function extensionIdentifiersArrayToSet(extensionIds: ExtensionIdentifier[]): Set { const result = new Set(); for (const extensionId of extensionIds) {