Path: blob/main/src/vs/workbench/services/extensions/common/extensionsUtil.ts
3296 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import { ExtensionIdentifierMap, IExtensionDescription } from '../../../../platform/extensions/common/extensions.js';6import { localize } from '../../../../nls.js';7import { ILogService } from '../../../../platform/log/common/log.js';8import * as semver from '../../../../base/common/semver/semver.js';9import { Mutable } from '../../../../base/common/types.js';1011// TODO: @sandy081 merge this with deduping in extensionsScannerService.ts12export function dedupExtensions(system: IExtensionDescription[], user: IExtensionDescription[], workspace: IExtensionDescription[], development: IExtensionDescription[], logService: ILogService): IExtensionDescription[] {13const result = new ExtensionIdentifierMap<IExtensionDescription>();14system.forEach((systemExtension) => {15const extension = result.get(systemExtension.identifier);16if (extension) {17logService.warn(localize('overwritingExtension', "Overwriting extension {0} with {1}.", extension.extensionLocation.fsPath, systemExtension.extensionLocation.fsPath));18}19result.set(systemExtension.identifier, systemExtension);20});21user.forEach((userExtension) => {22const extension = result.get(userExtension.identifier);23if (extension) {24if (extension.isBuiltin) {25if (semver.gte(extension.version, userExtension.version)) {26logService.warn(`Skipping extension ${userExtension.extensionLocation.path} in favour of the builtin extension ${extension.extensionLocation.path}.`);27return;28}29// Overwriting a builtin extension inherits the `isBuiltin` property and it doesn't show a warning30(<Mutable<IExtensionDescription>>userExtension).isBuiltin = true;31} else {32logService.warn(localize('overwritingExtension', "Overwriting extension {0} with {1}.", extension.extensionLocation.fsPath, userExtension.extensionLocation.fsPath));33}34} else if (userExtension.isBuiltin) {35logService.warn(`Skipping obsolete builtin extension ${userExtension.extensionLocation.path}`);36return;37}38result.set(userExtension.identifier, userExtension);39});40workspace.forEach(workspaceExtension => {41const extension = result.get(workspaceExtension.identifier);42if (extension) {43logService.warn(localize('overwritingWithWorkspaceExtension', "Overwriting {0} with Workspace Extension {1}.", extension.extensionLocation.fsPath, workspaceExtension.extensionLocation.fsPath));44}45result.set(workspaceExtension.identifier, workspaceExtension);46});47development.forEach(developedExtension => {48logService.info(localize('extensionUnderDevelopment', "Loading development extension at {0}", developedExtension.extensionLocation.fsPath));49const extension = result.get(developedExtension.identifier);50if (extension) {51if (extension.isBuiltin) {52// Overwriting a builtin extension inherits the `isBuiltin` property53(<Mutable<IExtensionDescription>>developedExtension).isBuiltin = true;54}55}56result.set(developedExtension.identifier, developedExtension);57});58return Array.from(result.values());59}606162