diff --git a/packages/plugin-ext/src/hosted/node/plugin-host-rpc.ts b/packages/plugin-ext/src/hosted/node/plugin-host-rpc.ts index 10054cac27b9a..4fbc8f817b64b 100644 --- a/packages/plugin-ext/src/hosted/node/plugin-host-rpc.ts +++ b/packages/plugin-ext/src/hosted/node/plugin-host-rpc.ts @@ -102,47 +102,43 @@ export class PluginHostRPC { // eslint-disable-next-line @typescript-eslint/no-explicit-any loadPlugin(plugin: Plugin): any { console.log('PLUGIN_HOST(' + process.pid + '): PluginManagerExtImpl/loadPlugin(' + plugin.pluginPath + ')'); - try { - // cleaning the cache for all files of that plug-in. - Object.keys(require.cache).forEach(function (key): void { - const mod: NodeJS.Module = require.cache[key]; + // cleaning the cache for all files of that plug-in. + Object.keys(require.cache).forEach(function (key): void { + const mod: NodeJS.Module = require.cache[key]; - // attempting to reload a native module will throw an error, so skip them - if (mod.id.endsWith('.node')) { - return; - } + // attempting to reload a native module will throw an error, so skip them + if (mod.id.endsWith('.node')) { + return; + } - // remove children that are part of the plug-in - let i = mod.children.length; - while (i--) { - const childMod: NodeJS.Module = mod.children[i]; - // ensure the child module is not null, is in the plug-in folder, and is not a native module (see above) - if (childMod && childMod.id.startsWith(plugin.pluginFolder) && !childMod.id.endsWith('.node')) { - // cleanup exports - note that some modules (e.g. ansi-styles) define their - // exports in an immutable manner, so overwriting the exports throws an error - delete childMod.exports; - mod.children.splice(i, 1); - for (let j = 0; j < childMod.children.length; j++) { - delete childMod.children[j]; - } + // remove children that are part of the plug-in + let i = mod.children.length; + while (i--) { + const childMod: NodeJS.Module = mod.children[i]; + // ensure the child module is not null, is in the plug-in folder, and is not a native module (see above) + if (childMod && childMod.id.startsWith(plugin.pluginFolder) && !childMod.id.endsWith('.node')) { + // cleanup exports - note that some modules (e.g. ansi-styles) define their + // exports in an immutable manner, so overwriting the exports throws an error + delete childMod.exports; + mod.children.splice(i, 1); + for (let j = 0; j < childMod.children.length; j++) { + delete childMod.children[j]; } } + } - if (key.startsWith(plugin.pluginFolder)) { - // delete entry - delete require.cache[key]; - const ix = mod.parent!.children.indexOf(mod); - if (ix >= 0) { - mod.parent!.children.splice(ix, 1); - } + if (key.startsWith(plugin.pluginFolder)) { + // delete entry + delete require.cache[key]; + const ix = mod.parent!.children.indexOf(mod); + if (ix >= 0) { + mod.parent!.children.splice(ix, 1); } - - }); - if (plugin.pluginPath) { - return require(plugin.pluginPath); } - } catch (e) { - console.error(e); + + }); + if (plugin.pluginPath) { + return require(plugin.pluginPath); } }, async init(raw: PluginMetadata[]): Promise<[Plugin[], Plugin[]]> { diff --git a/packages/plugin-ext/src/plugin/plugin-manager.ts b/packages/plugin-ext/src/plugin/plugin-manager.ts index 87b946bd9ffa5..b1a5f4c488496 100644 --- a/packages/plugin-ext/src/plugin/plugin-manager.ts +++ b/packages/plugin-ext/src/plugin/plugin-manager.ts @@ -291,6 +291,14 @@ export class PluginManagerExtImpl implements PluginManagerExt, PluginManager { // see https://github.com/TypeFox/vscode/blob/70b8db24a37fafc77247de7f7cb5bb0195120ed0/src/vs/workbench/api/common/extHostExtensionService.ts#L372-L376 pluginMain = pluginMain || {}; return await this.startPlugin(plugin, configStorage, pluginMain); + } catch (err) { + if (this.pluginActivationPromises.has(plugin.model.id)) { + this.pluginActivationPromises.get(plugin.model.id)!.reject(err); + } + const message = `Activating extension '${plugin.model.displayName || plugin.model.name}' failed: ${err.message}`; + this.messageRegistryProxy.$showMessage(MainMessageType.Error, message, {}, []); + console.error(message); + return false; } finally { this.notificationMain.$stopProgress(progressId); }