diff --git a/src/main/kotlin/com/mituuz/fuzzier/entities/RowContainer.kt b/src/main/kotlin/com/mituuz/fuzzier/entities/RowContainer.kt index c3f7cd7e..72b5871c 100644 --- a/src/main/kotlin/com/mituuz/fuzzier/entities/RowContainer.kt +++ b/src/main/kotlin/com/mituuz/fuzzier/entities/RowContainer.kt @@ -44,8 +44,9 @@ class RowContainer( return null } - val parts = row.split(":", limit = 3) - val filePath = getFilePath(parts[0]) + val (driveLetter, adjustedRow) = extractWindowsDriveLetter(row) + val parts = adjustedRow.split(":", limit = 3) + val filePath = getFilePath(driveLetter + parts[0]) val filename = filePath.replace('\\', '/').substringAfterLast('/') val rowNumber = parts[1].toInt() - 1 val trimmedRow: String = parts[2].trim() @@ -57,8 +58,9 @@ class RowContainer( return null } - val parts = row.split(":", limit = 4) - val filePath = getFilePath(parts[0]) + val (driveLetter, adjustedRow) = extractWindowsDriveLetter(row) + val parts = adjustedRow.split(":", limit = 4) + val filePath = getFilePath(driveLetter + parts[0]) val filename = filePath.replace('\\', '/').substringAfterLast('/') val rowNumber = parts[1].toInt() - 1 val columnNumber: Int = parts[2].toInt() - 1 @@ -67,9 +69,16 @@ class RowContainer( return RowContainer(filePath, basePath, filename, rowNumber, trimmedRow, columnNumber) } + private fun extractWindowsDriveLetter(row: String): Pair { + if (row.length >= 2 && row[0].isLetter() && row[1] == ':') { + return Pair(row.substring(0, 2), row.substring(2)) + } + return Pair("", row) + } + private fun getFilePath(filePath: String): String { val filePath = filePath.removePrefix(".") - if (!filePath.startsWith(FILE_SEPARATOR)) { + if (!filePath.startsWith(FILE_SEPARATOR) && !filePath.matches(Regex("^[A-Za-z]:.*"))) { return "$FILE_SEPARATOR$filePath" } diff --git a/src/test/kotlin/com/mituuz/fuzzier/entities/RowContainerTest.kt b/src/test/kotlin/com/mituuz/fuzzier/entities/RowContainerTest.kt index b582d69f..c69ce9db 100644 --- a/src/test/kotlin/com/mituuz/fuzzier/entities/RowContainerTest.kt +++ b/src/test/kotlin/com/mituuz/fuzzier/entities/RowContainerTest.kt @@ -146,4 +146,36 @@ class RowContainerTest { assertNull(rc, "Expected null for input with insufficient parts") } + + @Test + @EnabledOnOs(OS.WINDOWS) + fun fromRGString_windowsAbsolutePath() { + val input = "C:/Users/user/.ideavimrc:10:5: some matched text" + val basePath = "C:\\Users\\user\\IdeaProjects\\fuzzier" + val rc = rgRowContainerFromString(input, basePath) + + assertNotNull(rc, "Could not create row container from $input") + assertEquals("C:/Users/user/.ideavimrc", rc.filePath) + assertEquals(basePath, rc.basePath) + assertEquals(".ideavimrc", rc.filename) + assertEquals(9, rc.rowNumber) + assertEquals(4, rc.columnNumber) + assertEquals("some matched text", rc.trimmedRow) + } + + @Test + @EnabledOnOs(OS.WINDOWS) + fun fromGrepString_windowsAbsolutePath() { + val input = "C:/Users/user/.ideavimrc:10: some matched text" + val basePath = "C:\\Users\\user\\IdeaProjects\\fuzzier" + val rc = rowContainerFromString(input, basePath) + + assertNotNull(rc, "Could not create row container from $input") + assertEquals("C:/Users/user/.ideavimrc", rc.filePath) + assertEquals(basePath, rc.basePath) + assertEquals(".ideavimrc", rc.filename) + assertEquals(9, rc.rowNumber) + assertEquals(0, rc.columnNumber) + assertEquals("some matched text", rc.trimmedRow) + } }