From afafd98f3ff57a901a2ac42a159bdc2214bd8921 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Fri, 11 Feb 2022 10:04:36 +0100 Subject: [PATCH] Fix #136301 --- src/vs/base/common/product.ts | 2 +- .../extensions/browser/fileBasedRecommendations.ts | 12 ++++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/vs/base/common/product.ts b/src/vs/base/common/product.ts index 277e8731d14..bb2a3d60341 100644 --- a/src/vs/base/common/product.ts +++ b/src/vs/base/common/product.ts @@ -152,7 +152,7 @@ export interface IProductConfiguration { readonly darwinUniversalAssetId?: string; } -export type ImportantExtensionTip = { name: string; languages?: string[]; pattern?: string; isExtensionPack?: boolean }; +export type ImportantExtensionTip = { name: string; languages?: string[]; pattern?: string; isExtensionPack?: boolean; whenNotInstalled?: string[] }; export interface IAppCenterConfiguration { readonly 'win32-ia32': string; diff --git a/src/vs/workbench/contrib/extensions/browser/fileBasedRecommendations.ts b/src/vs/workbench/contrib/extensions/browser/fileBasedRecommendations.ts index 66b7f7280ab..51398377e56 100644 --- a/src/vs/workbench/contrib/extensions/browser/fileBasedRecommendations.ts +++ b/src/vs/workbench/contrib/extensions/browser/fileBasedRecommendations.ts @@ -34,6 +34,7 @@ import { disposableTimeout } from 'vs/base/common/async'; import { IPaneCompositePartService } from 'vs/workbench/services/panecomposite/browser/panecomposite'; import { ViewContainerLocation } from 'vs/workbench/common/views'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; +import { areSameExtensions } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; type FileExtensionSuggestionClassification = { userReaction: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; @@ -197,7 +198,15 @@ export class FileBasedRecommendations extends ExtensionRecommendations { } private async promptRecommendations(uri: URI, language: string, fileExtension: string): Promise { - const importantRecommendations: string[] = (this.fileBasedRecommendationsByLanguage.get(language) || []).filter(extensionId => this.importantExtensionTips.has(extensionId)); + const installed = await this.extensionsWorkbenchService.queryLocal(); + const importantRecommendations: string[] = (this.fileBasedRecommendationsByLanguage.get(language) || []) + .filter(extensionId => { + const importantTip = this.importantExtensionTips.get(extensionId); + if (importantTip) { + return !importantTip.whenNotInstalled || importantTip.whenNotInstalled.every(id => installed.every(local => !areSameExtensions(local.identifier, { id }))); + } + return false; + }); let languageName: string | null = importantRecommendations.length ? this.languageService.getLanguageName(language) : null; const fileBasedRecommendations: string[] = [...importantRecommendations]; @@ -231,7 +240,6 @@ export class FileBasedRecommendations extends ExtensionRecommendations { return; } - const installed = await this.extensionsWorkbenchService.queryLocal(); if (importantRecommendations.length && await this.promptRecommendedExtensionForFileType(languageName || basename(uri), language, importantRecommendations, installed)) { return;