Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 60 additions & 3 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

16 changes: 15 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@
"engines": {
"vscode": "^1.92.0"
},
"enabledApiProposals": [
"editorInsets"
],
"preview": true,
"categories": [
"Other"
],
Expand Down Expand Up @@ -59,6 +63,10 @@
"command": "ct-vscode.toggleCT",
"title": "Toggle CodeTracer"
},
{
"command": "ct-vscode.addTracepoint",
"title": "Add Tracepoint"
},
{
"command": "ct-vscode.loadCurrentFile",
"title": "Record and run current active editor file"
Expand Down Expand Up @@ -138,6 +146,11 @@
"command": "ct-vscode.addToScratchpad",
"when": "codetracer:active",
"group": "codetracerSpecific"
},
{
"command": "ct-vscode.addTracepoint",
"when": "codetracer:active",
"group": "codetracerSpecific"
}
]
},
Expand Down Expand Up @@ -175,6 +188,7 @@
"@types/vscode": "^1.92.0",
"@typescript-eslint/eslint-plugin": "^8.28.0",
"@typescript-eslint/parser": "^8.28.0",
"@vscode/dts": "^0.4.1",
"@vscode/test-cli": "^0.0.10",
"@vscode/test-electron": "^2.4.1",
"eslint": "^9.23.0",
Expand All @@ -184,4 +198,4 @@
"build": "^0.1.4",
"just": "^0.1.8"
}
}
}
2 changes: 2 additions & 0 deletions src/ct_vscode.ts
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,8 @@ export declare function getCurrentTrace(
isNixOS: boolean
): Promise<TraceInfo | undefined>

export declare function getFlowList(): Promise<undefined>

