diff options
| author | Lukas Wirth <lukastw97@gmail.com> | 2025-04-14 11:09:37 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-04-14 11:09:37 +0000 |
| commit | eda5a2e4e9e46f5ef736b267fdd78a920ac46041 (patch) | |
| tree | 21259a91388678344db4fda208e2d4e83405ddd4 /src/tools/rust-analyzer | |
| parent | 0e091ac63a8afbdecb875ecc980d708cf9643820 (diff) | |
| parent | cfdeaca216b6024983a554f50bde5a5232a30d89 (diff) | |
| download | rust-eda5a2e4e9e46f5ef736b267fdd78a920ac46041.tar.gz rust-eda5a2e4e9e46f5ef736b267fdd78a920ac46041.zip | |
Merge pull request #19578 from clouds56-contrib/drive-letter
add normalizeDriveLetter
Diffstat (limited to 'src/tools/rust-analyzer')
| -rw-r--r-- | src/tools/rust-analyzer/editors/code/src/config.ts | 4 | ||||
| -rw-r--r-- | src/tools/rust-analyzer/editors/code/src/debug.ts | 14 | ||||
| -rw-r--r-- | src/tools/rust-analyzer/editors/code/src/util.ts | 29 |
3 files changed, 35 insertions, 12 deletions
diff --git a/src/tools/rust-analyzer/editors/code/src/config.ts b/src/tools/rust-analyzer/editors/code/src/config.ts index 9b8ac666ce0..ba1c3b01de7 100644 --- a/src/tools/rust-analyzer/editors/code/src/config.ts +++ b/src/tools/rust-analyzer/editors/code/src/config.ts @@ -2,7 +2,7 @@ import * as Is from "vscode-languageclient/lib/common/utils/is"; import * as os from "os"; import * as path from "path"; import * as vscode from "vscode"; -import { expectNotUndefined, log, unwrapUndefinable } from "./util"; +import { expectNotUndefined, log, normalizeDriveLetter, unwrapUndefinable } from "./util"; import type { Env } from "./util"; import type { Disposable } from "vscode"; @@ -498,7 +498,7 @@ function computeVscodeVar(varName: string): string | null { // user has opened on Editor startup. Could lead to // unpredictable workspace selection in practice. // It's better to pick the first one - folder.uri.fsPath; + normalizeDriveLetter(folder.uri.fsPath); return fsPath; }; // https://code.visualstudio.com/docs/editor/variables-reference diff --git a/src/tools/rust-analyzer/editors/code/src/debug.ts b/src/tools/rust-analyzer/editors/code/src/debug.ts index a04a6db7adb..adb75c23c70 100644 --- a/src/tools/rust-analyzer/editors/code/src/debug.ts +++ b/src/tools/rust-analyzer/editors/code/src/debug.ts @@ -6,7 +6,7 @@ import type * as ra from "./lsp_ext"; import { Cargo } from "./toolchain"; import type { Ctx } from "./ctx"; import { createTaskFromRunnable, prepareEnv } from "./run"; -import { execute, isCargoRunnableArgs, unwrapUndefinable, log } from "./util"; +import { execute, isCargoRunnableArgs, unwrapUndefinable, log, normalizeDriveLetter } from "./util"; import type { Config } from "./config"; // Here we want to keep track on everything that's currently running @@ -127,20 +127,14 @@ async function getDebugConfiguration( firstWorkspace; const workspace = unwrapUndefinable(maybeWorkspace); - let wsFolder = path.normalize(workspace.uri.fsPath); - if (os.platform() === "win32") { - // in windows, the drive letter can vary in casing for VSCode, so we gotta normalize that first - wsFolder = wsFolder.replace(/^[a-z]:\\/, (c) => c.toUpperCase()); - } + const wsFolder = normalizeDriveLetter(path.normalize(workspace.uri.fsPath)); const workspaceQualifier = isMultiFolderWorkspace ? `:${workspace.name}` : ""; function simplifyPath(p: string): string { // in windows, the drive letter can vary in casing for VSCode, so we gotta normalize that first - if (os.platform() === "win32") { - p = p.replace(/^[a-z]:\\/, (c) => c.toUpperCase()); - } + p = normalizeDriveLetter(path.normalize(p)); // see https://github.com/rust-lang/rust-analyzer/pull/5513#issuecomment-663458818 for why this is needed - return path.normalize(p).replace(wsFolder, `\${workspaceFolder${workspaceQualifier}}`); + return p.replace(wsFolder, `\${workspaceFolder${workspaceQualifier}}`); } const executable = await getDebugExecutable( diff --git a/src/tools/rust-analyzer/editors/code/src/util.ts b/src/tools/rust-analyzer/editors/code/src/util.ts index 4b3a6970db5..83b8abe7773 100644 --- a/src/tools/rust-analyzer/editors/code/src/util.ts +++ b/src/tools/rust-analyzer/editors/code/src/util.ts @@ -299,3 +299,32 @@ export async function spawnAsync( }; } } + +export const isWindows = process.platform === "win32"; + +export function isWindowsDriveLetter(code: number): boolean { + // Copied from https://github.com/microsoft/vscode/blob/02c2dba5f2669b924fd290dff7d2ff3460791996/src/vs/base/common/extpath.ts#L265-L267 + return ( + (code >= /* CharCode.A */ 65 && code <= /* CharCode.Z */ 90) || + (code >= /* CharCode.a */ 97 && code <= /* CharCode.z */ 122) + ); +} +export function hasDriveLetter(path: string, isWindowsOS: boolean = isWindows): boolean { + // Copied from https://github.com/microsoft/vscode/blob/02c2dba5f2669b924fd290dff7d2ff3460791996/src/vs/base/common/extpath.ts#L324-L330 + if (isWindowsOS) { + return ( + isWindowsDriveLetter(path.charCodeAt(0)) && + path.charCodeAt(1) === /* CharCode.Colon */ 58 + ); + } + + return false; +} +export function normalizeDriveLetter(path: string, isWindowsOS: boolean = isWindows): string { + // Copied from https://github.com/microsoft/vscode/blob/02c2dba5f2669b924fd290dff7d2ff3460791996/src/vs/base/common/labels.ts#L140-L146 + if (hasDriveLetter(path, isWindowsOS)) { + return path.charAt(0).toUpperCase() + path.slice(1); + } + + return path; +} |
