Skip to content

Commit 9e017a9

Browse files
committed
WIP: Start working on experimental editor inset api
1 parent 26192e5 commit 9e017a9

File tree

8 files changed

+220
-38
lines changed

8 files changed

+220
-38
lines changed

package-lock.json

Lines changed: 60 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@
1414
"engines": {
1515
"vscode": "^1.92.0"
1616
},
17+
"enabledApiProposals": [
18+
"editorInsets"
19+
],
20+
"preview": true,
1721
"categories": [
1822
"Other"
1923
],
@@ -59,6 +63,10 @@
5963
"command": "ct-vscode.toggleCT",
6064
"title": "Toggle CodeTracer"
6165
},
66+
{
67+
"command": "ct-vscode.addTracepoint",
68+
"title": "Add Tracepoint"
69+
},
6270
{
6371
"command": "ct-vscode.loadCurrentFile",
6472
"title": "Record and run current active editor file"
@@ -175,6 +183,7 @@
175183
"@types/vscode": "^1.92.0",
176184
"@typescript-eslint/eslint-plugin": "^8.28.0",
177185
"@typescript-eslint/parser": "^8.28.0",
186+
"@vscode/dts": "^0.4.1",
178187
"@vscode/test-cli": "^0.0.10",
179188
"@vscode/test-electron": "^2.4.1",
180189
"eslint": "^9.23.0",
@@ -184,4 +193,4 @@
184193
"build": "^0.1.4",
185194
"just": "^0.1.8"
186195
}
187-
}
196+
}

src/extension.ts

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1+
/// <reference path="../vscode.proposed.editorInsets.d.ts" />
12
import * as vscode from "vscode";
2-
import { initPanels, disposePanels, disposeCommands } from "./initPanels";
3+
import { createStatePanel, initPanels, disposePanels, disposeCommands, addTracepoint } from "./initPanels";
34
import * as utils from "./utils";
45
import * as os from "os";
56
import * as fs from "fs";
@@ -21,8 +22,11 @@ import {
2122
TransactionInfo,
2223
MediatorWithSubscribers,
2324
} from "./ct_vscode.js";
25+
import { createTracepointPanel } from "./panelManager";
2426

27+
const insets = new Map<number, vscode.WebviewEditorInset>();
2528
let ctStarted = false;
29+
let adapterFactoryDisposable: vscode.Disposable | undefined;
2630