export declare function getTransactionTrace(
codetracerExe: string,
txHash: string,
Expand Down
57 changes: 53 additions & 4 deletions src/extension.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
/// <reference path="../vscode.proposed.editorInsets.d.ts" />
import * as vscode from "vscode";
import { initPanels, disposePanels, disposeCommands } from "./initPanels";
import { initPanels, disposePanels, disposeCommands, addTracepoint, addLoopPosition } from "./initPanels";
import * as utils from "./utils";
import * as os from "os";
import * as fs from "fs";
Expand All @@ -17,12 +18,16 @@ import {
getRecentTransactions,
getTransactionTrace,
getCurrentTrace,
getFlowList,
TraceInfo,
TransactionInfo,
MediatorWithSubscribers,
} from "./ct_vscode.js";

const tracepointInsets = new Map<number, vscode.WebviewEditorInset>();
const flowInsets = new Map<number, vscode.WebviewEditorInset>();
let ctStarted = false;
let adapterFactoryDisposable: vscode.Disposable | undefined;

async function runCurrent(codetracerExe: string, isNixOS: boolean): Promise<string | undefined> {
const trace: TraceInfo | undefined = await vscode.window.withProgress(
Expand All @@ -45,6 +50,10 @@ async function runCurrent(codetracerExe: string, isNixOS: boolean): Promise<stri
return trace?.outputFolder
}

async function loadFlow() {

}

async function pickTraceFolder(codetracerExe: string, isNixOS: boolean): Promise<string | undefined> {
const recentTraces: TraceInfo[] | undefined = await vscode.window.withProgress(
{
Expand Down Expand Up @@ -137,6 +146,19 @@ async function toggleCt(context: vscode.ExtensionContext, dapVsCodeApi: DapVsCod
disposePanels();
disposeCommands();

for (const [line, inset] of tracepointInsets) {
inset.dispose();
tracepointInsets.delete(line);
}

for (const [line, inset] of flowInsets) {
inset.dispose();
flowInsets.delete(line);
}

adapterFactoryDisposable?.dispose();
adapterFactoryDisposable = undefined;

if (vscode.debug.activeDebugSession?.type === "codetracer-debug") {
await vscode.commands.executeCommand("workbench.action.debug.stop");
}
Expand Down Expand Up @@ -174,6 +196,17 @@ async function toggleCt(context: vscode.ExtensionContext, dapVsCodeApi: DapVsCod
const panels = initPanels(context, viewsApi);
(vscode.window as any).panels = panels; // easier debugging

const editor = vscode.window.activeTextEditor;
if (!editor) {
vscode.window.showInformationMessage("Open a text file first.");
return;
}

const line = editor.selection.active.line;
const inset = addLoopPosition(context, viewsApi, editor, line - 1);
flowInsets.set(line, inset);


const debugConfig = {
type: "codetracer-debug",
request: "launch",
Expand Down Expand Up @@ -249,8 +282,8 @@ async function reinitCommands(context: vscode.ExtensionContext) {
}

// Set the codetracer executable and the args
context.subscriptions.push(
vscode.debug.registerDebugAdapterDescriptorFactory(
if (!adapterFactoryDisposable) {
adapterFactoryDisposable = vscode.debug.registerDebugAdapterDescriptorFactory(
"codetracer-debug",
new (class implements vscode.DebugAdapterDescriptorFactory {
async createDebugAdapterDescriptor(session: vscode.DebugSession) {
Expand All @@ -261,7 +294,9 @@ async function reinitCommands(context: vscode.ExtensionContext) {
}
})
)
);
}

context.subscriptions.push(adapterFactoryDisposable);

const register = (id: string, fn: (...a: any[]) => any) =>
commandDisposables.push(vscode.commands.registerCommand(id, fn));
Expand Down Expand Up @@ -293,6 +328,7 @@ async function reinitCommands(context: vscode.ExtensionContext) {
stub('ct-vscode.forwardSourceLineJump');
stub('ct-vscode.backwardSourceLineJump');
stub('ct-vscode.addToScratchpad');
stub('ct-vscode.addTracepoint');
} else {
// ---- real registrations ----
register('ct-vscode.toggleCT', async () => toggleCtReal(LoadMode.Trace));
Expand Down Expand Up @@ -323,6 +359,17 @@ async function reinitCommands(context: vscode.ExtensionContext) {
ctAddToScratchpad(viewsApi, expr);
});

register("ct-vscode.addTracepoint", async () => {
const editor = vscode.window.activeTextEditor;
if (!editor) {
vscode.window.showInformationMessage("Open a text file first.");
return;
}

const line = editor.selection.active.line;
const inset = addTracepoint(context, viewsApi, editor, line)
tracepointInsets.set(line, inset);
})
}

if (miscDisposables.length === 0) {
Expand Down Expand Up @@ -354,4 +401,6 @@ export async function activate(context: vscode.ExtensionContext) {
export function deactivate() {
disposePanels();
disposeCommands();
adapterFactoryDisposable?.dispose();
adapterFactoryDisposable = undefined;
}
46 changes: 44 additions & 2 deletions src/initPanels.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import * as vscode from "vscode";
import { getOrCreatePanel } from "./panelManager";
import { getOrCreatePanel, createTracepointPanel, createFlowPanel } from "./panelManager";
import * as utils from "./utils";
import { receive, newWebviewSubscriber } from "./ct_vscode";

Expand All @@ -9,6 +9,7 @@ export interface CodeTracerPanels {
scratchpad: vscode.WebviewPanel;
eventLog: vscode.WebviewPanel;
terminalOutput: vscode.WebviewPanel;
flow: vscode.WebviewPanel;
}

interface CodeTracerPanelCommands {
Expand All @@ -17,6 +18,7 @@ interface CodeTracerPanelCommands {
scratchpad: vscode.Disposable;
eventLog: vscode.Disposable;
terminalOutput: vscode.Disposable;
flow: vscode.Disposable;
}

const idToPanelKey: Record<string, keyof CodeTracerPanels> = {
Expand Down Expand Up @@ -60,7 +62,7 @@ function dapRedirect(
panel: any
) { }

function createStatePanel(
export function createStatePanel(
context: vscode.ExtensionContext,
viewsApi: any
): vscode.WebviewPanel {
Expand Down Expand Up @@ -155,6 +157,44 @@ function createTerminalPanel(
);
}

export function addLoopPosition(context: vscode.ExtensionContext, viewsApi: any, editor: vscode.TextEditor, line: number): vscode.WebviewEditorInset {
const inset = createFlowPanel(
{
id: "flowComponent",
title: "flow",
getContent: utils.getFlowComponent,
},
editor,
line,
context,
(message: CtMessage, panel: any) => {
console.log("received from webview: ", message);
let webviewSubscriber = newWebviewSubscriber(panel.webview);
receive(viewsApi, message.kind, message.value, webviewSubscriber);
}
)
return inset;
}

export function addTracepoint(context: vscode.ExtensionContext, viewsApi: any, editor: vscode.TextEditor, line: number): vscode.WebviewEditorInset {
const inset = createTracepointPanel(
{
id: "tracepointComponent",
title: "tracepoint",
getTraceContent: utils.getTracepointWebviewContent,
},
editor,
line,
context,
(message: CtMessage, panel: any) => {
console.log("received from webview: ", message);
let webviewSubscriber = newWebviewSubscriber(panel.webview);
receive(viewsApi, message.kind, message.value, webviewSubscriber);
}
)
return inset;
}

export function initPanels(
context: vscode.ExtensionContext,
viewsApi: any
Expand Down Expand Up @@ -183,6 +223,8 @@ export function initPanels(
() => createEventLogPanel(context, viewsApi)
);

const flow = (panelMap.flow)

const terminalOutput = (panelMap.terminalOutput =
createTerminalPanel(context, viewsApi));
panelCommands.terminalOutput = registerPanelCommand(
Expand Down
Loading