diff --git a/arduino-ide-extension/src/node/arduino-ide-backend-module.ts b/arduino-ide-extension/src/node/arduino-ide-backend-module.ts index 09294f96b..3c968ae23 100644 --- a/arduino-ide-extension/src/node/arduino-ide-backend-module.ts +++ b/arduino-ide-extension/src/node/arduino-ide-backend-module.ts @@ -111,6 +111,8 @@ import { IsTempSketch } from './is-temp-sketch'; import { rebindNsfwFileSystemWatcher } from './theia/filesystem/nsfw-watcher/nsfw-bindings'; import { MessagingContribution } from './theia/core/messaging-contribution'; import { MessagingService } from '@theia/core/lib/node/messaging/messaging-service'; +import { HostedPluginReader } from './theia/plugin-ext/plugin-reader'; +import { HostedPluginReader as TheiaHostedPluginReader } from '@theia/plugin-ext/lib/hosted/node/plugin-reader'; export default new ContainerModule((bind, unbind, isBound, rebind) => { bind(BackendApplication).toSelf().inSingletonScope(); @@ -384,6 +386,12 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { rebind(MessagingService.Identifier) .to(MessagingContribution) .inSingletonScope(); + + // Removed undesired contributions from VS Code extensions + // Such as the RTOS view from the `cortex-debug` extension + // https://github.com/arduino/arduino-ide/pull/1706#pullrequestreview-1195595080 + bind(HostedPluginReader).toSelf().inSingletonScope(); + rebind(TheiaHostedPluginReader).toService(HostedPluginReader); }); function bindChildLogger(bind: interfaces.Bind, name: string): void { diff --git a/arduino-ide-extension/src/node/theia/plugin-ext/plugin-reader.ts b/arduino-ide-extension/src/node/theia/plugin-ext/plugin-reader.ts new file mode 100644 index 000000000..d68f34c9b --- /dev/null +++ b/arduino-ide-extension/src/node/theia/plugin-ext/plugin-reader.ts @@ -0,0 +1,80 @@ +import { injectable } from '@theia/core/shared/inversify'; +import type { + PluginContribution, + PluginPackage, +} from '@theia/plugin-ext/lib/common/plugin-protocol'; +import { HostedPluginReader as TheiaHostedPluginReader } from '@theia/plugin-ext/lib/hosted/node/plugin-reader'; + +@injectable() +export class HostedPluginReader extends TheiaHostedPluginReader { + override readContribution( + plugin: PluginPackage + ): PluginContribution | undefined { + const scanner = this.scanner.getScanner(plugin); + const contributions = scanner.getContribution(plugin); + return this.filterContribution(plugin.name, contributions); + } + private filterContribution( + pluginName: string, + contributions: PluginContribution | undefined + ): PluginContribution | undefined { + if (!contributions) { + return contributions; + } + const filter = pluginFilters.get(pluginName); + return filter ? filter(contributions) : contributions; + } +} + +type PluginContributionFilter = ( + contribution: PluginContribution +) => PluginContribution | undefined; +const cortexDebugFilter: PluginContributionFilter = ( + contribution: PluginContribution +) => { + if (contribution.viewsContainers) { + for (const location of Object.keys(contribution.viewsContainers)) { + const viewContainers = contribution.viewsContainers[location]; + for (let i = 0; i < viewContainers.length; i++) { + const viewContainer = viewContainers[i]; + if ( + viewContainer.id === 'cortex-debug' && + viewContainer.title === 'RTOS' + ) { + viewContainers.splice(i, 1); + } + } + } + } + if (contribution.views) { + for (const location of Object.keys(contribution.views)) { + if (location === 'cortex-debug') { + const views = contribution.views[location]; + for (let i = 0; i < views.length; i++) { + const view = views[i]; + if (view.id === 'cortex-debug.rtos') { + views.splice(i, 1); + } + } + } + } + } + if (contribution.menus) { + for (const location of Object.keys(contribution.menus)) { + if (location === 'commandPalette') { + const menus = contribution.menus[location]; + for (let i = 0; i < menus.length; i++) { + const menu = menus[i]; + if (menu.command === 'cortex-debug.rtos.toggleRTOSPanel') { + menu.when = 'false'; + } + } + } + } + } + return contribution; +}; + +const pluginFilters = new Map([ + ['cortex-debug', cortexDebugFilter], +]);