Ver código fonte

Project explorer: GUI-verified fixes

- call super.init() explicitly: inversify only invokes the
  most-derived @postConstruct, so base row-update wiring never ran
- bind FrontendApplicationContribution so the view auto-opens
- verified live: tree renders with icons, click-to-open works,
  zero console errors
Eric Streit 1 semana atrás
pai
commit
363558d1cd

+ 15 - 2
extensions/modula2-project/src/browser/modula2-explorer-widget.ts

@@ -1,5 +1,5 @@
 import * as React from 'react';
-import { inject, injectable, interfaces } from '@theia/core/shared/inversify';
+import { inject, injectable, interfaces, postConstruct } from '@theia/core/shared/inversify';
 import {
   AbstractViewContribution, codicon, CompositeTreeNode,
   ContextMenuRenderer, createTreeContainer,
@@ -65,6 +65,14 @@ export class Modula2ExplorerWidget extends TreeWidget {
     this.title.label = 'Modula-2 Project';
     this.title.caption = 'Modula-2 project files';
     this.title.closable = false;
+  }
+
+  @postConstruct()
+  protected initialize(): void {
+    // NOTE: inversify only invokes the most-derived @postConstruct, so the
+    // base TreeWidget.init() (row-update wiring) must be called explicitly.
+    super.init();
+    // Injections are complete here (never touch them in the constructor).
     this.toDispose.push(this.model.onSelectionChanged(nodes => this.openSelected(nodes)));
     this.toDispose.push(this.files.onDidFilesChange(() => this.scheduleRefresh()));
     this.toDispose.push(this.workspace.onWorkspaceChanged(() => this.refresh()));
@@ -121,7 +129,12 @@ export class Modula2ExplorerWidget extends TreeWidget {
       }
       this.model.root = rootNode;
     } catch (error) {
-      console.error('Modula-2 explorer refresh failed:', error);
+      const message = error instanceof Error ? error.message : String(error);
+      console.error('Modula-2 explorer refresh failed:', message);
+      const errNode = folderNode('m2error', 'Explorer error', 'group');
+      const detail = fileNode('m2error:detail', message.slice(0, 120), false);
+      CompositeTreeNode.addChild(errNode, detail);
+      this.model.root = errNode;
     }
   }
 

+ 2 - 1
extensions/modula2-project/src/browser/modula2-project-frontend-module.ts

@@ -4,7 +4,7 @@ import {
   Command, CommandContribution, CommandRegistry, MenuContribution,
   MenuModelRegistry, MessageService,
 } from '@theia/core/lib/common';
-import { WidgetFactory, bindViewContribution } from '@theia/core/lib/browser';
+import { WidgetFactory, bindViewContribution, FrontendApplicationContribution } from '@theia/core/lib/browser';
 import { QuickInputService } from '@theia/core/lib/common/quick-pick-service';
 import { BinaryBuffer } from '@theia/core/lib/common/buffer';
 import { FileService } from '@theia/filesystem/lib/browser/file-service';
@@ -237,6 +237,7 @@ export default new ContainerModule(bind => {
   bind(CommandContribution).to(ProjectCommands).inSingletonScope();
   bind(MenuContribution).to(ProjectMenus).inSingletonScope();
   bindViewContribution(bind, Modula2ExplorerContribution);
+  bind(FrontendApplicationContribution).toService(Modula2ExplorerContribution);
   bind(WidgetFactory).toDynamicValue(context => ({
     id: MODULA2_EXPLORER_ID,
     createWidget: () => createModula2ExplorerWidget(context.container),