From f2a3cc450e988bdb36083f57f2fb0303b96b7e89 Mon Sep 17 00:00:00 2001 From: Tianyi Cui <53024+tianyicui@users.noreply.github.com> Date: Wed, 29 Jul 2026 06:04:59 +0800 Subject: [PATCH] fix(lsp): retain drive syntax in UNC worlds --- packages/lsp/tool-lsp/src/render.ts | 5 ++--- packages/lsp/tool-lsp/tests/render.spec.ts | 1 + 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/lsp/tool-lsp/src/render.ts b/packages/lsp/tool-lsp/src/render.ts index 4613312c87..1e73e7ec6a 100644 --- a/packages/lsp/tool-lsp/src/render.ts +++ b/packages/lsp/tool-lsp/src/render.ts @@ -156,7 +156,7 @@ export function renderUri(uri: string, workspaceUri: string): string { const relative = targetSegments.slice(workspaceSegments.length) return relative.length === 0 ? '.' : relative.join('/') } - return absoluteUriPath(target, targetSegments, workspaceSegments) + return absoluteUriPath(target, targetSegments, windowsWorld) } /** Whether a canonical file URI names a drive path or UNC path in a Windows execution world. */ @@ -183,9 +183,8 @@ function samePathSegment(left: string, right: string, windowsWorld: boolean): bo } /** Render an external file URL according to the execution-world style implied by its workspace URI. */ -function absoluteUriPath(target: URL, segments: readonly string[], workspaceSegments: readonly string[]): string { +function absoluteUriPath(target: URL, segments: readonly string[], windowsWorld: boolean): string { if (target.hostname.length > 0) return `//${target.hostname}/${segments.join('/')}` - const windowsWorld = /^[A-Za-z]:$/.test(workspaceSegments[0] ?? '') if (windowsWorld && /^[A-Za-z]:$/.test(segments[0] ?? '')) return segments.join('/') return `/${segments.join('/')}` } diff --git a/packages/lsp/tool-lsp/tests/render.spec.ts b/packages/lsp/tool-lsp/tests/render.spec.ts index d76600ea6f..953f7ef4c1 100644 --- a/packages/lsp/tool-lsp/tests/render.spec.ts +++ b/packages/lsp/tool-lsp/tests/render.spec.ts @@ -77,6 +77,7 @@ describe('renderUri', () => { expect(renderUri('file://server/share/workspace/a.ts', 'file://server/share/workspace')).toBe('a.ts') expect(renderUri('file://SERVER/share/workspace/src/A.ts', 'file://server/Share/Workspace')).toBe('src/A.ts') expect(renderUri('file://other/share/b.ts', 'file://server/share/workspace')).toBe('//other/share/b.ts') + expect(renderUri('file:///D:/lib/a.ts', 'file://server/share/workspace')).toBe('D:/lib/a.ts') expect(renderUri('file:///a.ts', 'file://server/')).toBe('/a.ts') expect(renderUri('file:///a.ts', 'file:///')).toBe('a.ts') })