From 609cf8f28fa379b0936530cdc437921b10e70990 Mon Sep 17 00:00:00 2001 From: Taras Malinovskii Date: Mon, 16 Mar 2026 11:41:01 +0700 Subject: [PATCH 1/3] fix(intellij): handle square brackets in file paths for autocomplete Use File.toURI() instead of URI constructor for Windows two-slash file:// URIs to properly percent-encode special characters like [ ]. Fixes #10978. --- .../continue/UriUtils.kt | 5 ++-- .../unit/UriUtilsTest.kt | 24 +++++++++++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/extensions/intellij/src/main/kotlin/com/github/continuedev/continueintellijextension/continue/UriUtils.kt b/extensions/intellij/src/main/kotlin/com/github/continuedev/continueintellijextension/continue/UriUtils.kt index ca5d0e21b3b..85dd12510e7 100644 --- a/extensions/intellij/src/main/kotlin/com/github/continuedev/continueintellijextension/continue/UriUtils.kt +++ b/extensions/intellij/src/main/kotlin/com/github/continuedev/continueintellijextension/continue/UriUtils.kt @@ -23,10 +23,11 @@ object UriUtils { // Remove query parameters if present val uriStr = uri.substringBefore("?") - // Handle Windows file paths with authority component + // Handle Windows file paths with authority component (e.g. file://C:/path/to/file) + // Use File.toURI() to properly percent-encode special characters like [ ] in paths if (uriStr.startsWith("file://") && !uriStr.startsWith("file:///")) { val path = uriStr.substringAfter("file://") - return URI("file:///$path") + return File(path).toURI() } return try { diff --git a/extensions/intellij/src/test/kotlin/com/github/continuedev/continueintellijextension/unit/UriUtilsTest.kt b/extensions/intellij/src/test/kotlin/com/github/continuedev/continueintellijextension/unit/UriUtilsTest.kt index a718f722bae..cf2f2cbe327 100644 --- a/extensions/intellij/src/test/kotlin/com/github/continuedev/continueintellijextension/unit/UriUtilsTest.kt +++ b/extensions/intellij/src/test/kotlin/com/github/continuedev/continueintellijextension/unit/UriUtilsTest.kt @@ -60,4 +60,28 @@ class UriUtilsTest : TestCase() { val expectedFile = File("/path/to/file with spaces") assertEquals(expectedFile, result) } + + /** + * Validates that square brackets in file paths are handled correctly. + * This is a regression test for GitHub issue #10978. + * Frameworks like Next.js and FiveM use bracket-named directories + * (e.g. [gamemode]) which caused URI parsing to crash. + */ + fun `test square brackets in path`() { + val uri = "file:///path/to/[gamemode]/file.lua" + val result = UriUtils.uriToFile(uri) + assertEquals(File("/path/to/[gamemode]/file.lua"), result) + } + + /** + * Validates that Windows-style file URIs with square brackets are handled. + * Regression test for GitHub issue #10978 — the original crash occurred + * specifically with Windows two-slash file:// URIs. + */ + fun `test Windows path with square brackets`() { + val uri = "file://C:/Users/user/projects/[gamemode]/file.lua" + val parsed = UriUtils.parseUri(uri) + assertEquals("file", parsed.scheme) + assertTrue(parsed.path.contains("gamemode")) + } } From aae77b437cd00b95dd983a75b26c761da3aaf92c Mon Sep 17 00:00:00 2001 From: Taras Malinovskii Date: Mon, 16 Mar 2026 12:01:06 +0700 Subject: [PATCH 2/3] test(intellij): strengthen Windows URI assertions for bracket encoding Verify that square brackets are percent-encoded and drive letter and directory structure are preserved in parsed URI path. --- .../continueintellijextension/unit/UriUtilsTest.kt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/extensions/intellij/src/test/kotlin/com/github/continuedev/continueintellijextension/unit/UriUtilsTest.kt b/extensions/intellij/src/test/kotlin/com/github/continuedev/continueintellijextension/unit/UriUtilsTest.kt index cf2f2cbe327..1c18bbe38fb 100644 --- a/extensions/intellij/src/test/kotlin/com/github/continuedev/continueintellijextension/unit/UriUtilsTest.kt +++ b/extensions/intellij/src/test/kotlin/com/github/continuedev/continueintellijextension/unit/UriUtilsTest.kt @@ -82,6 +82,11 @@ class UriUtilsTest : TestCase() { val uri = "file://C:/Users/user/projects/[gamemode]/file.lua" val parsed = UriUtils.parseUri(uri) assertEquals("file", parsed.scheme) - assertTrue(parsed.path.contains("gamemode")) + assertTrue("Brackets should be percent-encoded in URI path", + parsed.path.contains("%5B") && parsed.path.contains("%5D")) + assertTrue("Path should contain drive letter", + parsed.path.contains("C:") || parsed.path.contains("c:")) + assertTrue("Path should preserve full directory structure", + parsed.path.contains("Users/user/projects")) } } From a00c389bafe2b7f4048ae9dd6a39465a88e9218a Mon Sep 17 00:00:00 2001 From: Taras Malinovskii Date: Mon, 16 Mar 2026 12:14:43 +0700 Subject: [PATCH 3/3] fix(intellij): make Windows bracket test cross-platform The CI runs on Linux where C: is not a drive letter. Assert that brackets are encoded and structure is preserved without platform-specific path assumptions. --- .../continueintellijextension/unit/UriUtilsTest.kt | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/extensions/intellij/src/test/kotlin/com/github/continuedev/continueintellijextension/unit/UriUtilsTest.kt b/extensions/intellij/src/test/kotlin/com/github/continuedev/continueintellijextension/unit/UriUtilsTest.kt index 1c18bbe38fb..3bb53612edc 100644 --- a/extensions/intellij/src/test/kotlin/com/github/continuedev/continueintellijextension/unit/UriUtilsTest.kt +++ b/extensions/intellij/src/test/kotlin/com/github/continuedev/continueintellijextension/unit/UriUtilsTest.kt @@ -82,11 +82,12 @@ class UriUtilsTest : TestCase() { val uri = "file://C:/Users/user/projects/[gamemode]/file.lua" val parsed = UriUtils.parseUri(uri) assertEquals("file", parsed.scheme) - assertTrue("Brackets should be percent-encoded in URI path", - parsed.path.contains("%5B") && parsed.path.contains("%5D")) - assertTrue("Path should contain drive letter", - parsed.path.contains("C:") || parsed.path.contains("c:")) - assertTrue("Path should preserve full directory structure", + // Brackets must be percent-encoded or absent as raw characters in a valid URI + assertFalse("Raw square brackets should not appear in URI path", + parsed.toString().contains("[") || parsed.toString().contains("]")) + assertTrue("Path should preserve directory structure", parsed.path.contains("Users/user/projects")) + assertTrue("Path should end with file name", + parsed.path.endsWith("file.lua")) } }