2731
async function runCurrent(codetracerExe: string, isNixOS: boolean): Promise<string | undefined> {
2832
const trace: TraceInfo | undefined = await vscode.window.withProgress(
@@ -137,6 +141,14 @@ async function toggleCt(context: vscode.ExtensionContext, dapVsCodeApi: DapVsCod
137141
disposePanels();
138142
disposeCommands();
139143

144+
for (const [line, inset] of insets) {
145+
inset.dispose();
146+
insets.delete(line);
147+
}
148+
149+
adapterFactoryDisposable?.dispose();
150+
adapterFactoryDisposable = undefined;
151+
140152
if (vscode.debug.activeDebugSession?.type === "codetracer-debug") {
141153
await vscode.commands.executeCommand("workbench.action.debug.stop");
142154
}
@@ -174,6 +186,7 @@ async function toggleCt(context: vscode.ExtensionContext, dapVsCodeApi: DapVsCod
174186
const panels = initPanels(context, viewsApi);
175187
(vscode.window as any).panels = panels; // easier debugging
176188

189+
177190
const debugConfig = {
178191
type: "codetracer-debug",
179192
request: "launch",
@@ -249,8 +262,8 @@ async function reinitCommands(context: vscode.ExtensionContext) {
249262
}
250263

251264
// Set the codetracer executable and the args
252-
context.subscriptions.push(
253-
vscode.debug.registerDebugAdapterDescriptorFactory(
265+
if (!adapterFactoryDisposable) {
266+
adapterFactoryDisposable = vscode.debug.registerDebugAdapterDescriptorFactory(
254267
"codetracer-debug",
255268
new (class implements vscode.DebugAdapterDescriptorFactory {
256269
async createDebugAdapterDescriptor(session: vscode.DebugSession) {
@@ -261,7 +274,9 @@ async function reinitCommands(context: vscode.ExtensionContext) {
261274
}
262275
})
263276
)
264-
);
277+
}
278+
279+
context.subscriptions.push(adapterFactoryDisposable);
265280

266281
const register = (id: string, fn: (...a: any[]) => any) =>
267282
commandDisposables.push(vscode.commands.registerCommand(id, fn));
@@ -293,6 +308,7 @@ async function reinitCommands(context: vscode.ExtensionContext) {
293308
stub('ct-vscode.forwardSourceLineJump');
294309
stub('ct-vscode.backwardSourceLineJump');
295310
stub('ct-vscode.addToScratchpad');
311+
stub('ct-vscode.addTracepoint');
296312
} else {
297313
// ---- real registrations ----
298314
register('ct-vscode.toggleCT', async () => toggleCtReal(LoadMode.Trace));
@@ -323,6 +339,17 @@ async function reinitCommands(context: vscode.ExtensionContext) {
323339
ctAddToScratchpad(viewsApi, expr);
324340
});
325341

342+
register("ct-vscode.addTracepoint", async () => {
343+
const editor = vscode.window.activeTextEditor;
344+
if (!editor) {
345+
vscode.window.showInformationMessage("Open a text file first.");
346+
return;
347+
}
348+
349+
const line = editor.selection.active.line;
350+
const inset = addTracepoint(context, viewsApi, editor, line)
351+
insets.set(line, inset);
352+
})
326353
}
327354

328355
if (miscDisposables.length === 0) {
@@ -354,4 +381,6 @@ export async function activate(context: vscode.ExtensionContext) {
354381
export function deactivate() {
355382
disposePanels();
356383
disposeCommands();
384+
adapterFactoryDisposable?.dispose();
385+
adapterFactoryDisposable = undefined;
357386
}

src/initPanels.ts

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import * as vscode from "vscode";
2-
import { getOrCreatePanel } from "./panelManager";
2+
import { getOrCreatePanel, createTracepointPanel } from "./panelManager";
33
import * as utils from "./utils";
44
import { receive, newWebviewSubscriber } from "./ct_vscode";
55

@@ -60,7 +60,7 @@ function dapRedirect(
6060
panel: any
6161
) { }
6262

63-
function createStatePanel(
63+
export function createStatePanel(
6464
context: vscode.ExtensionContext,
6565
viewsApi: any
6666
): vscode.WebviewPanel {
@@ -155,6 +155,25 @@ function createTerminalPanel(
155155
);
156156
}
157157

158+
export function addTracepoint(context: vscode.ExtensionContext, viewsApi: any, editor: vscode.TextEditor, line: number): vscode.WebviewEditorInset {
159+
const inset = createTracepointPanel(
160+
{
161+
id: "tracepointComponent",
162+
title: "tracepoint",
163+
getContent: utils.getTracepointWebviewContent,
164+
},
165+
editor,
166+
line,
167+
context,
168+
(message: CtMessage, panel: any) => {
169+
console.log("received from webview: ", message);
170+
let webviewSubscriber = newWebviewSubscriber(panel.webview);
171+
receive(viewsApi, message.kind, message.value, webviewSubscriber);
172+
}
173+
)
174+
return inset;
175+
}
176+
158177
export function initPanels(
159178
context: vscode.ExtensionContext,
160179
viewsApi: any

src/panelManager.ts

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,46 @@
11
import * as vscode from 'vscode';
22

3-
type PanelId = 'stateComponent' | 'calltraceComponent' | 'scratchpadComponent' | 'eventLogComponent' | 'terminalOutputComponent';
3+
type PanelId = 'stateComponent' | 'calltraceComponent' | 'scratchpadComponent' | 'eventLogComponent' | 'terminalOutputComponent' | 'tracepointComponent';
44

55
export interface PanelConfig {
66
id: PanelId;
77
title: string;
8-
getContent: (panel: vscode.WebviewPanel, context: vscode.ExtensionContext) => string;
8+
getContent: (panel: vscode.Webview, context: vscode.ExtensionContext) => string;
99
}
1010

1111
const panels: Map<PanelId, vscode.WebviewPanel> = new Map();
1212

13+
export function createTracepointPanel(
14+
config: PanelConfig,
15+
editor: vscode.TextEditor,
16+
line: number,
17+
context: vscode.ExtensionContext,
18+
onMessage?: (msg: any, panel: vscode.WebviewEditorInset) => void
19+
): vscode.WebviewEditorInset {
20+
const inset = vscode.window.createWebviewTextEditorInset(
21+
editor,
22+
line,
23+
30,
24+
{
25+
enableScripts: true,
26+
localResourceRoots: [
27+
vscode.Uri.joinPath(context.extensionUri, "media"),
28+
vscode.Uri.joinPath(context.extensionUri, "public")
29+
],
30+
}
31+
);
32+
if (onMessage) {
33+
inset.webview.onDidReceiveMessage(
34+
message => onMessage(message, inset),
35+
undefined,
36+
context.subscriptions
37+
);
38+
}
39+
40+
inset.webview.html = config.getContent(inset.webview, context);
41+
return inset;
42+
}
43+
1344
export function getOrCreatePanel(
1445
config: PanelConfig,
1546
context: vscode.ExtensionContext,
@@ -31,7 +62,7 @@ export function getOrCreatePanel(
3162
}
3263
);
3364

34-
panel.webview.html = config.getContent(panel, context);
65+
panel.webview.html = config.getContent(panel.webview, context);
3566

3667
if (onMessage) {
3768
panel.webview.onDidReceiveMessage(

0 commit comments

Comments
 (0)