|
@@ -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);
|
|
|
});
|
|
|
}
|
|
|
};
|