Browse Source

Merge pull request #78 from JohanMabille/refactor

Refactored plugins to avoid code duplication
Afshin Taylor Darian 5 năm trước cách đây
mục cha
commit
362b82abe3
3 tập tin đã thay đổi với 59 bổ sung67 xóa
  1. 2 2
      src/handlers/console.ts
  2. 2 2
      src/handlers/notebook.ts
  3. 55 63
      src/index.ts

+ 2 - 2
src/handlers/console.ts

@@ -16,7 +16,7 @@ import { Signal } from '@phosphor/signaling';
 export class DebuggerConsoleHandler implements IDisposable {
   constructor(options: DebuggerConsoleHandler.IOptions) {
     this.debuggerModel = options.debuggerModel;
-    this.consoleTracker = options.consoleTracker;
+    this.consoleTracker = options.tracker;
     this.breakpoints = this.debuggerModel.sidebar.breakpoints.model;
     this.cellManager = new CellManager({
       activeCell: this.consoleTracker.currentWidget.console.promptCell,
@@ -63,6 +63,6 @@ export class DebuggerConsoleHandler implements IDisposable {
 export namespace DebuggerConsoleHandler {
   export interface IOptions {
     debuggerModel: Debugger.Model;
-    consoleTracker: IConsoleTracker;
+    tracker: IConsoleTracker;
   }
 }

+ 2 - 2
src/handlers/notebook.ts

@@ -18,7 +18,7 @@ import { Signal } from '@phosphor/signaling';
 export class DebuggerNotebookHandler implements IDisposable {
   constructor(options: DebuggerNotebookHandler.IOptions) {
     this.debuggerModel = options.debuggerModel;
-    this.notebookTracker = options.notebookTracker;
+    this.notebookTracker = options.tracker;
     this.breakpoints = this.debuggerModel.sidebar.breakpoints.model;
     this.notebookTracker.activeCellChanged.connect(this.onNewCell, this);
     this.cellManager = new CellManager({
@@ -62,6 +62,6 @@ export class DebuggerNotebookHandler implements IDisposable {
 export namespace DebuggerNotebookHandler {
   export interface IOptions {
     debuggerModel: Debugger.Model;
-    notebookTracker: INotebookTracker;
+    tracker: INotebookTracker;
   }
 }

+ 55 - 63
src/index.ts

@@ -8,7 +8,7 @@ import {
   ILabShell
 } from '@jupyterlab/application';
 
-import { ICommandPalette } from '@jupyterlab/apputils';
+import { IClientSession, ICommandPalette } from '@jupyterlab/apputils';
 
 import { WidgetTracker, MainAreaWidget } from '@jupyterlab/apputils';
 
@@ -56,6 +56,50 @@ export namespace CommandIDs {
   export const changeMode = 'debugger:change-mode';
 }
 
+async function setDebugSession(
+  app: JupyterFrontEnd,
+  debug: IDebugger,
+  client: IClientSession
+) {
+  if (!debug.session) {
+    debug.session = new DebugSession({ client: client });
+  } else {
+    debug.session.client = client;
+  }
+  if (debug.session) {
+    await debug.session.restoreState();
+    app.commands.notifyCommandChanged();
+  }
+}
+
+class HandlerTracker<
+  H extends DebuggerConsoleHandler | DebuggerNotebookHandler
+> {
+  constructor(builder: new (option: any) => H) {
+    this.builder = builder;
+  }
+
+  update<
+    T extends IConsoleTracker | INotebookTracker,
+    W extends ConsolePanel | NotebookPanel
+  >(debug: IDebugger, tracker: T, widget: W): void {
+    if (debug.tracker.currentWidget && !this.handlers[widget.id]) {
+      const handler = new this.builder({
+        tracker: tracker,
+        debuggerModel: debug.tracker.currentWidget.content.model
+      });
+      this.handlers[widget.id] = handler;
+      widget.disposed.connect(() => {
+        delete this.handlers[widget.id];
+        handler.dispose();
+      });
+    }
+  }
+
+  private handlers: { [id: string]: H } = {};
+  private builder: new (option: any) => H;
+}
+
 /**
  * A plugin that provides visual debugging support for consoles.
  */
@@ -69,43 +113,17 @@ const consoles: JupyterFrontEndPlugin<void> = {
     tracker: IConsoleTracker,
     labShell: ILabShell
   ) => {
-    let oldhandler: {
-      id: string;
-      handler: DebuggerConsoleHandler;
-    };
+    const handlerTracker = new HandlerTracker<DebuggerConsoleHandler>(
+      DebuggerConsoleHandler
+    );
 
     labShell.currentChanged.connect(async (_, update) => {
       const widget = update.newValue;
-
       if (!(widget instanceof ConsolePanel)) {
         return;
       }
-
-      if (!debug.session) {
-        debug.session = new DebugSession({ client: widget.session });
-      } else {
-        debug.session.client = widget.session;
-      }
-      if (debug.session) {
-        await debug.session.restoreState();
-        app.commands.notifyCommandChanged();
-      }
-      if (debug.tracker.currentWidget) {
-        const handler = new DebuggerConsoleHandler({
-          consoleTracker: tracker,
-          debuggerModel: debug.tracker.currentWidget.content.model
-        });
-        if (!oldhandler) {
-          oldhandler = {
-            id: widget.id,
-            handler: handler
-          };
-        } else if (oldhandler.id !== widget.id) {
-          oldhandler.id = widget.id;
-          oldhandler.handler.dispose();
-          oldhandler.handler = handler;
-        }
-      }
+      await setDebugSession(app, debug, widget.session);
+      handlerTracker.update(debug, tracker, widget);
     });
   }
 };
@@ -172,43 +190,17 @@ const notebooks: JupyterFrontEndPlugin<void> = {
     tracker: INotebookTracker,
     labShell: ILabShell
   ) => {
-    let oldhandler: {
-      id: string;
-      handler: DebuggerNotebookHandler;
-    };
+    const handlerTracker = new HandlerTracker<DebuggerNotebookHandler>(
+      DebuggerNotebookHandler
+    );
 
     labShell.currentChanged.connect(async (_, update) => {
       const widget = update.newValue;
       if (!(widget instanceof NotebookPanel)) {
         return;
       }
-      if (!debug.session) {
-        debug.session = new DebugSession({ client: widget.session });
-      } else {
-        debug.session.client = widget.session;
-      }
-      if (debug.session) {
-        await debug.session.restoreState();
-        app.commands.notifyCommandChanged();
-      }
-      if (debug.tracker.currentWidget) {
-        if (!oldhandler) {
-          oldhandler = {
-            id: widget.id,
-            handler: new DebuggerNotebookHandler({
-              notebookTracker: tracker,
-              debuggerModel: debug.tracker.currentWidget.content.model
-            })
-          };
-        } else if (oldhandler.id !== widget.id) {
-          oldhandler.id = widget.id;
-          oldhandler.handler.dispose();
-          oldhandler.handler = new DebuggerNotebookHandler({
-            notebookTracker: tracker,
-            debuggerModel: debug.tracker.currentWidget.content.model
-          });
-        }
-      }
+      await setDebugSession(app, debug, widget.session);
+      handlerTracker.update(debug, tracker, widget);
     });
   }
 };