src/vs/workbench/services/extensions/electron-sandbox/cachedExtensionScanner.ts/CachedExtensionScanner/_scanInstalledExtensions
class CachedExtensionScanner:	private async _scanInstalledExtensions(): Promise<{ system: IExtensionDescription[]; user: IExtensionDescription[]; development: IExtensionDescription[] }> {
		const language = platform.language;

		const builtinExtensions = this._extensionsScannerService.scanSystemExtensions({ language, useCache: true, checkControlFile: true })
			.then(scannedExtensions => scannedExtensions.map(e => toExtensionDescription(e, false)));

		const userExtensions = this._extensionsScannerService.scanUserExtensions({ language, useCache: true })
			.then(scannedExtensions => scannedExtensions.map(e => toExtensionDescription(e, false)));

		const developedExtensions = this._extensionsScannerService.scanExtensionsUnderDevelopment({ language })
			.then(scannedExtensions => scannedExtensions.map(e => toExtensionDescription(e, true)));

		return Promise.all([builtinExtensions, userExtensions, developedExtensions]).then((extensionDescriptions: IExtensionDescription[][]) => {
			const system = extensionDescriptions[0];
			const user = extensionDescriptions[1];
			const development = extensionDescriptions[2];
			const disposable = this._extensionsScannerService.onDidChangeCache(() => {
				disposable.dispose();
				this._notificationService.prompt(
					Severity.Error,
					localize('extensionCache.invalid', "Extensions have been modified on disk. Please reload the window."),
					[{
						label: localize('reloadWindow', "Reload Window"),
						run: () => this._hostService.reload()
					}]
				);
			});
			timeout(5000).then(() => disposable.dispose());
			return { system, user, development };
		}).then(undefined, err => {
			this._logService.error(`Error scanning installed extensions:`);
			this._logService.error(err);
			return { system: [], user: [], development: [] };
		});
	}