Change:
<!-- Do Not Delete This! bugreporttemplate --<!-- Please read our Rules of Conduct: --<!-- Please search existing issues to avoid creating duplicates. --<!-- Also please test using the latest insiders build to make sure your issue has not already been fixed: --<!-- Use Help Report Issue to prefill these. --- VSCode Version: 1.46.0 OS Version: Windows 10/macOS Catalina 10.15.4 VS Code 1.46 no longer executes the Attached test extension (rename file extension to .vsix) which creates a file on uninstall in the user's home directory. Using VS Code 1.45.1 the file is created on both Windows and macOS. Using VS Code 1.46 no file is created. Steps to Reproduce: attached extension extension VS Code VS Code again file is created <!-- Launch with to check. --Does this issue occur when all extensions are disabled?: This is an extension management problem

Discussion:
import { Schemas } from 'vs/base/common/network'; import { INativeEnvironmentService } from 'vs/platform/environment/node/environmentService'; import { rimraf } from 'vs/base/node/pfs'; <ins> import { IEnvironmentService } from 'vs/platform/environment/common/environment'; </ins> export class ExtensionsLifecycle extends Disposable { private processesLimiter: Limiter<void> = new Limiter(5); // Run max 5 processes in parallel constructor( <del> private environmentService: INativeEnvironmentService, private logService: ILogService </del> <ins> @IEnvironmentService private environmentService: INativeEnvironmentService, @ILogService private readonly logService: ILogService </ins> ) { super(); }

@IInstantiationService instantiationService: IInstantiationService, ) { super(); <del> this.extensionsScanner = this._register(instantiationService.createInstance(ExtensionsScanner)); </del> <ins> const extensionLifecycle = this._register(instantiationService.createInstance(ExtensionsLifecycle)); this.extensionsScanner = this._register(instantiationService.createInstance(ExtensionsScanner, extension => extensionLifecycle.postUninstall(extension))); </ins> this.manifestCache = this._register(new ExtensionsManifestCache(environmentService, this)); this.extensionsDownloader = this._register(instantiationService.createInstance(ExtensionsDownloader));

this.installingExtensions.clear(); this.uninstallingExtensions.clear(); })); <del> const extensionLifecycle = this._register(new ExtensionsLifecycle(environmentService, this.logService)); this._register(this.extensionsScanner.onDidRemoveExtension(extension => extensionLifecycle.postUninstall(extension))); </del> } zip(extension: ILocalExtension): Promise<URI> {

import { extract, ExtractError } from 'vs/base/node/zip'; import { isWindows } from 'vs/base/common/platform'; import { flatten } from 'vs/base/common/arrays'; <del> import { Emitter } from 'vs/base/common/event'; </del> import { assign } from 'vs/base/common/objects'; const ERROR_SCANNING_SYS_EXTENSIONS = 'scanningSystem';

private readonly uninstalledPath: string; private readonly uninstalledFileLimiter: Queue<any>; <del> private _onDidRemoveExtension = new Emitter<ILocalExtension>(); readonly onDidRemoveExtension = this._onDidRemoveExtension.event; </del> constructor( <ins> private readonly beforeRemovingExtension: (e: ILocalExtension) => Promise<void>, </ins> @ILogService private readonly logService: ILogService, @IEnvironmentService private readonly environmentService: INativeEnvironmentService, @IProductService private readonly productService: IProductService,

await Promise.all(byExtension.map(async e => { const latest = e.sort((a, b) => semver.rcompare(a.manifest.version, b.manifest.version))[0]; if (!installed.has(latest.identifier.id.toLowerCase())) { <del> this._onDidRemoveExtension.fire(latest); </del> <ins> await this.beforeRemovingExtension(latest); </ins> } })); const toRemove: ILocalExtension[] = extensions.filter(e => uninstalled[new ExtensionIdentifierWithVersion(e.identifier, e.manifest.version).key()]);