| /*--------------------------------------------------------- | |
| * Copyright 2026 The Go Authors. All rights reserved. | |
| * Licensed under the MIT License. See LICENSE in the project root for license information. | |
| *--------------------------------------------------------*/ | |
| import type * as Win32AppContainerTokens from '@vscode/win32-app-container-tokens'; | |
| import path = require('path'); | |
| import { AttachItem } from '../pickProcess'; | |
| export async function getWindowsProcesses(): Promise<AttachItem[]> { | |
| const win = await getWinUtils(); | |
| return win.getProcessInfo().map(parseWindowsProcessInfo); | |
| } | |
| // Adapted from vscode-js-debug https://github.com/microsoft/vscode-js-debug/blob/a72801b175c1856138e30679624c97b3b062dc65/src/ui/processTree/windowsProcessTree.ts | |
| /** | |
| * Parses a Windows ProcessInfo into an AttachItem for the process picker. | |
| * | |
| * Extracts the executable path from `proc.commandLine`: | |
| * - Quoted path (e.g. `"C:\Program Files\app.exe" --arg`): parses up to `'" '` and strips the leading quote. | |
| * - Unquoted path (e.g. `C:\app.exe --arg`): parses up to the first space `' '`. | |
| * | |
| * Example input: `{ processId: 1234, commandLine: '"C:\\Program Files\\Go\\bin\\go.exe" run main.go', ... }` | |
| * Output executable: `'C:\\Program Files\\Go\\bin\\go.exe'` | |
| */ | |
| export function parseWindowsProcessInfo(proc: Win32AppContainerTokens.ProcessInfo): AttachItem { | |
| let command: string; | |
| const quoteEnd = proc.commandLine.indexOf('" '); | |
| if (quoteEnd === -1) { | |
| const space = proc.commandLine.indexOf(' '); | |
| if (space === -1) { | |
| command = proc.commandLine; | |
| } else { | |
| command = proc.commandLine.slice(0, space); | |
| } | |
| } else { | |
| command = proc.commandLine.slice(1, quoteEnd); | |
| } | |
| const pidStr = proc.processId.toString(); | |
| const processName = (path.win32 ? path.win32.basename(command) : path.basename(command)) || `Process ${pidStr}`; | |
| return { | |
| id: pidStr, | |
| label: processName, | |
| processName: processName, | |
| description: pidStr, | |
| detail: proc.commandLine, | |
| commandLine: proc.commandLine, | |
| executable: command | |
| }; | |
| } | |
| // Adapted from vscode-js-debug https://github.com/microsoft/vscode-js-debug/blob/a72801b175c1856138e30679624c97b3b062dc65/src/common/win32Utils.ts | |
| function once<T>(fn: () => Promise<T>): () => Promise<T> { | |
| let value: Promise<T> | undefined; | |
| return () => { | |
| if (!value) { | |
| value = fn(); | |
| } | |
| return value; | |
| }; | |
| } | |
| const load = once((): Promise<typeof Win32AppContainerTokens> => { | |
| return Promise.resolve(require('@vscode/win32-app-container-tokens')); | |
| }); | |
| function getWinUtils(): Promise<typeof Win32AppContainerTokens> { | |
| if (process.platform !== 'win32') { | |
| throw new Error('Not running on Windows'); | |
| } | |
| return load(); | |
| } |