Files
vscode-debug-visualizer/extension/src/extension.ts
Henning Dieterichs d22e5d4111 Version 2.2.0.
* Adds support for custom injected scripts with automatic reload
* Refactors extension
2021-06-18 20:26:51 +02:00

130 lines
3.4 KiB
TypeScript

import { window, ExtensionContext, commands } from "vscode";
import { Disposable } from "@hediet/std/disposable";
import {
enableHotReload,
hotRequireExportedFn,
registerUpdateReconciler,
getReloadCount,
} from "@hediet/node-reload";
if (process.env.HOT_RELOAD) {
enableHotReload({ entryModule: module, loggingEnabled: true });
}
registerUpdateReconciler(module);
import { InternalWebviewManager } from "./webview/InternalWebviewManager";
import { WebviewServer } from "./webview/WebviewServer";
import { Config } from "./Config";
import { DebuggerProxy } from "./proxies/DebuggerProxy";
import { DebuggerViewProxy } from "./proxies/DebuggerViewProxy";
import { VisualizationWatchModelImpl } from "./VisualizationWatchModel";
import {
ComposedVisualizationSupport,
JsEvaluationEngine,
GenericVisualizationSupport,
ConfigurableVisualizationSupport,
} from "./VisualizationBackend";
import { DispatchingVisualizationBackend } from "./VisualizationBackend/DispatchingVisualizationBackend";
export function activate(context: ExtensionContext) {
context.subscriptions.push(
hotRequireExportedFn(module, Extension, Extension => new Extension())
);
}
export function deactivate() {}
export class Extension {
public readonly dispose = Disposable.fn();
private readonly config = new Config();
private readonly debugger = this.dispose.track(new DebuggerProxy());
private readonly debuggerView = this.dispose.track(
new DebuggerViewProxy(this.debugger)
);
public readonly dataSource = new VisualizationWatchModelImpl(
new DispatchingVisualizationBackend(
new ComposedVisualizationSupport([
new ConfigurableVisualizationSupport(
this.config,
this.debuggerView
),
new JsEvaluationEngine(this.debuggerView, this.config),
new GenericVisualizationSupport(this.debuggerView),
]),
this.debuggerView
)
);
private readonly server = new WebviewServer(this.dataSource, this.config);
private readonly views = this.dispose.track(
new InternalWebviewManager(this.server, this.config)
);
constructor() {
if (getReloadCount(module) > 0) {
const i = this.dispose.track(window.createStatusBarItem());
i.text = "reload" + getReloadCount(module);
i.show();
}
this.dispose.track(
commands.registerCommand(
"vscode-debug-visualizer.new-visualizer",
() => {
this.views.createNew();
}
)
);
this.dispose.track(
commands.registerCommand(
"vscode-debug-visualizer.visualizer-set-expression",
() => {
const editor = window.activeTextEditor;
if (!editor) {
return;
}
const selection = editor.selection;
let selectedText;
if (selection.isEmpty) {
const lineText = editor.document.lineAt(selection.start)
.text;
const regexp = /`(.*)`/g;
selectedText = "";
let match;
while ((match = regexp.exec(lineText))) {
if (
match.index <= selection.start.character &&
selection.start.character <=
match.index + match[0].length
) {
selectedText = match[1];
}
}
} else {
selectedText = editor.document.getText(selection);
}
if (!selectedText) {
return;
}
const connections = [...this.server.connections.values()];
const latestConnection =
connections[connections.length - 1];
if (latestConnection) {
latestConnection.setExpression(selectedText);
} else {
this.views.createNew(selectedText);
}
}
)
);
}
}